web站点崩溃的原因总结归纳
有许多种原因可能导致web站点无法正常工作,这使得系统地检查所有问题变得很困难。下面将集中分析总结导致web站点崩溃的最常见的问题。如果可以解决这些常规问题,那么也将有能力对付出现的一些意外情况。
磁盘已满
导致系统无法正常运行的最可能的原因是磁盘已满。一个好的网络管理员会密切关注磁盘的使用情况,隔一定的时间,就需要将磁盘上的一些负载转存到备份存储介质中(例如磁带)。
日志文件会很快用光所有的磁盘空间。web服务器的日志文件、sql*net的日志文件、 jdbc日志文件,以及应用程序服务器日志文件均与内存泄漏有同等的危害。可以采取措施将日志文件保存在与操作系统不同的文件系统中。日志文件系统空间已 满时web服务器也会被挂起,但机器自身被挂起的几率已大大减低。
c指针错误
用c或c++编写的程序,如web服务器api模块,有可能导致系统的崩溃,因为只要间接引 用指针(即,访问指向的内存)中出现一个错误,就会导致操作系统终止所有程序。另外,使用了糟糕的c指针的java模拟量(analog)将访问一个空的 对象引用。java中的空引用通常不会导致立刻退出jvm,但是前提是程序员能够使用异常处理方法恰当地处理错误。在这方面,java无需过多的关注,但 使用java对可靠性进行额外的度量则会对性能产生一些负面影响。
内存泄漏
c/c++程序还可能产生另一个指针问题:丢失对已分配内存的引用。当内存是在子程序中被分 配时,通常会出现这种问题,其结果是程序从子程序中返回时不会释放内存。如此一来,对已分配的内存的引用就会丢失,只要操作系统还在运行中,则进程就会一 直使用该内存。这样的结果是,曾占用更多的内存的程序会降低系统性能,直到机器完全停止工作,才会完全清空内存。
解决方案之一是使用代码分析工具(如purify)对代码进行仔细分析,以找出可能出现的泄 漏问题。但这种方法无法找到由其他原因引起的库中的泄漏,因为库的源代码是不可用的。另一种方法是每隔一段时间,就清除并重启进程。apache的web 服务器就会因这个原因创建和清除子进程。
虽然java本身并无指针,但总的说来,与c程序相比,java程序使用内存的情况更加糟 糕。在java中,对象被频繁创建,而直到所有到对象的引用都消失时,垃圾回收程序才会释放内存。即使运行了垃圾回收程序,也只会将内存还给虚拟机vm, 而不是还给操作系统。结果是:java程序会用光给它们的所有堆,从不释放。由于要保存实时(just in time,jit)编译器产生的代码,java程序的大小有时可能会膨胀为最大堆的数倍之巨。
还有一个问题,情况与此类似。从连接池分配一个数据库连接,而无法将已分配的连接还回给连接池。一些连接池有活动计时器,在维持一段时间的静止状态之后,计时器会释放掉数据库连接,但这不足以缓解糟糕的代码快速泄漏数据库连接所造成的资源浪费。
进程缺乏文件描述符
如果已为一台web服务器或其他关键进程分配了文件描述符,但它却需要更多的文件描述符,则 服务器或进程会被挂起或报错,直至得到了所需的文件描述符为止。文件描述符用来保持对开放文件和开放套接字的跟踪记录,开放文件和开放套接字是web服务 器很关键的组成部分,其任务是将文件复制到网络连接。默认时,大多数shell有64个文件描述符,这意味着每个从shell启动的进程可以同时打开64 个文件和网络连接。大多数shell都有一个内嵌的ulimit命令可以增加文件描述符的数目。