要知道,在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-max。web
其次是用戶級進程的打開文件數限制。執行: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