Linux下查看进程打开的文件句柄数(open files)

背景:平台调用算法出现异常,查看数据库调用错误状态码是499
499:(客户端主动关闭请求);客户端向服务端发起请求,服务器端处理的时间过长,超出了客户端的超时时间,客户端主动断开连接。  
## 这个报错表明请求已经打到了后端算法,只是后端算法请求太多导致的,迟迟没有响应客户端并返回结果而导致断开连接,此时可以增加服务后端节点数分摊压力或者增加文件句柄数(增加文件句柄数可以让算法接收更多的请求)

一、查看系统最大句柄数

Linux 中,单个进程能够打开的最大文件句柄数量是可以配置的,系统默认是 1024。当单个进程打开的文件句柄数量超过了系统定义的值,就会出现“Too many files open”的错误提示。用户可以通过以下命令查看系统定义的最大值:

#查看文件句柄
[root@localhost ~]# ulimit -a
#查看当前进程打开了多少句柄数:
[root@localhost ~]# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more 
131 24204 
57 24244   
57 24231 ......
?
其中第一列是打开的句柄数,第二列是进程ID。可以根据ID号来查看进程名:
[root@localhost ~]# ps aef|grep 24204
nginx  24204 24162 99 16:15 ?    00:24:25 /usr/local/nginx/sbin/nginx -s

二、修改文件句柄

#对于一般的应用程序而言 1024 已经完全够用了,但是有些进程处理大量请求,很有可能 1024 就不够用了,则需要调整系统参数,一般可以设置4096、65535或者102400,设置的太高会影响性能,并不是想设置多高就多高,毕竟打开的文件句柄数越多响应时间肯定会越慢
#临时生效
[root@localhost ~]# ulimit -n 4096
#永久生效法一:把这个临时生效的命令放在.bashrc或者.bash_profile配置文件里就可以永久生效了
[root@localhost ~]# echo "ulimit -n 4096" >> ~/.bashrc 
#永久生效法二
[root@localhost ~]# vim /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535

提示:* 表示所用的用户,但有的系统不认, 需要具体的用户名, 比如:
root soft nofile 65535
root hard nofile 65535
重新登录验证,或reboot后验证。

三、修改max user processes进程数

#临时生效
[root@localhost ~]# ulimit -u 65536
#永久生效
[root@localhost ~]# vim /etc/security/limits.conf
* soft nproc 65536
* hard nproc 65536

四、查看系统最大打开文件描述符数量

[root@localhost ~]# cat /proc/sys/fs/file-max  #查看系统最大打开文件描述符数量
180965
[root@localhost ~]# echo "1000000" > /proc/sys/fs/file-max   #临时设置该值
?
#永久性设置,需要在/etc/sysctl.conf中设置,并让它生效:
[root@localhost ~]# echo "fs.file-max = 1000000" >> /etc/sysctl.conf 
[root@localhost ~]# sysctl -p
fs.file-max = 1000000
总结:所有进程打开的文件描述符数量不能超过/proc/sys/fs/file-max。单个进程打开的文件描述符数不能超过user limit中nofile的soft limit。nofile的soft limit不能超过其hard limit。