linux下修改進程開啟檔案數限使用ulimit -a查看相關訊息。
1,linux 預設的進程開啟檔案上限是1024個,可以通過ulimit -n查看。很多系統上限可以通過修改/etc/security/limits.conf檔案改變,這個檔案有詳細的注釋,對如何修改做了說明。如果希望把所有使用者的進程開啟檔案上限改為65536,可以加入下面兩行
* soft nofile 8192
* hard nofile 8192
還可以只真對某個使用者或某個組做修改,具體方法參見檔案注釋。修改後需要重新啟動系統才會生效
或者
ulimit -HSn 8192
2,在Linux核心2.2.x中可以用如下命令修改:
# echo '8192' >; /proc/sys/fs/file-max
# echo '32768' >; /proc/sys/fs/inode-max
並將以上命令加到/etc/rc.c/rc.local檔案中,以使系統每次重新啟動時配置以上值。
3,在Linux下,我們使用ulimit -n命令可以看到單個進程能夠開啟的最大檔案控制代碼數量(socket串連也算在裡面)。系統預設值1024。
對於一般的應用來說(象Apache、系統進程)1024完全足夠使用。但是如何象squid、mysql、java等單進程處理大量請求的應用來說就有點捉襟見肘了。如果單個進程開啟的檔案控制代碼數量超過了系統定義的值,就會提到“too many files open”的錯誤提示。如何知道當前進程開啟了多少個檔案控制代碼呢?下面一段小指令碼可以幫你查看:lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more 在系統訪問高峰時間以root使用者執行上面的指令碼,可能出現的結果如下:# lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more 131 24204 57 24244 57 24231 56 24264 其中第一列是開啟的檔案控制代碼數量,第二列是進程號。得到進程號後,我們可以通過ps命令得到進程的詳細內容。ps -aef|grep 24204mysql 24204 24162 99 16:15 ? 00:24:25 /usr/sbin/mysqld 哦,原來是mysql進程開啟最多檔案控制代碼數量。但是他目前只開啟了131個檔案控制代碼數量,遠遠底於系統預設值1024。 但是如果系統並發特別大,尤其是squid伺服器,很有可能會超過1024。這時候就必須要調整系統參數,以適應應用變化。Linux有硬性限制和軟性限制。可以通過ulimit來設定這兩個參數。方法如下,以root使用者運行以下命令:ulimit -HSn 4096 以上命令中,H指定了硬性大小,S指定了軟性大小,n表示設定單個進程最大的開啟檔案控制代碼數量。個人覺得最好不要超過4096,畢竟開啟的檔案控制代碼數越多回應時間肯定會越慢。設定控制代碼計數後,系統重啟後,又會恢複預設值。如果想永久儲存下來,可以修改.bash_profile檔案,可以修改 /etc/profile 把上面命令加到最後