文件描述符是什麼?和文件句柄有啥區別?
文件描述符是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的配置
能夠限制的資源類型以下:mysql
所建立的內核文件的大小、進程數據塊的大小、Shell 進程建立文件的大小、內存鎖住的大小、常駐內存集的大小、打開文件描述符的數量、分配堆棧的最大大小、CPU 時間、單個用戶的最大線程數、Shell 進程所能使用的最大虛擬內存。同時,它支持硬資源和軟資源的限制。linux
hard和soft的區別: soft是一個警告值,而hard則是一個真正意義的閥值,超過就會報錯,通常狀況下都是設爲同一個值。
第一列表示用戶和組(@開頭)。第二列表示軟限制仍是硬限制,第三列表示限制的資源類型,第四列表示限制的最大值
core是內核文件,nofile是文件描述符,noproc是進程,通常狀況下只限制文件描述符數和進程數就夠了nginx
#<domain> <type> <item> <value>
#redis
#* 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 4sql
# End of fileshell
-----------分割線,上面是配置文件的模板,下面是本身添加的------------------------windows
* soft nofile 655350 #表示任何一個用戶能夠打開的最大的文件描述符數量
* hard nofile 655350安全
* soft nproc 655350 #表示任何一個用戶能夠打開的最大的進程數
* hard nproc 655350服務器
@student hard nofile 65535 #student組中的任何人最多能打開文件描述符數量是65535,而且會在打開65000個時發出警告
@student soft nofile 65000dom
@student hard nproc 50 #student組中的任何人不能擁有超過50個進程,而且會在擁有30個進程時發出警告
@student soft nproc 30
1234567891011121314151617181920212223242526272829
系統級別
一、查看
$ cat /proc/sys/fs/file-max
186405
12
二、設置
臨時性
$ echo 1000000 > /proc/sys/fs/file-max
1
永久性
在/etc/sysctl.conf中設置,應該設什麼值是最佳實踐?好比8G的內存,設爲8192/2 * 256 = 524288
fs.file-max = 1000000
1
進程級別
一、查看,-n默認查看的是soft limit,這個值是從/etc/security/limits.conf文件的* soft nofile 655350來的
$ ulimit -n
170000
12
查看hard limit
$ ulimit -Hn
170000
12
二、設置
臨時性:
經過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 版權聲明:本文爲博主原創文章,轉載請附上博文連接!