线上遇到很多打印 open too many files 异常
1:首先看下是否是系统限制导致的
ulimit -a
open files 查看linux系统允许单进程打开的最大句柄数
2: 如果系统限制的打开句柄过低,可以通过如下设置:
vim /etc/security/limits.conf
#在最后加入
- soft nofile 65535
- hard nofile 65535
3:统计进程打开的句柄数:
通过这个可以知道是哪个进程导致的
lsof -p 进程id|wc -l
4: 查看进程打开的每一个句柄都做了什么
strace -tt -T -v -f -e trace=file -o /hskj/tmp/strace.log -s 1024 -p 进程id
-tt 在每行输出的前面,显示毫秒级别的时间
-T 显示每次系统调用所花费的时间
-v 对于某些相关调用,把完整的环境变量,文件stat结构等打出来。
-f 跟踪目标进程,以及目标进程创建的所有子进程
-e 控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称
-o 把strace的输出单独写到指定的文件
-s 当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节
-p 指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。
5: 查看进程都打开了哪些句柄,以及哪些句柄一直不消失
less /proc/14195/fd
6:通过一直不消失的句柄号,再结合strace的文件,查看这个句柄是什么操作,可以通过观察对应的端口号,来判断是什么代码。我们这个问题的代码是8010,对应的用来接收http协议状态报告和上行的端口,定位到具体的jetty,然后查看对应的参数配置,发现了之前解决过jetty的一个bug,改完参数后,重启发送端,句柄恢复正常。
Jetty使用需要注意的点: