您的位置:首页 > 其它

Web站点崩溃常见原因

2015-10-31 16:06 363 查看
一.原因

磁盘已满

C指针错误

内存泄露

进程缺乏文件描述符

线程死锁

服务器超载

数据库中的临时表不够用

二.详细阐述

磁盘已满

导致系统无法正常运行的最可能原因是磁盘已满,所以,网络管理员需经磁盘上的一些负载转存到备份存储介质中(如磁带)。

日志文件会很快用光所有的空间。Web服务器的日志文件、SQL*Net的日志文件、JDBC日志文件,及应用程序服务器日志文件均与内存泄露有同等的危害。日志文件系统空间已满时,Web服务器也会被挂起,但机器自身被挂起的几率已大大减低。

可采取的措施是将日志文件保存在与操作系统不同的文件系统中。

C指针错误

用C或C++编写的程序,如Web服务器API模块,有可能导致系统的崩溃,因为只要间接引用指针(即,访问指向的内存)中出现错误,就会导致操作系统终止所有程序。另外,使用了糟糕的C指针的Java模拟器(analog)将访问一个空的对象引用。

程序员能使用异常处理方法恰当的处理错误,Java中的空引用通常不会导致立即退出JVM。Java无需过多的关注,但使用Java对可靠性进行额外的度量则会对性能产生一些负面影响。

内存泄露

C/C++程序可能产生另一个指针问题:丢失对已分配内存的引用。当内存是在子程序中被分配时,通常会出现此问题,其结果是程序从子程序中返回时不会释放内存。曾占用更多的内存的程序会降低系统性能,直到及其完全停止工作,这才会清空内存。

解决方案:使用代码分析工作(Purify)对代码进行仔细分析,已找出可能出现的泄露问题。但,此方法无法找出由其他原因引起的库中的泄露,因为库的源代码是不可用的。另一方法是,每个一段时间,就清除重启进程。Apache的Web服务器就会因这个原因创建和清除子进程。

虽然Java本是并无指针,但Java程序使用内存的情况更加糟糕。在Java中,对象被频繁创建,直到所有到对象的引用都消失时,垃圾回收程序才会释放内存。即使运行了垃圾回收程序,也只会讲内存还给VM,而不是操作系统。结果是:Java程序会用光给他们的所有堆,从不释放。由于要保存实时(Just in time)编译器产生的所有代码,java程序的大小有时会膨胀为最大堆的数倍之巨。

还有一问题,从连接池分配一个数据库连接,而无法将已分配的链接还回给连接池。一些连接池有活动计时器,在维持一段时间的静止状态之后,计时器会释放掉数据库链接,但这不足以缓解糟糕的代码快速泄露数据库链接所造成的资源浪费。

进程缺乏文件描述符

若已为一台Web 服务器或其他关进进程分配了文件描述符,但它需更多的文件描述符,则服务器或进程会被挂起或报错直到得到所需的文件描述符为止。

文件描述符是用来保持对开放文件或开放套接字的跟踪记录,开放文件或开放套接字是Web服务器很关键的组成部分,其任务是将文件复制到网络连接。默认时,大多数shell有64个文件描述符,意味着每个从shell启动的进程可同时打开64个文件和网络连接。大多数shell都有一个内嵌的ulimit命令可增加文件描述符的数目。

线程死锁

有多线程带来的性能是以可靠性为代价的,主要是可能会产生线程死锁。

在Java代码中增加同步关键字的使用,可减少死锁,但也会影响性能。如果负载过重,数据库内部也可能发生死锁。

如果程序使用了永久锁,如锁文件,而且程序结束时没有解除锁状态,则其他进程可能无法使用这种类型的锁,即不能上锁,也不能解锁。这会进一步导致系统不能正常工作这是必须手动地解锁。

服务器超载

Netscape Web 服务器的每个链接都使用一个线程。Netscape Enterprise Web服务器会在线程用完后挂起,而不为已存在的连接提供任何服务。如果有一种负载分布机制可检测到服务器没有响应,则该服务器上的负载就可分布到其他的服务器上,这可能会致使服务器一个接一个的用光所有的线程。由此一来,整个服务器组都会被挂起。操作系统级别可能还在不断的接收新的连接,而应用服务器(Web服务器)却无法为这些连接提供服务。用户可在浏览器状态行上看到connected的提示消息,但这以后什么也不会发生。

解决问题的一种方法是将obj.conf参数RqThrottle的值设置为线程数目下的某个值,这样若越过RQThrottle的值,就不会接收新的连接。不能连接的服务器静停止工作,而连接上的服务器的响应速度则会变慢,已连接的服务器不会被挂起。文件描述符至少应当被设置为与线程的数据相同的数值,否则,文件描述符将成为一个瓶颈。

数据中的临时表不够用

许多数据库的临时表数目都是固定的,临时表即保留查询结果的内存区域。在临时表中数据都被读取后,临时表会被释放,但大量同时进行的查询可能耗尽数目固定的所有临时表。这时,其他的查询就需要列队等候,知道有临时表被释放才能再继续运行。

此外,还存在一些问题:设置的表空间不够用、序号限制太低,这些都会导致表溢出错误。可对数据库进行监控和建模以帮助解决。

另外,还有诸多因素也极有可能导致Web站点无法工作。如:相关性,子网流量超载、糟糕的设备驱动程序、硬件故障、包括文件的通配符、无意间锁住了关键的表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: