高并发环境中可能会有socket不够用的情况出现,最简单的方法是增加可打开的文件数,我的centos5.8中系统默认的值是1024,也就是最多打开1024个文件描述符,可以把这个值增大,比如增加到102400
ulimit -n 102400
这个方法可行,但感觉不够好,因为被占用的资源依然耗在哪里,除非调用了close进行关闭释放。
发现kernel中有一些参数是跟相关的,在/etc/sysctl.conf中,可以增加这么两个设置
net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1
这两个在默认情况下的值都是0,也就是disabled。通过名字可以看到,一个是重用,一个是回收,这两个都是对长时间处于TIME_WAIT状态的socket进行处理,可以减轻服务器的一些负担。
一些注意情况,tcp_tw_recycle如果打开,可能会影响到一些failover的功能,说不定就把你需要的一些重要的socket给干掉了。tcp_tw_reuse对一些大量的瞬时连接可能作用不大,比如一个web server,主要还是针对时间较长的TIME_WAIT的socket。