linux 文件描述符

文件描述符是什麼?和文件句柄有啥區別?
文件描述符是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 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索