linux內(nèi)核參數(shù)如何優(yōu)化

  作為高性能WEB服務(wù)器,只調(diào)整nginx本身的參數(shù)是不行的,因?yàn)镹ginx服務(wù)依賴于高性能的操作系統(tǒng)。
  以下為常見的幾個(gè)linux內(nèi)核參數(shù)優(yōu)化方法。

  • net.ipv4.tcp_max_tw_buckets

對(duì)于tcp連接,服務(wù)端和客戶端通信完后狀態(tài)變?yōu)閠imewait,假如某臺(tái)服務(wù)器非常忙,連接數(shù)特別多的話,那么這個(gè)timewait數(shù)量就會(huì)越來越大。
畢竟它也是會(huì)占用一定的資源,所以應(yīng)該有一個(gè)最大值,當(dāng)超過這個(gè)值,系統(tǒng)就會(huì)刪除最早的連接,這樣始終保持在一個(gè)數(shù)量級(jí)。
這個(gè)數(shù)值就是由net.ipv4.tcp_max_tw_buckets這個(gè)參數(shù)來決定的。
CentOS7系統(tǒng),你可以使用sysctl -a |grep tw_buckets來查看它的值,默認(rèn)為32768,
你可以適當(dāng)把它調(diào)低,比如調(diào)整到8000,畢竟這個(gè)狀態(tài)的連接太多也是會(huì)消耗資源的。
但你不要把它調(diào)到幾十、幾百這樣,因?yàn)檫@種狀態(tài)的tcp連接也是有用的,
如果同樣的客戶端再次和服務(wù)端通信,就不用再次建立新的連接了,用這個(gè)舊的通道,省時(shí)省力。

  • net.ipv4.tcp_tw_recycle = 1

該參數(shù)的作用是快速回收timewait狀態(tài)的連接。上面雖然提到系統(tǒng)會(huì)自動(dòng)刪除掉timewait狀態(tài)的連接,但如果把這樣的連接重新利用起來豈不是更好。
所以該參數(shù)設(shè)置為1就可以讓timewait狀態(tài)的連接快速回收,它需要和下面的參數(shù)配合一起使用。

  • net.ipv4.tcp_tw_reuse = 1

該參數(shù)設(shè)置為1,將timewait狀態(tài)的連接重新用于新的TCP連接,要結(jié)合上面的參數(shù)一起使用。

  • net.ipv4.tcp_syncookies = 1

tcp三次握手中,客戶端向服務(wù)端發(fā)起syn請(qǐng)求,服務(wù)端收到后,也會(huì)向客戶端發(fā)起syn請(qǐng)求同時(shí)連帶ack確認(rèn),
假如客戶端發(fā)送請(qǐng)求后直接斷開和服務(wù)端的連接,不接收服務(wù)端發(fā)起的這個(gè)請(qǐng)求,服務(wù)端會(huì)重試多次,
這個(gè)重試的過程會(huì)持續(xù)一段時(shí)間(通常高于30s),當(dāng)這種狀態(tài)的連接數(shù)量非常大時(shí),服務(wù)器會(huì)消耗很大的資源,從而造成癱瘓,
正常的連接進(jìn)不來,這種惡意的半連接行為其實(shí)叫做syn flood攻擊。
設(shè)置為1,是開啟SYN Cookies,開啟后可以避免發(fā)生上述的syn flood攻擊。
開啟該參數(shù)后,服務(wù)端接收客戶端的ack后,再向客戶端發(fā)送ack+syn之前會(huì)要求client在短時(shí)間內(nèi)回應(yīng)一個(gè)序號(hào),
如果客戶端不能提供序號(hào)或者提供的序號(hào)不對(duì)則認(rèn)為該客戶端不合法,于是不會(huì)發(fā)ack+syn給客戶端,更涉及不到重試。

  • net.ipv4.tcp_max_syn_backlog

該參數(shù)定義系統(tǒng)能接受的最大半連接狀態(tài)的tcp連接數(shù)。客戶端向服務(wù)端發(fā)送了syn包,服務(wù)端收到后,會(huì)記錄一下,
該參數(shù)決定最多能記錄幾個(gè)這樣的連接。在CentOS7,默認(rèn)是256,當(dāng)有syn flood攻擊時(shí),這個(gè)數(shù)值太小則很容易導(dǎo)致服務(wù)器癱瘓,
實(shí)際上此時(shí)服務(wù)器并沒有消耗太多資源(cpu、內(nèi)存等),所以可以適當(dāng)調(diào)大它,比如調(diào)整到30000。

  • net.ipv4.tcp_syn_retries

該參數(shù)適用于客戶端,它定義發(fā)起syn的最大重試次數(shù),默認(rèn)為6,建議改為2。

  • net.ipv4.tcp_synack_retries

該參數(shù)適用于服務(wù)端,它定義發(fā)起syn+ack的最大重試次數(shù),默認(rèn)為5,建議改為2,可以適當(dāng)預(yù)防syn flood攻擊。

  • net.ipv4.ip_local_port_range

該參數(shù)定義端口范圍,系統(tǒng)默認(rèn)保留端口為1024及以下,以上部分為自定義端口。這個(gè)參數(shù)適用于客戶端,
當(dāng)客戶端和服務(wù)端建立連接時(shí),比如說訪問服務(wù)端的80端口,客戶端隨機(jī)開啟了一個(gè)端口和服務(wù)端發(fā)起連接,
這個(gè)參數(shù)定義隨機(jī)端口的范圍。默認(rèn)為32768 ? ?61000,建議調(diào)整為1025 61000。

  • net.ipv4.tcp_fin_timeout

tcp連接的狀態(tài)中,客戶端上有一個(gè)是FIN-WAIT-2狀態(tài),它是狀態(tài)變遷為timewait前一個(gè)狀態(tài)。
該參數(shù)定義不屬于任何進(jìn)程的該連接狀態(tài)的超時(shí)時(shí)間,默認(rèn)值為60,建議調(diào)整為6。

  • net.ipv4.tcp_keepalive_time

tcp連接狀態(tài)里,有一個(gè)是established狀態(tài),只有在這個(gè)狀態(tài)下,客戶端和服務(wù)端才能通信。正常情況下,當(dāng)通信完畢,
客戶端或服務(wù)端會(huì)告訴對(duì)方要關(guān)閉連接,此時(shí)狀態(tài)就會(huì)變?yōu)閠imewait,如果客戶端沒有告訴服務(wù)端,
并且服務(wù)端也沒有告訴客戶端關(guān)閉的話(例如,客戶端那邊斷網(wǎng)了),此時(shí)需要該參數(shù)來判定。
比如客戶端已經(jīng)斷網(wǎng)了,但服務(wù)端上本次連接的狀態(tài)依然是established,服務(wù)端為了確認(rèn)客戶端是否斷網(wǎng),
就需要每隔一段時(shí)間去發(fā)一個(gè)探測(cè)包去確認(rèn)一下看看對(duì)方是否在線。這個(gè)時(shí)間就由該參數(shù)決定。它的默認(rèn)值為7200秒,建議設(shè)置為30秒。

  • net.ipv4.tcp_keepalive_intvl

該參數(shù)和上面的參數(shù)是一起的,服務(wù)端在規(guī)定時(shí)間內(nèi)發(fā)起了探測(cè),查看客戶端是否在線,如果客戶端并沒有確認(rèn),
此時(shí)服務(wù)端還不能認(rèn)定為對(duì)方不在線,而是要嘗試多次。該參數(shù)定義重新發(fā)送探測(cè)的時(shí)間,即第一次發(fā)現(xiàn)對(duì)方有問題后,過多久再次發(fā)起探測(cè)。
默認(rèn)值為75秒,可以改為3秒。

  • net.ipv4.tcp_keepalive_probes

第10和第11個(gè)參數(shù)規(guī)定了何時(shí)發(fā)起探測(cè)和探測(cè)失敗后再過多久再發(fā)起探測(cè),但并沒有定義一共探測(cè)幾次才算結(jié)束。
該參數(shù)定義發(fā)起探測(cè)的包的數(shù)量。默認(rèn)為9,建議設(shè)置2。
設(shè)置和范例
在Linux下調(diào)整內(nèi)核參數(shù),可以直接編輯配置文件/etc/sysctl.conf,然后執(zhí)行sysctl -p命令生效

結(jié)合以上分析的各內(nèi)核參數(shù),范例如下

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

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊8 分享