優化Linux核心引數提高伺服器負載能力

OldBoy~發表於2017-12-27

首先,編輯一下/etc/sysctl.conf 檔案,調整一下以下引數,如果沒有經過優化的Linux核心可能沒有這些引數,那麼把需要補充的複製新增進去即可,其他設定預設即可,不需要理解。

記得修改完成之後記得執行以下命令生效

sysctl –p
vim /etc/sysctl.conf
fs.file-max=65535             //控制檔案開啟數量,也就是一次開啟這些數量(執行ulimit -u,這裡與命令返回的數量一致即可)
net.ipv4.tcp_max_tw_buckets = 5000 //等待響應時間,單位是毫秒,這裡是5秒,如果系統超時5秒踢出去。
net.ipv4.tcp_sack = 0  #關閉tcp_sack 。啟用有選擇的應答(Selective Acknowledgment),這可以通過有選擇地應答亂序接收到的報文來提高效能(這樣可以讓傳送者只傳送丟失的報文段);(對於廣域網通訊來說)這個選項應該啟用,但是這會增加對 CPU 的佔用。
net.ipv4.tcp_window_scaling = 0 //關閉tcp_window_scaling。啟用 RFC 1323 定義的 window scaling;要支援超過 64KB 的視窗,必須啟用該值。
net.ipv4.tcp_tw_recyde = 1   ##啟用timewait快速回收
net.core.somaxconn = 262144 #web應用中listen函式的backlog預設會給我們核心引數的net.core.somaxconn限制到128,而Nginx核心引數定義的MGX_LISTEN_BACKLOG預設為511,所以有必要調整這個值
net.core.netdev_max_backlog = 262144 #每個網路介面接收資料包的速率比核心處理這些包的速度快時,允許送到佇列的資料包最大數目
net.ipv4.tcp_max_orphans = 262144 #系統中最多有多少個TCP套接字不被關聯到任何一個使用者檔案控制程式碼上。如果超過這個數字,孤兒連線將即可被複位並列印出警告資訊。這個限制僅僅為了防止簡單的DOS攻擊,不能過分依靠它或者人為地減少這個值,
更應該增加這個值(如果增加了記憶體之後)
net.ipv4.tcp_max_syn_backlog = 262144 //記錄的那些尚未收到客戶端確認資訊的連線請求最大值。對於有128M記憶體的系統而言,預設值是1024,小記憶體的系統則是128 net.core.wmem_default = 8388608 #定義預設的傳送視窗大小;對於更大的 BDP 來說,這個大小也應該更大。 net.core.rmem_default = 8388608 #指定了接收套接字緩衝區大小的預設值(以位元組為單位)。 net.core.rmem_max = 16777216 #指定了接收套接字緩衝區大小的最大值(以位元組為單位)。 net.core.wmem_max = 16777216 #定義傳送視窗的最大大小;對於更大的 BDP 來說,這個大小也應該更大。 net.ipv4.tcp_timestamps = 0 //時間戳可以避免序列號的卷繞。一個1Gbps的鏈路肯定會遇到以前用過的序列號。時間戳能夠讓核心接收這種“異常”的資料包。這裡需要關掉 net.ipv4.tcp_fin_timeout = 1 //如果套接字由本端要求關閉,這個引數決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯並永遠不關閉連線,甚至意外當機。預設值是60秒。2.2核心通常值是180,你可以按這個設定,但要記住的是,即使你的機器是一個輕負載的WEB伺服器,

也有因為大量的死套接字而記憶體溢位的風險,FIN-WAIT-2的危險性比FIN-WAIT-1的要小,因為它最多隻是吃掉1.5K的記憶體,但是他們的生存期長些 net.ipv4.tcp_synack_retries = 1 #為了開啟對端的連線,核心需要傳送一個SYN並附帶一個迴應前面一個SYN的ACK。也就是所謂三次握手中的第二次握手。這個設定決定了核心放棄連線之前傳送SYN+ACK包的數量
net.ipv4.tcp_syn_retries = 1 #在核心放棄建立連線之前傳送SYN包的數量
net.ipv4.tcp_keepalive_time = 30 #當keepalive啟用的時候,TCP傳送keepalive訊息的頻度。預設值是2小時
net.ipv4.tcp_syncookies = 1 #表示開啟SYN Cookies。當出現SYN等待佇列溢位時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1 //表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉;
net.ipv4.ip_local_port_range = 102465000 #表示用於向外連線的埠範圍表示用於向外連線的埠範圍
net.inet.udp.checksum= 1 #防止不正確的udp包的攻擊

相關文章