linux文件句柄数上限_怎么清除文件句柄

2023-05-05 18:46
430
0

超过最大句柄限制,报错:java.io.IOException: Too many open files。

TCP连接也会消耗句柄

查看

用户级别(nofile)

ulimit -n 当前用户的当前session(即当前shell窗口)最大限制 (如果多个shell窗口,每个都能到达最大限制,和单个进程无关

单个进程级别(nr_open )

cat /proc/sys/fs/nr_open linux系统中规定每个进程最大限制

系统级别(file-max)

cat /proc/sys/fs/file-max 系统级别最大限制(所有进程打开的不能超过)

下面的可简单看,可忽略 cat /proc/sys/fs/file-nr 当前系统已经占用的句柄

[root@izm3mkp4g43hdqz ~]# cat /proc/sys/fs/file-nr
1952    0       184294

结果说明:第一个数表示当前系统已分配的文件描述符数(文件句柄数),第二个数为分配后已释放的文件描述符数(当前不再使用的文件描述符数),第三个数为最大文件描述符数,等于file-max。

lsof -n |grep 1549 -c

某个进程已经占用的句柄

修改

用户级别(nofile)

  • 临时生效(重启失效) :
ulimit -n 65535  

修改当前的用户级别的,但是生效范围是当前的session(即当前的shell窗口),即关掉这个窗口,再次打开就不生效了。

  • 永久生效

如何每次都生效? 修改环境变量 将 ulimit -n 65535 加入到 /etc/profile 文件,并source /etc/profile使生效,其实是障眼法,相当于每个用户进来执行一次ulimit -n 65535这个命令

如何更好的每次都生效(推荐)? 修改/etc/security/limits.conf文件

* soft nofile 32768 #限制单个进程最大文件句柄数(到达此限制时系统报警)  
* hard nofile 65536 #限制单个进程最大文件句柄数(到达此限制时系统报错)  
//* 是所有用户的意思 ,也可以改成 xiaoming soft nofile 32768 就是针对于小明用户的

ulimit -Sn 能查看或设置soft limit ulimit -Hn能查看或设置hard limit

ulimit -n默认查看的是soft limit soft limit不能大于hard limit

单个进程级别(nr_open )

cat /proc/sys/fs/nr_open能够查看单个进程级别的 hard limit一定不能大于/proc/sys/fs/nr_open,否则用户注销后无法正常登录。

为什么不能大于?我是这么理解的:当前用户想要操作这个进程的最大文件数,但是你再大也不能超过系统级别的单个进程的限制,即nr_open 如果想要大于怎么办?那就提前修改nr_open的值:

  • 临时生效(重启失效) :
echo 2000000 > /proc/sys/fs/nr_open 
  • 永久生效:

sysctl -w fs.nr_open=100000000 或者 直接写入sysctl.conf文件

fs.nr_open=100000000

运行命令:/sbin/sysctl -p 使配置生效

系统级别(file-max)

  • 临时生效(重启失效):
echo 1000000 > /proc/sys/fs/file-max
  • 永久生效:

修改文件/etc/sysctl.conf

fs.file-max=655350 #限制整个系统最大文件句柄数  

运行命令:/sbin/sysctl -p 使配置生效

总结

  • 大小顺序、关系

用户级别<单个进程级别<系统级别 即 nofile>nr_file<file-max

用户级别(nofile)中: safe limit<hard limit 而 hard limit <nr_file

所以完整: safe limit<hard limit<nr_file<file-max

  • 误区

用户级别(nofile)即,ulimit命令,只和当前用户当前session(当前shell窗口)有关,和单个进程没有关系

全部评论