文件句柄
文章目录
- 文件句柄
- 查看
-
- 用户级别(nofile)
- 单个进程级别(nr_open )
- 系统级别(file-max)
- 修改
-
- 用户级别(nofile)
- 单个进程级别(nr_open )
- 系统级别(file-max)
- 总结
- 参考
tips:
网上说什么的也有,你抄我的我抄你的,也是醉了,故自己综合查阅的资料,根据自己的理解和判断以及部分的实践整理下吧,也不敢保证都是对的,如果有比较大的错误,希望看到这篇文章的你提出来,大家共同进步!
关于什么是文件句柄,这里不做讨论,其实linux中没有文件句柄,叫做文件描述符fd
超过最大句柄限制,报错: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。
代码语言:javascript复制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文件
代码语言:javascript复制fs.nr_open=100000000
运行命令:/sbin/sysctl -p 使配置生效
系统级别(file-max)
- 临时生效(重启失效):
echo 1000000 > /proc/sys/fs/file-max
- 永久生效:
修改文件/etc/sysctl.conf
代码语言:javascript复制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窗口)有关,和单个进程没有关系
参考
https://blog.csdn.net/gatieme/article/details/51058797?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2(最全)
https://www.iteye.com/blog/jameswxx-2096461(官网从来没有说过ulimit是限制用户的单个进程的最大文件数量,限制当前shell以及该shell启动的进程打开的文件数量
)
https://blog.csdn.net/sunny05296/article/details/54952009(ulimit当前shell的当前用户的打开的最大限制
,如果当前用户打开多个shell,则每个shell都能打开该最大值)
https://blog.csdn.net/kobejayandy/article/details/47128349(简明修改句柄)
https://blog.csdn.net/guoxilen/article/details/79401161(临时、永久修改句柄)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180966.html原文链接:https://javaforall.cn