post by
Holmesian / 2011-5-7 10:36 Saturday
五一的时候yycrazy本来准备对服务器上的应用进行一次分离操作,但是由于极差的网络性能铩羽而归。自从五一过后服务器一直处于极度不稳定状态:系统不定期并且毫无征兆的所有phpcgi进程突然卡死导致CPU负载飙升并导致全站所有动态内容访问很慢且最终全线奔溃。
一开始找了很多资料尝试了很多方法都没有明显的好转,因为没有任何一定的触发条件,并且所有等级的日志和监控都无法记录任何蛛丝马迹,所以一时很难做出准确判断。无意之中在网上看到有TX反应Discuz X 1.5在nginx+php-cgi环境下使用manyou应用的时候很容易导致php-cgi进程高负载运作大量消耗CPU资源,于是尝试将开启的Discuz X1.5的manyou应用关闭,发现问题有很大的缓解,本来以为已经解决了,但是第二天凌晨时再度出现毫无征兆的所有phpcgi进程突然卡死让我无奈地之后从更底层的角度去考录解决的办法。
经过漫长的排查与测试最终发现问题出在/boot/loader.conf中的设置上,一开始安装FreeBSD的时候顺手copy了之前的一份优化过的loader.conf配置的一部分,里面有一个参数 kern.ipc.nmbclusters="0" ,本来只是将nmbclusters设置成无限制,但是问题就出在只copy了一部分:因为kern.ipc.nmbclusters被设置成 0 的情況下,net.inet.tcp.reass.maxsegments 参数也跟着一同被设置成 0 了。net.inet.tcp.reass.maxsegments被设置成0之后在有大量 TCP out-of-order 封包的网络情况下,FreeBSD的性能将会变得极差而且整个系统会非常的脆弱,在出现问题的时候用netstat查看连接信息可以发现packets discarded due to memory problems的计数相当之多而 TCP out-of-order的计数永远为0。
阅读全文>>