Linux最大文件數限制的那些事

要知道,在linux的世界裏,一切皆文件.所以要實現大的併發量的第一步,修改linux系統的文件標識符限制數,也就是文件打開數量的限制html

首先,內核級的總限制 fs.file-max
mysql

 man proc 裏有這麼一段話
  /proc/sys/fs/file-max
              This  file  defines  a  system-wide  limit on the number of open
              files for all processes.  (See also setrlimit(2), which  can  be
              used  by  a process to set the per-process limit, RLIMIT_NOFILE,
              on the number of files it may open.)  If you get lots  of  error
              messages  about running out of file handles, try increasing this
              value:

              echo 100000 > /proc/sys/fs/file-max
#查看限制數 fs.file-max
[root@web01]# sysctl fs.file-max
fs.file-max = 65535
#修改限制數
[root@web01]# sysctl -w fs.file-max=6553500
fs.file-max = 6553500
須要永久生效則 echo "fs.file-max=6553500" >>/etc/sysctl.conf

/proc/sys/fs/file-nr 記錄了系統中fd的使用狀況,已分配文件句柄的數目
linux

[root@web01]# sysctl fs.file-nr
fs.file-nr = 960        0       6553500

其中第一個數表示當前系統已分配使用的打開文件描述符數,第二個數爲分配後已釋放的(目前已再也不使用),第三個數等於file-maxweb


其次是用戶級進程的打開文件數限制。執行:sql

#查看資源硬限制數
[root@web01]# ulimit  -Hn
4096
#查看資源軟限制數
[root@web01]# ulimit  -Sn #或 ulimit -n
1024
#修改限制數
[root@web01]# ulimit -n 204800


經過ulimit -Sn設置最大打開文件描述符數的soft limit,注意soft limit不能大於hard limit(ulimit -Hn可查看hard limit),另外ulimit -n默認查看的是soft limit,可是 ulimit -n 204800 則會同時設置soft limit和hard limit。對於非root用戶只能設置比原來小的hard limit



若要使修改永久有效,則須要在/etc/security/limits.conf中進行設置,可添加以下兩行。shell

*  soft    nofile          65535緩存

*  hard   nofile          65535bash

以上設置須要註銷以後從新登陸才能生效:服務器

設置nofile的hard limit還有一點要注意的就是hard limit不能大於/proc/sys/fs/nr_open,假如hard limit大於nr_open,註銷後沒法正常登陸。能夠修改nr_open的值: echo 2000000 > /proc/sys/fs/nr_open併發


相關介紹:

ulimit -a 用來顯示當前的各類用戶進程限制。
Linux對於每一個用戶,系統限制其最大進程數。爲提升性能,能夠根據設備資源狀況,設置各linux 用戶的最大進程數,下面我把某linux用戶的最大進程數設爲10000個:
ulimit -u 10000
對於須要作許多 socket 鏈接並使它們處於打開狀態的Java 應用程序而言,最好經過使用 ulimit -n xx 修改每一個進程可打開的文件數,缺省值是 1024。
ulimit -n 4096 將每一個進程能夠打開的文件數目加大到4096,缺省爲1024
其餘建議設置成無限制(unlimited)的一些重要設置是:
數據段長度:ulimit -d unlimited
最大內存大小:ulimit -m unlimited
堆棧大小:ulimit -s unlimited
CPU 時間:ulimit -t unlimited
虛擬內存:ulimit -v unlimited
公 司服務器須要調整 ulimit的stack size 參數調整爲unlimited 無限,使用ulimit -s unlimited時只能在當時的shell見效,重開一個shell就失效了。。因而得在/etc/profile 的最後面添加ulimit -s unlimited 就能夠了,source /etc/profile使修改文件生效。
若是你碰到相似的錯誤提示ulimit: max user processes: cannot modify limit: 不容許的操做 ulimit: open files: cannot modify limit: 不容許的操做
爲啥root用戶是能夠的?普通用戶又會遇到這樣的問題?
看一下/etc/security/limits.conf大概就會明白。
linux對用戶有默認的ulimit限制,而這個文件能夠配置用戶的硬配置和軟配置,硬配置是個上限。
超出上限的修改就會出「不容許的操做」這樣的錯誤。
在limits.conf加上
*        soft    noproc 10240
*        hard    noproc 10240
*        soft    nofile 10240
*        hard    nofile 10240
就是限制了任意用戶的最大線程數和文件數爲10240。

還有就是應用自身設定的限制

例如MySQL層的幾個參數:open-files-limit、innodb-open-files、table-open-cache、table-definition-cache

一、open-files-limit
它限制了mysqld進程可持有的最大打開文件數,至關因而一個小區的總電閘,一旦超限,小區裏全部住戶都得停電。
5.6.7(含)之前,默認值0,最大和OS內核限制有關;
5.6.8(含)之後,默認值會自動計算,最大和OS內核限制有關。

在5.6.8及之後,其自動計算的幾個限制規則見下,哪一個計算結果最大就以哪一個爲上限:

1) 10 + max_connections + (table_open_cache * 2)
2) max_connections * 5
3) open_files_limit value specified at startup, 5000 if none

 

二、innodb-open-files

限制InnoDB引擎中表空間文件最大打開的數量,至關於本身家中電箱裏的某個電路保險,該電路短路的話,會自動跳閘,而不會影響其餘電路,去掉短路源後從新按上去就可使用。

其值最低20,默認400,只計算了包含ibdata*、ib_logfile*、*.ibd 等三類文件,redo log不計算在內,5.6之後可獨立undo log,我還未進行測試,應該也不會被計算在內,有興趣的朋友可驗證下。

 

三、table-definition-cache

該cache用於緩存 .frm 文件,該選項也預示着 .frm 文件同時可打開最大數量。
5.6.7 之前默認值400;
5.6.7 以後是自動計算的,且最低爲400,自動計算公式:400 + (table-open-cache / 2)。

對InnoDB而言,該選項只是軟性限制,若是超過限制了,則會根據LRU原則,把舊的條目刪除,加入新的條目。

此外,innodb-open-files 也控制着最大可打開的表數量,和 table-definition-cache 都起到限制做用,以其中較大的爲準。若是沒配置限制,則一般選擇 table-definition-cache 做爲上限,由於它的默認值是 200,比較大。

 

四、table-open-cache

該cache用於緩存各類全部數據表文件描述符。
5.6.7 之前,默認值400,範圍:1 – 524288;
5.6.8 – 5.6.11,默認值2000,範圍:1 – 524288;
5.6.12之後,默認值2000(且能自動計算),範圍:1 – 524288。

 

補充說明1:關於如何計算表文件描述符的建議:

table-open-cache 一般和 max-connections 有關係,建議設置爲 max_connections * N,N的值爲平均每一個查詢中可能總共會用到的表數量,同時也要兼顧可能會產生臨時表。

 

補充說明2:MySQL會在下列幾種狀況把表從table cache中刪掉:

一、table cache已滿,而且正要打開一個新表時;
二、table cache中的條目數超過 table_open_cache 設定值,而且有某些表已經長時間未訪問了;

三、執行刷新表操做時,例如執行 FLUSH TABLES,或者 mysqladmin flush-tables 或 mysqladmin refresh

 

補充說明3:MySQL採用下述方法來分配table cache:

一、當前沒在用的表會被釋放掉,從最近最少使用的表開始;

二、當要打開一個新表,當前的cache也滿了且沒法釋聽任何一個表時,table cache會臨時加大,
    臨時加大的table cache中的表不用了以後,會被馬上釋放掉。

 

轉載整理自 http://imysql.com/2015/07/30/mysql-faq-howto-calculate-open-files.shtml

相關文章
相關標籤/搜索