對於通常的應用來講(象Apache、系統進程)1024徹底足夠使用。可是如何象squid、mysql、java等單進程處理大量請求的應用來講就有點捉襟見肘了。若是單個進程打開的文件句柄數量超過了系統定義的值,就會提到「too many files open」的錯誤提示。如何知道當前進程打開了多少個文件句柄呢?下面一段小腳本能夠幫你查看:java
lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more
執行上述的腳本可能出現以下的結果: mysql
131 24204 57 24244 57 24231 56 24264
其中,第一行是打開的文件句柄數量,第二行是進程號。獲得進程號後,咱們能夠經過ps命令獲得進程的詳細內容。sql
ps -aef|grep 24204 mysql 24204 24162 99 16:15 ? 00:24:25 /usr/sbin/mysqld
哦,原來是mysql進程打開最多文件句柄數量。可是他目前只打開了131個文件句柄數量,遠遠底於系統默認值1024。shell
可是若是系統併發特別大,尤爲是squid服務器,頗有可能會超過1024。這時候就必需要調整系統參數,以適應應用變化。Linux有硬性限制和軟性限制之分。能夠經過ulimit來設定這兩個參數。方法以下,以root用戶運行如下命令(某些系統不容許普通用戶修改ulimit的軟/硬限制):服務器
ulimit -HSn 4096
以上命令中,H指定了硬性大小,S指定了軟性大小,n表示設定單個進程最大的打開文件句柄數量。我的以爲最好不要超過4096,畢竟打開的文件句柄數越多響應時間確定會越慢。設定句柄數量後,系統重啓後,又會恢復默認值。若是想永久保存下來,在/etc/security/limits.conf文件中設置最大打開文件數併發
* hard nofile 2048 * soft nofile 2048
或者socket
* - nofile 2048
這行設置了每一個用戶的默認打開文件數爲2048。 注意"nofile"項有兩個可能的限制措施, 就是hard和soft。 要使修改過的最大打開文件數生效,必須對這兩種限制進行設定。 若是使用減號字符(-)設定定, 則hard和soft設定會同時被設定。重啓生效。ui
硬限制代表soft限制中所能設定的最大值。 soft限制指的是當前系統生效的設置值。 hard限制值能夠被普通用戶下降, 可是不能增長。 soft限制不能設置的比hard限制更高。 只有root用戶纔可以增長hard限制值。code
當增長文件限制描述,能夠簡單的把當前值雙倍。 例子以下, 若是你要提升默認值1024, 最好提升到2048, 若是還要繼續增長, 就須要設置成4096。進程