解決Too many open files問題

當用linux做高併發服務器時,會遇到"Too many open files"的錯誤。

Linux是有文件句柄限制的(open files),而且Linux默認不是很高,一般都是1024,做高併發生產服務器用其實很容易就達到這個數量。

在linux中執行ulimit -a 即可查詢linux相關的參數,如下所示:

ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 63470
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 102400
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

用ulimit命令是可以修改這些配置的

命令的格式:ulimit [-SHacdefilmnpqrstuvx] [limit]

中間的參數對應這要修改的項目。

默認最大打開文件數(open files)最大數爲1024,修改:

ulimit -n 102400

最大值爲655350

命令參數:

-H 設置硬件資源限制.
-S 設置軟件資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩衝區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
unlimited 是一個特殊值,用於表示不限制

ulimit命令的特點:

1.只對當前tty(終端有效),若要每次都生效的話,可以把ulimit參數放到對應用戶的.bash_profile裏面;
2.ulimit命令本身就有分軟硬設置,加-H就是硬,加-S就是軟;
硬限制是可以在任何時候任何進程中設置  但硬限制只能由超級用戶提起
軟限制是內核實際執行的限制,任何進程都可以將軟限制設置爲任意小於等於對進程限制的硬限制的值
3.默認顯示的是軟限制,如果運行ulimit命令修改的時候沒有加上的話,就是兩個參數一起改變生效;

永久設置


針對所有用戶的設置,在/etc/security/limits.conf文件,其是可以對系統用戶、組進行cpu、文件數等限制的,通過它可以針對某個用戶或全部進行限制。但不能超越系統的限制;
格式:
#<domain>   <type> <item> <value>
*           soft   nproc        102400


domain:表示範圍,
a user name       #表示某個用戶
a group name  #表示某個組
the wildcard *    #表示所有用戶
the wildcard %    #篩選過濾用戶


type:表示類型
soft表示可以超出,但只是警告
hard表示絕對不能超出


item:
- core - limits the core file size (KB)
- data - max data size (KB)
- fsize - maximum filesize (KB)
- memlock - max locked-in-memory address space (KB)
- nofile - max number of open file descriptors
- rss - max resident set size (KB)
- stack - max stack size (KB)
- cpu - max CPU time (MIN)
- nproc - max number of processes
- as - address space limit (KB)
- maxlogins - max number of logins for this user
- maxsyslogins - max number of logins on the system
- priority - the priority to run user process with
- locks - max number of file locks the user can hold
- sigpending - max number of pending signals
- msgqueue - max memory used by POSIX message queues (bytes)
- nice - max nice priority allowed to raise to values: [-20, 19]
- rtprio - max realtime priority


value:
unlimited表示不限制


如果想對所有用戶設置,也可以放在/etc/profile文件裏面,下面是該文件裏面的默認參數:
ulimit -S -c 0 > /dev/null 2>&1


參考:http://www.jianshu.com/p/23ee9db2a620

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