為何需要文件描述符?
原因1 – 資源問題:節約內存資源。服務器上,每個打開的文件都需要消耗內存來管理。
原因2 – 安全問題:如果不限制的話,如果發生情況為,啟動一個進程只是無限的創建和打開新的文件,會讓服務器崩潰。
所以限制文件描述符的數量對於linux系統的穩定性是非常重要的。
配置文件
limits.conf文件限制着用戶可以使用的最大文件數,最大線程,最大內存等資源使用量。
除了
/etc/security/limits.conf
,
/etc/security/limits.d/
目錄下,里面配置會覆蓋/etc/security/limits.conf
的配置
可以限制的資源類型如下:
所創建的內核文件的大小、進程數據塊的大小、Shell 進程創建文件的大小、內存鎖住的大小、常駐內存集的大小、打開文件描述符的數量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數、Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。
-
第一列表示用戶和組(@開頭)。第二列表示軟限制還是硬限制,第三列表示限制的資源類型,第四列表示限制的最大值
-
hard和soft的區別: soft是一個警告值,而hard則是一個真正意義的閥值,超過就會報錯,一般情況下都是設為同一個值。
-
core是內核文件,nofile是文件描述符,noproc是進程,一般情況下只限制文件描述符數和進程數就夠了
#<domain> <type> <item> <value> # #* soft core 0 #root hard core 100000 #* hard rss 10000 #@student hard nproc 20 #@faculty soft nproc 20 #@faculty hard nproc 50 #ftp hard nproc 0 #ftp - chroot /ftp #@student - maxlogins 4 # End of file -----------分割線,上面是配置文件的模板,下面是自己添加的------------------------ * soft nofile 655350 #表示任何一個用戶可以打開的最大的文件描述符數量 * hard nofile 655350 * soft nproc 655350 #表示任何一個用戶可以打開的最大的進程數 * hard nproc 655350 @student hard nofile 65535 #student組中的任何人最多能打開文件描述符數量是65535,並且會在打開65000個時發出警告 @student soft nofile 65000 @student hard nproc 50 #student組中的任何人不能擁有超過50個進程,並且會在擁有30個進程時發出警告 @student soft nproc 30
系統級別設置
1、查看系統最大文件描述符
$ cat /proc/sys/fs/file-max 186405
2、設置系統最大文件描述符
臨時性設置
$ echo 1000000 > /proc/sys/fs/file-max
永久性設置
在/etc/sysctl.conf中設置,應該設什么值是最佳實踐?比如8G的內存,設為8192/2 * 256 = 524288
fs.file-max = 1000000
用戶級別設置
1、查看 ulimit命令,-n默認查看的是soft limit,這個值是從/etc/security/limits.conf
文件的* soft nofile 655350
來的
$ ulimit -n 170000
查看hard limit
$ ulimit -Hn 170000
2、設置
臨時性:
通過ulimit -Sn設置最soft limit,注意soft limit必須小於hard limit
$ ulimit -Sn 160000
通過ulimit -Hn設置最Hard limit
$ ulimit -Hn 160000
同時設置soft limit和hard limit。對於非root用戶只能設置比原來小的hard limit。
$ ulimit -n 180000
永久性:
root權限下,在/etc/security/limits.conf中添加如下兩行,*表示所有用戶,重啟生效
* soft nofile 102400 * hard nofile 104800
注意:設置nofile的hard limit還有一點要注意的就是hard limit不能大於/proc/sys/fs/nr_open,假如hard limit大於nr_open,注銷后將無法正常登錄。
查看當前系統使用的打開文件描述符數
$ cat /proc/sys/fs/file-nr 2176 0 2048000
其中第一個數表示當前系統已分配使用的打開文件描述符數,第二個數為分配后已釋放的(目前已不再使用),第三個數等於file-max。
總結
知道了/etc/security/limits.conf中的參數含義之后,那么如何配置nofile,確定nofile的最大值呢
解答:使用ulimt -n命令進行測試,如果小於系統允許的最大值,設置成功,大於最大值,系統會報錯提示。
$ ulimit -n 1100000 -bash: ulimit: open files: cannot modify limit: Operation not permitted $ ulimit -n 1048576 $ ulimit -n 1048577 -bash: ulimit: open files: cannot modify limit: Operation not permitted $ ulimit -n 1048575 $ ulimit -n 1048576
ulimit -a/n/H/S/u 都有什么含義
ulimit -a 顯示當前所有的資源限制 ulimit -H 設置硬件資源限制 ulimit -S 設置軟件資源限制 ulimit -n 設置進程最大打開文件描述符數 ulimit -u <程序數目> 用戶最多可開啟的程序數目
a. 所有進程打開的文件描述符數不能超過/proc/sys/fs/file-max
b. 單個進程打開的文件描述符數不能超過user limit中nofile的soft limit
c. nofile的soft limit不能超過其hard limit
d. nofile的hard limit不能超過/proc/sys/fs/nr_open
鏈接:https://www.jianshu.com/p/47336fcd22da