Linux文件句柄限制總結

文件句柄


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。

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窗口)有關,和單個進程沒有關係

參考

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(臨時、永久修改句柄)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章