1 磁盘已满程序员
致使系统没法正常运行的最可能的缘由是磁盘已满。一个好的网络管理员会密切关注磁盘的shell
使用状况,隔必定的时间,就须要将磁盘上的一些负载转存到备份存储介质中(例如磁带)
。数据库
日志文件会很快用光全部的磁盘空间。Web服务器的日志文件、SQL*Net的日志文件、编程
JDBC日志文件,以及应用程序服务器日志文件均与内存泄漏有同等的危害。能够采起措施将日志文件浏览器
保存在操做系统不一样的文件系统中。日志文件系统空间已满时Web服务器也会被挂起,但机器自身被挂起的概率已大大减低。服务器
2 C指针错误网络
用C或C++编写的程序,如Web服务器API模块,有可能致使系统的崩溃,多线程
由于只要间接引用指针(即,访问指向的内存)中出现一个错误,就会致使操做系统终止全部程序。另外,使工具
用了糟糕的C指针的Java模拟量(analog)将访问一个空的对象引用。Java中的空引用一般性能
不会致使马上退出JVM,可是前提是程序员可以使用异常处理方法恰当地处理错误。在这方面,
Java无需过多的关注,但使用Java对可靠性进行额外的度量则会对性能产生一些负面影响。
3 内存泄漏
C/C++程序还可能产生另外一个指针问题:丢失对已分配内存的引用。当内存是在子程序中被
分配时,一般会出现这种问题,其结果是程序从子程序中返回时不会释放内存。如此一来,对已分配的内存的引用就会丢失,
只要操做系统还在运行中,则进程就会一直使用该内存。这样的结果是,曾占用更多的内存的程序会下降系统性能,直到机器彻底中止
工做,才会彻底清空内存。
4进程缺少文件描述符
若是已为一台Web服务器或其余关键进程分配了文件描述符,但它却须要更多的文件描述符,则服务器或进程会被挂起或报错,直至获得了所需的文件描述符为止。
文件描述符用来保持对开放文件和开放套接字的跟踪记录,开放文件和开放套接字是Web服务器很关键的组成部分,其任务是将文件复制到网络链接。默认时,大多数
shell有64个文件描述符,这意味着每一个从shell启动的进程能够同时打开64个文件和网络链接。大多数shell都有一个内嵌的ulimit命令能够增长文件描述符的数目。
5 线程死锁
由多线程带来的性能改善是以可靠性为代价的,主要是由于这样有可能产生线程死锁。线程死锁时,第一个线程等待第二个线程释放资源,
而同时第二个线程又在等待第一个线程释放资源。咱们来想像这样一种情形:在人行道上两我的迎面相遇,为了给对方让道,两人同时向一侧迈出一步,双方没法经过,又同时向另外一侧迈出一步,
这样仍是没法经过。双方都以一样的迈步方式堵住了对方的去路。假设这种状况一直持续下去,这样就不难理解为什么会发生死锁现象了。
解决死锁没有简单的方法,这是由于使线程产生这种问题是很具体的状况,并且每每有很高的负载。大多数软件测试产生不了足够多的负载,因此不可能暴露全部的线程错误。
在每一种使用线程的语言中都存在线程死锁问题。因为使用Java进行线程编程比使用C容易,因此Java程序员中使用线程的人数更多,线程死锁也就愈来愈广泛了。能够在
Java代码中增长同步关键字的使用,这样能够减小死锁,但这样作也会影响性能。若是负载太重,数据库内部也有可能发生死锁。
若是程序使用了永久锁,好比锁文件,并且程序结束时没有解除锁状态,则其余进程可能没法使用这种类型的锁,既不能上锁,也不能解除锁。这会进一步致使系统不能正常工做。这时必须手动地解锁。
6 服务器超载
Netscape Web服务器的每一个链接都使用一个线程。Netscape Enterprise Web服务器会在线程用完后挂起,而不为已存在的链接提供任何服务。
若是有一种负载分布机制能够检测到服务器没有响应,则该服务器上的负载就能够分布到其它的Web服务器上,这可能会导致这些服务器一
个接一个地用光全部的线程。这样一来,整个服务器组都会被挂起。操做系统级别可能还在不断地接收新的链接,而应用程序(Web服务器)却没法为这些链接提供服务。用户能够在浏览器
状态行上看到connected(已链接)的提示消息,但这之后什么也不会发生。
解决问题的一种方法是将obj.conf参数RqThrottle的值设置为线程数目之下的某个数值,这样若是越过RqThrottle的值,就不会接收新的链接。那些不能链接的服务器将会中止工做,而
链接上的服务器的响应速度则会变慢,但至少已链接的服务器不会被挂起。这时,文件描述符至少应当被设置为与线程的数目相同的数值,不然,文件描述符将成为一个瓶颈。
7 数据库中的临时表不够用
许多数据库的临时表(cursor)数目都是固定的,临时表即保留查询结果的内存区域。在临时表中的数据都被读取后,临时表便会被释放,但大量同时进行的查询可能耗尽数目固定的全部
临时表。这时,其余的查询就须要列队等候,直到有临时表被释放时才能再继续运行。这是一个不容易被程序员发觉的问题,但会在负载测试时显露出来。但可能对于数据库管理员(
DataBase Administrator,DBA)来讲,这个问题十分明显。
此外,还存在一些其余问题:设置的表空间不够用、序号限制过低,这些都会致使表溢出错误。这些问题代表了一个好的DBA对用于生产的数据库设置和性能进行按期检查的重要性。而
且,大多数数据库厂商也提供了监控和建模工具以帮助解决这些问题。
另外,还有许多因素也极有可能致使Web站点没法工做。如:相关性、子网流量超载、糟糕的设备驱动程序、硬件故障、包括错误文件的通配符、无心间锁住了关键的表。