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

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

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

 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的使用情況,已分配文件句柄的數目

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

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


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

#查看資源硬限制數
[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中進行設置,可添加如下兩行。

*  soft    nofile          65535

*  hard   nofile          65535

以上設置需要註銷之後重新登錄才能生效:

設置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

1、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

 

2、innodb-open-files

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

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

 

3、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,比較大。

 

4、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中刪掉:

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

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

 

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

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

2、當要打開一個新表,當前的cache也滿了且無法釋放任何一個表時,table cache會臨時加大,
    臨時加大的table cache中的表不用了之後,會被立刻釋放掉。

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章