首頁  >  文章  >  運維  >  linux核心參數如何優化

linux核心參數如何優化

WBOY
WBOY轉載
2023-05-11 18:58:212730瀏覽

  作為高效能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,畢竟這個狀態的連接太多也是會消耗資源的。
但你不要把它調到幾十、幾百這樣,因為這種狀態的tcp連接也是有用的,
如果同樣的客戶端再次和服務端通信,就不用再次建立新的連接了,用這個舊的通道,省時省力。

  • net.ipv4.tcp_tw_recycle = 1

此參數的作用是快速回收timewait狀態的連線。上面雖然提到系統會自動刪除掉timewait狀態的連接,但如果把這樣的連接重新利用起來豈不是更好。
所以這個參數設定為1就可以讓timewait狀態的連線快速回收,它需要和下面的參數配合一起使用。

  • 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。

  • net.ipv4.tcp_syn_retries

此參數適用於客戶端,它定義發起syn的最大重試次數,預設為6,建議改為2。

  • net.ipv4.tcp_synack_retries

此參數適用於服務端,它定義發起syn ack的最大重試次數,預設為5,建議改為2,可以適當預防syn flood攻擊。

  • net.ipv4.ip_local_port_range

此參數定義連接埠範圍,系統預設保留連接埠為1024及以下,以上部分為自訂連接埠。這個參數適用於客戶端,
當客戶端和服務端建立連接時,比如說訪問服務端的80端口,客戶端隨機開啟了一個端口和服務端發起連接,
這個參數定義隨機端口的範圍。預設為32768    61000,建議調整為1025 61000。

  • 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指令生效

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

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

以上是linux核心參數如何優化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除