文件描述符是什么?和文件句柄有啥區別?
文件描述符是linux/unix操作系統中特有的概念。相當於windows系統中的文件句柄。一個意思不同叫法。
Linux系統中, 每當進程打開一個文件時,系統就為其分配一個唯一的整型文件描述符,用來標識這個文件。標准C中每個進程默認打開的有三個文件,標准輸入,標准輸出,標准錯誤,分別用一個FILE結構的指針來表示,即stdin,stout,sterr,這三個結構分別對應着三個文件描述符0,1,2。
文件描述符是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。第一個打開的文件是0,第二個是1,依此類推。linux 操作系統通常對每個進程l能打開的文件數量有一個限制。
linux系統對文件描述符的限制有兩個級別
系統級別,使用cat /proc/sys/fs/file-max查看,默認值是根據內存大小,系統自動設置的,一般為內存大小(KB)的10%,shell下可以這樣計算grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'(可能有各種其他原因導致file-max沒有設置為內存的10%)
進程級別(也叫用戶級別),默認是1024,使用ulimit -n查看
為什么要限制打開的文件描述符?
原因1 – 資源問題:每個打開的文件都需要消耗內存來管理,而內存是有限的。
原因2 – 安全問題:如果不限制的話,有不懷好心的人啟動一個進程來無限的創建和打開新的文件,會讓服務器崩潰。
所以限制文件描述符的數量對於linux系統的穩定性是非常重要的。
配置文件
限制資源使用的配置文件是 /etc/security/limits.conf,和/etc/security/limits.d/目錄,/etc/security/limits.d/里面配置會覆蓋/etc/security/limits.conf的配置
可以限制的資源類型如下:
所創建的內核文件的大小、進程數據塊的大小、Shell 進程創建文件的大小、內存鎖住的大小、常駐內存集的大小、打開文件描述符的數量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數、Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。
hard和soft的區別: soft是一個警告值,而hard則是一個真正意義的閥值,超過就會報錯,一般情況下都是設為同一個值。
第一列表示用戶和組(@開頭)。第二列表示軟限制還是硬限制,第三列表示限制的資源類型,第四列表示限制的最大值
core是內核文件,nofile是文件描述符,noproc是進程,一般情況下只限制文件描述符數和進程數就夠了
#
#
#* 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
1234567891011121314151617181920212223242526272829
系統級別
1、查看
$ cat /proc/sys/fs/file-max
186405
12
2、設置
臨時性
$ echo 1000000 > /proc/sys/fs/file-max
1
永久性
在/etc/sysctl.conf中設置,應該設什么值是最佳實踐?比如8G的內存,設為8192/2 * 256 = 524288
fs.file-max = 1000000
1
進程級別
1、查看,-n默認查看的是soft limit,這個值是從/etc/security/limits.conf文件的* soft nofile 655350來的
$ ulimit -n
170000
12
查看hard limit
$ ulimit -Hn
170000
12
2、設置
臨時性:
通過ulimit -Sn設置最soft limit,注意soft limit必須小於hard limit
$ ulimit -Sn 160000
1
通過ulimit -Hn設置最Hard limit
$ ulimit -Hn 160000
1
同時設置soft limit和hard limit。對於非root用戶只能設置比原來小的hard limit。
ulimit -n 180000
1
永久性:
root權限下,在/etc/security/limits.conf中添加如下兩行,*表示所有用戶,重啟生效
* soft nofile 102400
* hard nofile 104800
123
注意:設置nofile的hard limit還有一點要注意的就是hard limit不能大於/proc/sys/fs/nr_open,假如hard limit大於nr_open,注銷后將無法正常登錄。
查看系統當前打開的文件描述符數量
其中第一個數表示當前系統分配后已使用的文件描述符數,第二個數表示分配后為使用的(內核2.6版本中這個值總是為0,這並不是一個錯誤,它意味着已經分配的文件描述符總會被使用),第三個數等於file-max。
$ sudo cat /proc/sys/fs/file-nr
2176 0 2048000
12
查看某個進程打開的文件描述符數量
$ lsof -p 20262 |wc -l
5
12
根據用戶創建的進程數排序
ps h -Led -o user | sort | uniq -c | sort -n
1 chrony
1 dbus
1 hanli
1 hanli2
1 nginx
2 postfix
4 named
4 puppet
6 polkitd
6 redis
21 mysql
125 root
1234567891011121314
總結
/proc/sys/fs/file-max限制不了/etc/security/limits.conf
只有root用戶才有權限修改/etc/security/limits.conf
對於非root用戶, /etc/security/limits.conf會限制ulimit -n,但是限制不了root用戶
對於非root用戶,ulimit -n只能越設置越小,root用戶則無限制
任何用戶對ulimit -n的修改只在當前環境有效,退出后失效,重新登錄新來后,ulimit -n由limits.conf決定
如果limits.conf沒有做設定,則默認值是1024
當前環境的用戶所有進程能打開的最大問價數量由ulimit -n決定
---------------------
作者:fanren224
來源:CSDN
原文:https://blog.csdn.net/fanren224/article/details/79971359
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!