之前测试遇到了"too many open files"的问题。ulimit -Hn 查了下发现server上最大open file数是4096。写了个简单的脚本检测发现进程创建的fd个数在不断增加,8分钟之后达到上限然后程序报错,其中绝大部分fd都是关于socket的。
在server上安装lsof查看当前进程打开文件,并定位出现频率最高的通信主机和端口。最后发现是一个Java程序bug,每两秒执行一次的方法会不断创建新的httpclient。修正bug后进程创建的fd数稳定在24。
lsof -i -a -p $PID 可以列出进程打开的所有network files。所用的简单检测脚本为
#!/bin/bash cd /proc/$(ps -ef | grep appName | grep -v grep | awk '{print $2}')/fd while true do ls -l | grep socket | wc -l sleep 5 done