使用Linux做爲長鏈接的web服務器時,爲了增長服務的容量,以及處理性能,須要修改一些參數。html
1、多進程綁定CPU node
一、使用taskset命令能夠綁定進程到指定CPU,以減小多核CPU環境中,單進程在多個CPU之間卻換運行而產生的CPU上下文卻換。linux
taskset參數:web
-p 指定已存在進程的pid,而不是啓動一個進程;同時該命令還返回該進程當前的CPU-list掩碼,如:ubuntu
0x00000001 is processor #0 0x00000003 is processors #0 and #1 0xFFFFFFFF is all processors (#0 through #31)
-c 指定進程的CPU列表,該列表可使用逗號分隔,或者區間橫線符號,如:0,5,7,9-11.緩存
taskset -cp 1,2,3 9876 #指定9876進程在1,2,3CPU上運行服務器
taskset -c 1,2,3 node test.js #在CPU1,2,3上啓動一個進程網絡
參考:http://yunwei.org/123/ ; http://hi.baidu.com/zhongalin_hust/item/d8a556385c5a2983f5e4ad18socket
二、綁定CPU的好處,主要由兩點:1)提升CPU緩存的命中率,避免卻換執行的CPU致使的緩存換入換出。2)平衡各個CPU之間的負載。tcp
參考:Nginx的CPU綁定優化:http://blog.csdn.net/wangkun_dhcc/article/details/8713336
管理處理器的親和性:http://www.ibm.com/developerworks/cn/linux/l-affinity.html
2、使用nice和renice來修改進程的優先級
nice,renice分別用於啓動時與啓動後修改進程的nice值,nice值爲正表示優先級下降,爲負值表示優先級提升,進程全部者容許下降優先級,可是隻有root才能夠提升優先級。
nice參數
-n val node test.js #啓動的時候設置nice值
renice val pid
3、調整文件描述符限制
linux中文件描述符有兩種:
一是系統級別的限制(表示全部進程總數量限制):
修改 /etc/sysctl.conf文件,增長以下兩行 fs.file-max = 1000000 --系統級別全部進程可打開的文件數(ubuntu默認10萬) fs.nr_open = 1000000 --定義了file-max容許被修改的最大值,file-max不能夠超過該值(ubuntu默認100萬)
使用 /etc/sysctl.conf 後可使用 sysctl -p 生效 也能夠修改以下兩個文件,效果同樣(/etc/sysctl.conf中得配置,是直接對應到 /proc/sys 目錄下面): /proc/sys/fs/file-max /proc/sys/fs/nr_open
二是用戶級別的限制(表示系統中的單個用戶可打開的文件數):
修改配置文件: /etc/security/limits.conf * soft nofile 1000000 * hard nofile 1000000
修改後能夠採用重登錄,或者重啓的方式生效。
另外可使用ulimia -a的方式來查看 open files 項是否爲修改後的值。
所以在服務端,須要同時修改系統與用戶級別的限制,而在測試客戶機器中,因爲打開的文件數很是有限,所以默認的系統限制已經足夠,只須要修改用戶級別(默認1024)的限制便可。(ubuntu 默認 file-max大約10萬,nr_open大約100萬)
4、網絡資源修改
修改配置文件 /etc/sysctl.conf ,修改後使用 sysctl -p net.core.somaxconn = 2048 ---監聽隊列最大值 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 100000 ---網絡設備接收到的數據,比處理快時,容許保存的最大包數量 net.ipv4.tcp_rmem = 40960 40960 16777216 ---TCP讀緩存大小 最小、默認、最大 net.ipv4.tcp_wmem = 40960 40960 16777216 net.ipv4.tcp_mem = 786432 2097152 3145728 ---系統TCP內存使用限制,以頁爲單位 net.ipv4.tcp_max_syn_backlog = 32786 --未創建鏈接隊列,能夠增長等待鏈接創建的TCP數量 net.ipv4.tcp_fin_timeout = 15 ---主動斷開鏈接,發送FIN後等待對方ACK的時間,默認60秒 net.ipv4.tcp_tw_reuse = 1 --是否可使用TIME_WAIT,TCP鏈接用於創建新鏈接 net.ipv4.tcp_tw_recycle = 1 --是否開啓帶回收TIME——WAIT TCP的功能 ? net.ipv4.tcp_max_orphans = 131072 --系統容許沒有歸屬的socket數量 net.ipv4.ip_local_port_range = 1024 65535
因爲服務端須要保持大量的socket連接,所以適當地減低每一個socket的緩衝區大小,有利於減小對內存的佔用。
而對於客戶端,只須要修改 ip_local_port_range 便可。默認狀況下,端口範圍爲從 32768 - 61000 只有一萬多個端口可使用。
5、判斷已啓動進程的系統資源限制
修改了系統限制以後,以後啓動的進程將採用新的限制,而已經啓動的進程將保持原有的限制。
當不肯定進程的限制時,能夠經過查看 /proc/pid/limits 文件來了解主要的資源限制。