文件句柄
文章目錄
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
系統級別(file-max)
- 臨時生效(重啓失效):
echo 1000000 > /proc/sys/fs/file-max
- 永久生效:
修改文件/etc/sysctl.conf
fs.file-max=655350 #限制整個系統最大文件句柄數
總結
- 大小順序、關係
用戶級別<單個進程級別<系統級別
即 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(臨時、永久修改句柄)