用ulimit增加fd以提升服務連線數
之前的文章《php非同步程式設計》中介紹了 php 在常駐系統的情況下,怎麼通過非同步操作來減少等待時間,增加併發數。但是系統不管是接受客戶端的長連結請求(web socket)還是建立上游的連結,都需要開啟 file descriptors(檔案描述符,簡稱fd)。系統對 fd 數量是有限制的,增加 fd 數量,就能顯著增加併發數。
ulimit 命令可以檢視和修改每個使用者對系統使用的指標,先來看一下 ulimit 怎麼使用
$ ulimit -a -t: cpu time (seconds)unlimited -f: file size (blocks)unlimited -d: data seg size (kbytes)unlimited -s: stack size (kbytes)8192 -c: core file size (blocks)0 -m: resident set size (kbytes) unlimited -u: processes192276 -n: file descriptors21000 -l: locked-in-memory size (kb) unlimited -v: address space (kb)unlimited -x: file locksunlimited -i: pending signals192276 -q: bytes in POSIX msg queues819200 -e: max nice30 -r: max rt priority65 -N 15:unlimited
推薦的 unlimit 設定
ulimit 分為“硬”和“軟”兩個指標,“硬”指標限制使用者可以開啟的程序數,“軟”指標限制實際處理執行的程序數(我也不是太清除)。用 -H 和 -S 來檢視和修改。下面是 MongoDB 推薦的設定:
- -f (file size): unlimited
- -t (cpu time): unlimited
- -v (virtual memory): unlimited
- -l (locked-in-memory size): unlimited
- -n (open files): 64000
- -m (memory size): unlimited
- -u (processes/threads): 64000
大部分引數都是不限制,只給了我們最關心的 open files 和 processes/threads 限制,因此是比較通用的。linux 預設的 open files 只有1000,加大是非常有必要的。至於64000是不是最合適的值,還需要壓測後才能知道。
使用 Upstart 的 linux
limit fsize unlimited unlimited# (file size) limit cpu unlimited unlimited# (cpu time) limit as unlimited unlimited# (virtual memory size) limit memlock unlimited unlimited# (locked-in-memory size) limit nofile 64000 64000# (open files) limit nproc 64000 64000# (processes/threads)
使用 ststemd 的 linux
[Service] # Other directives omitted # (file size) LimitFSIZE=infinity # (cpu time) LimitCPU=infinity # (virtual memory size) LimitAS=infinity # (locked-in-memory size) LimitMEMLOCK=infinity # (open files) LimitNOFILE=64000 # (processes/threads) LimitNPROC=64000
修改後記得重啟服務或系統