當用linux做高并發伺服器時,會遇到"Too many open files"的錯誤。
Linux是有檔案句柄限制的(open files),而且Linux預設不是很高,一般都是1024,做高并發生産伺服器用其實很容易就達到這個數量。
轉載:
https://blog.csdn.net/wjx_jasin/article/details/80663558在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、檔案數等限制的,通過它可以針對某個使用者或全部進行限制。但不能超越系統的限制;
格式:
- soft noproc 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