linux 內核參數優化

  做爲高性能WEB服務器,只調整Nginx自己的參數是不行的,由於Nginx服務依賴於高性能的操做系統。
  如下爲常見的幾個Linux內核參數優化方法。服務器

  • net.ipv4.tcp_max_tw_buckets

對於tcp鏈接,服務端和客戶端通訊完後狀態變爲timewait,假如某臺服務器很是忙,鏈接數特別多的話,那麼這個timewait數量就會愈來愈大。
畢竟它也是會佔用必定的資源,因此應該有一個最大值,當超過這個值,系統就會刪除最先的鏈接,這樣始終保持在一個數量級。
這個數值就是由net.ipv4.tcp_max_tw_buckets這個參數來決定的。
CentOS7系統,你可使用sysctl -a |grep tw_buckets來查看它的值,默認爲32768,
你能夠適當把它調低,好比調整到8000,畢竟這個狀態的鏈接太多也是會消耗資源的。
但你不要把它調到幾10、幾百這樣,由於這種狀態的tcp鏈接也是有用的,
若是一樣的客戶端再次和服務端通訊,就不用再次創建新的鏈接了,用這個舊的通道,省時省力。cookie

  • net.ipv4.tcp_tw_recycle = 1

該參數的做用是快速回收timewait狀態的鏈接。上面雖然提到系統會自動刪除掉timewait狀態的鏈接,但若是把這樣的鏈接從新利用起來豈不是更好。
因此該參數設置爲1就可讓timewait狀態的鏈接快速回收,它須要和下面的參數配合一塊兒使用。tcp

  • net.ipv4.tcp_tw_reuse = 1

該參數設置爲1,將timewait狀態的鏈接從新用於新的TCP鏈接,要結合上面的參數一塊兒使用。性能

  • net.ipv4.tcp_syncookies = 1

tcp三次握手中,客戶端向服務端發起syn請求,服務端收到後,也會向客戶端發起syn請求同時連帶ack確認,
假如客戶端發送請求後直接斷開和服務端的鏈接,不接收服務端發起的這個請求,服務端會重試屢次,
這個重試的過程會持續一段時間(一般高於30s),當這種狀態的鏈接數量很是大時,服務器會消耗很大的資源,從而形成癱瘓,
正常的鏈接進不來,這種惡意的半鏈接行爲其實叫作syn flood攻擊。
設置爲1,是開啓SYN Cookies,開啓後能夠避免發生上述的syn flood攻擊。
開啓該參數後,服務端接收客戶端的ack後,再向客戶端發送ack+syn以前會要求client在短期內迴應一個序號,
若是客戶端不能提供序號或者提供的序號不對則認爲該客戶端不合法,因而不會發ack+syn給客戶端,更涉及不到重試。優化

  • net.ipv4.tcp_max_syn_backlog

該參數定義系統能接受的最大半鏈接狀態的tcp鏈接數。客戶端向服務端發送了syn包,服務端收到後,會記錄一下,
該參數決定最多能記錄幾個這樣的鏈接。在CentOS7,默認是256,當有syn flood攻擊時,這個數值過小則很容易致使服務器癱瘓,
實際上此時服務器並無消耗太多資源(cpu、內存等),因此能夠適當調大它,好比調整到30000。spa

  • net.ipv4.tcp_syn_retries

該參數適用於客戶端,它定義發起syn的最大重試次數,默認爲6,建議改成2。操作系統

  • net.ipv4.tcp_synack_retries

該參數適用於服務端,它定義發起syn+ack的最大重試次數,默認爲5,建議改成2,能夠適當預防syn flood攻擊。code

  • net.ipv4.ip_local_port_range

該參數定義端口範圍,系統默認保留端口爲1024及如下,以上部分爲自定義端口。這個參數適用於客戶端,
當客戶端和服務端創建鏈接時,好比說訪問服務端的80端口,客戶端隨機開啓了一個端口和服務端發起鏈接,
這個參數定義隨機端口的範圍。默認爲32768 61000,建議調整爲1025 61000。blog

  • net.ipv4.tcp_fin_timeout

tcp鏈接的狀態中,客戶端上有一個是FIN-WAIT-2狀態,它是狀態變遷爲timewait前一個狀態。
該參數定義不屬於任何進程的該鏈接狀態的超時時間,默認值爲60,建議調整爲6。進程

  • net.ipv4.tcp_keepalive_time

tcp鏈接狀態裏,有一個是established狀態,只有在這個狀態下,客戶端和服務端才能通訊。正常狀況下,當通訊完畢,
客戶端或服務端會告訴對方要關閉鏈接,此時狀態就會變爲timewait,若是客戶端沒有告訴服務端,
而且服務端也沒有告訴客戶端關閉的話(例如,客戶端那邊斷網了),此時須要該參數來斷定。
好比客戶端已經斷網了,但服務端上本次鏈接的狀態依然是established,服務端爲了確認客戶端是否斷網,
就須要每隔一段時間去發一個探測包去確認一下看看對方是否在線。這個時間就由該參數決定。它的默認值爲7200秒,建議設置爲30秒。

  • net.ipv4.tcp_keepalive_intvl

該參數和上面的參數是一塊兒的,服務端在規定時間內發起了探測,查看客戶端是否在線,若是客戶端並無確認,
此時服務端還不能認定爲對方不在線,而是要嘗試屢次。該參數定義從新發送探測的時間,即第一次發現對方有問題後,過多久再次發起探測。
默認值爲75秒,能夠改成3秒。

  • net.ipv4.tcp_keepalive_probes

第10和第11個參數規定了什麼時候發起探測和探測失敗後再過多久再發起探測,但並無定義一共探測幾回纔算結束。
該參數定義發起探測的包的數量。默認爲9,建議設置2。
設置和範例
在Linux下調整內核參數,能夠直接編輯配置文件/etc/sysctl.conf,而後執行sysctl -p命令生效

 

結合以上分析的各內核參數,範例以下

  net.ipv4.tcp_fin_timeout = 6
  net.ipv4.tcp_keepalive_time = 30
  net.ipv4.tcp_max_tw_buckets = 8000
  net.ipv4.tcp_tw_reuse = 1
  net.ipv4.tcp_tw_recycle = 1
  net.ipv4.tcp_syncookies = 1
  net.ipv4.tcp_max_syn_backlog = 30000
  net.ipv4.tcp_syn_retries = 2
  net.ipv4.tcp_synack_retries = 2
  net.ipv4.ip_local_port_range = 1025 61000
  net.ipv4.tcp_keepalive_intvl = 3
  net.ipv4.tcp_keepalive_probes = 2
相關文章
相關標籤/搜索