Linux核心調優

網路

調整linux核心引數以便滿足高併發訪問,解決大量time_wait佔用太多本地埠導致的Cannot assign requested address 問題。

客戶端與服務端每建立一個連線,客戶端一側都會佔用一個本地埠(假設沒有啟用SO_REUSEADDR選項),本地埠數量是有限制的(預設是net.ipv4.ip_local_port_range=32768 61000),也就是說在沒設定socket的SO_REUSEADDR選項時,一臺Linux伺服器作為客戶端注意是作為客戶端)預設只能建立大概3萬個TCP連線(服務端沒有這個限制),可以更改net.ipv4.ip_local_port_range增大作為客戶端可發起的併發連線數,但最多不會超過65535個(服務端沒有這個限制)。

當Linux伺服器作為客戶端頻繁建立TCP短連線時,本地會可能會產生很多TIME_WAIT狀態的連線,客戶端側的TIME_WAIT狀態的連線會佔用一個本地埠直到達到2MSL(最長分解生命期)的時間,這樣會導致本地埠被暫時佔用,當短連線建立速度過快時(例如做壓測時),會導致Cannot assign requested address錯誤,解決辦法有幾種,比如像下面這樣設定埠複用(複用TIME_WAIT狀態的連線)。

開啟檔案 /etc/sysctl.conf,增加以下設定

net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

執行 sysctl -p即可生效

說明:

/etc/sysctl.conf 可設定的選項很多,其它選項可以根據自己的環境需要進行設定

開啟檔案數

設定系統開啟檔案數設定,解決高併發下 too many open files 問題。此選項直接影響單個程序容納的客戶端連線數。

Soft open files 是Linux系統引數,影響系統單個程序能夠開啟最大的檔案控制代碼數量,這個值會影響到長連結應用如聊天中單個程序能夠維持的使用者連線數, 執行ulimit -n能看到這個引數值,如果是1024,就是代表單個程序只能同時最多隻能維持1024甚至更少(因為有其它檔案的控制代碼被開啟)。如果開啟4個程序維持使用者連結,那麼整個應用能夠同時維持的連線數不會超過4*1024個,也就是說最多隻能支援4x1024個使用者線上可以增大這個設定以便服務能夠維持更多的TCP連線。

Soft open files 修改方法:

(1)ulimit -HSn 102400

這只是在當前終端有效,退出之後,open files 又變為預設值。

(2)將ulimit -HSn 102400寫到/etc/profile中,這樣每次登入終端時,都會自動執行/etc/profile。

(3)令修改open files的數值永久生效,則必須修改配置檔案:/etc/security/limits.conf. 在這個檔案後加上:

* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000

這種方法需要重啟機器才能生效。

.