命令可以看到單個進程能夠打開的最大文件句柄數量(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?24204
mysql?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,畢竟打開的文件句柄數越多響應時間肯定會越慢。設定句柄數量后,系統重啟后,又會恢復默認值。如果想永久保存下來,在/etc/security/limits.conf文件中設置最大打開文件數
# 添加如下這行,在文件中的實際配置
* hard nofile 65535
* soft nofile 65535
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
添加如下這行。
* - nofile
2048
這行設置了每個用戶的默認打開文件數為2048。
注意"nofile"項有兩個可能的限制措施。就是項下的hard和soft。 要使修改過得最大打開文件數生效,必須對這兩種限制進行設定。
如果使用"-"字符設定, 則hard和soft設定會同時被設定。
硬限制表明soft限制中所能設定的最大值。 soft限制指的是當前系統生效的設置值。
hard限制值可以被普通用戶降低。但是不能增加。 soft限制不能設置的比hard限制更高。
只有root用戶才能夠增加hard限制值。
當增加文件限制描述,可以簡單的把當前值雙倍。 例子如下, 如果你要提高默認值1024,
最好提高到2048, 如果還要繼續增加, 就需要設置成4096。