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系統(tǒng)中規(guī)定每個進程最大限制
系統(tǒng)級別(file-max)
cat /proc/sys/fs/file-max 系統(tǒng)級別最大限制(所有進程打開的不能超過)
下面的可簡單看,可忽略
cat /proc/sys/fs/file-nr 當前系統(tǒng)已經占用的句柄
結果說明:第一個數表示當前系統(tǒng)已分配的文件描述符數(文件句柄數),第二個數為分配后已釋放的文件描述符數(當前不再使用的文件描述符數),第三個數為最大文件描述符數,等于file-max。
lsof -n |grep 1549 -c某個進程已經占用的句柄
修改
用戶級別(nofile)
-
臨時生效(重啟失效) : ulimit -n 65535
修改當前的用戶級別的,但是生效范圍是當前的session(即當前的shell窗口),即關掉這個窗口,再次打開就不生效了。
-
永久生效
如何每次都生效?
修改環(huán)境變量 將 ulimit -n 65535 加入到 /etc/profile 文件,并source/etc/profile使生效,其實是障眼法,相當于每個用戶進來執(zhí)行一次ulimit -n 65535這個命令
如何更好的每次都生效(推薦)?
修改/etc/security/limits.conf文件
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,否則用戶注銷后無法正常登錄。
為什么不能大于?我是這么理解的:當前用戶想要操作這個進程的最大文件數,但是你再大也不能超過系統(tǒng)級別的單個進程的限制,即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 使配置生效
系統(tǒng)級別(file-max)
-
臨時生效(重啟失效):
echo 1000000 > /proc/sys/fs/file-max
-
永久生效:
修改文件/etc/sysctl.conf
fs.file-max=655350 #限制整個系統(tǒng)最大文件句柄數
運行命令:/sbin/sysctl -p 使配置生效
總結
-
大小順序、關系
用戶級別<單個進程級別<系統(tǒng)級別 即 nofile>nr_file<file-max
用戶級別(nofile)中: safe limit<hard limit 而 hard limit <nr_file
所以完整:
safe limit<hard limit<nr_file<file-max -
誤區(qū)
用戶級別(nofile)即,ulimit命令,只和當前用戶當前session(當前shell窗口)有關,和單個進程沒有關系
總結
以上是生活随笔為你收集整理的Linux文件句柄限制总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty事件传播机制
- 下一篇: linux 其他常用命令