查看进程的文件句柄数

因为linux里面都是文件表示的,默认会有一个1024的设定,也就是最多打开的文件数。当某个进程需要打开非常多文件时,就会报错:Too many open files 异常。

linux系统里有两种文件句柄限制,一种是系统级的,一种是用户级的

比如es。es里面会存储大量的文件,开启进程的时候我们会将文件句柄数更改成65535.
当我们再次进入虚机查看的时候,使用ulimit -n查看的是操作系统默认的句柄数,并不一定是某个进程能够打开文件的个数。
需要这样查看:

1.获取进程pid:ps axu|grep elasticsearch

2.数到当前这个进程已经占用多少文件句柄:ls /proc/$pid/fd | wc -l

3.查看这个进程设置的最大文件句柄: cat /proc/$pid/limits | grep file
具体操作如下:
查看进程的文件句柄数

因为句柄限制分级别,因此我们可以对应修改:

1、系统级

系统级设置对所有用户有效,表示Linux内核分配的系统范围内的最大的文件句柄数(总数)

查看方式:
#cat /proc/sys/fs/file-max(系统的总限制)
#cat /proc/sys/fs/file-nr (系统当前已经使用的文件句柄)

临时修改:
#修改 /proc/sys/fs/file-max 文件的值,重启后失效
#echo 1000000 > /proc/sys/fs/file-max

永久修改:
#修改 /etc/sysctl.conf文件,配置fs.file-max属性
fs.file-max = 6815755
#配置完成后使用 sysctl -p 命令来通知系统启用这项配置

2、用户级

Linux可以限制每个用户的文件句柄数

查看方式:
查看当前有效的句柄数
#ulimit -n

临时修改:
临时设置句柄数只对当前的会话有效,终止时便结束限制
#ulimit -HSn 65536
此时重启需要修改的进程,这时候,这个进程就是当前设定的了,进程一直在就会保持,如果退出后,进程重启,那当前文件句柄就又重新恢复成原来的设定值了。
具体修改变化如下:
原来是4096(上一个图),现在设置成65535了
查看进程的文件句柄数
查看进程的文件句柄数

永久修改这种我就不测试了,因为需要重启虚机:reboot

永久修改:
编辑 /etc/security/limits.conf 文件,加入一下配置

  • soft nofile 4096
  • hard nofile 32768
    *代表所有用户,nofile 是代表最大文件打开数
    soft和hard:将文件句柄限制统一改成软4096,硬32768
    这里涉及另外一个问题,什么是软限制,什么是硬限制
    硬限制是实际的限制,而软限制,是warnning限制,只会做出warning
    其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软
    默认显示的是软限制,如果修改的时候没有加上的话,就是两个一起改
    配置文件最前面的一位是domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制
    修改了,重新登录用ulimit一开就立刻生效了,不过之前启动过的程序要重新启动才能使用新的值。

附: 查看当前进程占用文件描述符情况:
查看进程的所有文件描述符 ,可以很方便看到某个进程开了那些句柄,也可以看到某个文件/目录被什么进程占用了
#lsof -p pid