內核參數優化
linux內核參數優化(網絡模塊)
在Linux下調整內核參數,可以直接編輯配置文件/etc/sysctl.conf,然后執行sysctl -p命令生效
文件內容如下:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 268435456
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 30000
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 65536 4194304
net.ipv4.tcp_mem = 524288 699050 1048576
vm.swappiness = 0
vm.min_free_kbytes = 65536
-
net.core.somaxconn = 262144
web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值。
-
net.core.netdev_max_backlog = 262144
每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。
-
net.ipv4.tcp_max_orphans = 262144
系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。如果超過這個數字,孤兒連接將即刻被復位并打印出警告信息。這個限制僅僅是為了防止簡單的DoS攻擊,不能過分依靠它或者人為地減小這個值,更應該增加這個值(如果增加了內存之后)。
-
net.ipv4.tcp_max_tw_buckets = 6000
對于tcp連接,服務端和客戶端通信完后狀態變為timewait,假如某臺服務器非常忙,連接數特別多的話,那么這個timewait數量就會越來越大。
畢竟它也是會占用一定的資源,所以應該有一個最大值,當超過這個值,系統就會刪除最早的連接,這樣始終保持在一個數量級。 這個數值就是由net.ipv4.tcp_max_tw_buckets這個參數來決定的。
CentOS7.6版本,默認為16384,可以使用sysctl -a |grep tw_buckets來查看它的值,可以適當把它調低,比如調整到6000,畢竟這個狀態的連接太多也是會消耗資源的。
但不要把它調到幾十、幾百這樣,因為這種狀態的tcp連接也是有用的,如果同樣的客戶端再次和服務端通信,就不用再次建立新的連接了,用這個舊的通道,省時省力。
-
net.ipv4.tcp_tw_recycle = 0
啟用TIME-WAIT狀態sockets快速回收功能;用于快速減少在TIME-WAIT狀態TCP連接數。1表示啟用;0表示關閉。但是要特別留意的是:這個選項一般不推薦啟用,因為在NAT(Network Address Translation)網絡下,會導致大量的TCP連接建立錯誤,從而引起網站訪問故障。
實際上,net.ipv4.tcp_tw_recycle功能的開啟,要需要net.ipv4.tcp_timestamps(一般系統默認是開啟這個功能的)這個開關開啟后才有效果; 當tcp_tw_recycle 開啟時(tcp_timestamps 同時開啟,快速回收 socket 的效果達到),對于位于NAT設備后面的 Client來說,是一場災難! 會導致到NAT設備后面的Client連接Server不穩定(有的 Client 能連接 server,有的 Client 不能連接 server)。
-
net.ipv4.tcp_tw_reuse = 1
開啟重用功能,允許將TIME-WAIT狀態的sockets重新用于新的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 = 30000
該參數定義系統能接受的最大半連接狀態的tcp連接數。客戶端向服務端發送了syn包,服務端收到后,會記錄一下, 該參數決定最多能記錄幾個這樣的連接。在CentOS7,默認是256,當有syn flood攻擊時,這個數值太小則很容易導致服務器癱瘓, 實際上此時服務器并沒有消耗太多資源(cpu、內存等),所以可以適當調大它,比如調整到30000。
-
net.ipv4.tcp_syn_retries = 1
該參數適用于客戶端,它定義發起syn的最大重試次數,默認為6,建議改為1。
-
net.ipv4.tcp_synack_retries = 1
該參數適用于服務端,它定義發起syn+ack的最大重試次數,默認為5,建議改為1,可以適當預防syn flood攻擊。
-
net.ipv4.ip_local_port_range = 1024 65000
該參數定義端口范圍,系統默認保留端口為1024及以下,以上部分為自定義端口。這個參數適用于客戶端, 當客戶端和服務端建立連接時,比如說訪問服務端的80端口,客戶端隨機開啟了一個端口和服務端發起連接, 這個參數定義隨機端口的范圍。默認為32768 61000,建議調整為1025 65000。
-
net.ipv4.tcp_fin_timeout = 30
如果套接字由本端要求關閉,這個參數 決定了它保持在FIN-WAIT-2狀態的時間。對端可以出錯并永遠不關閉連接,甚至意外當機。缺省值是60秒。2.2 內核的通常值是180秒,你可以按這個設置,但要記住的是,即使你的機器是一個輕載的WEB服務器,也有因為大量的死套接字而內存溢出的風險,FIN- WAIT-2的危險性比FIN-WAIT-1要小,因為它最多只能吃掉1.5K內存,但是它們的生存期長些。
-
net.ipv4.tcp_keepalive_time = 30
tcp連接狀態里,有一個是established狀態,只有在這個狀態下,客戶端和服務端才能通信。正常情況下,當通信完畢, 客戶端或服務端會告訴對方要關閉連接,此時狀態就會變為timewait,如果客戶端沒有告訴服務端, 并且服務端也沒有告訴客戶端關閉的話(例如,客戶端那邊斷網了),此時需要該參數來判定。 比如客戶端已經斷網了,但服務端上本次連接的狀態依然是established,服務端為了確認客戶端是否斷網, 就需要每隔一段時間去發一個探測包去確認一下看看對方是否在線。這個時間就由該參數決定。它的默認值為7200秒,建議設置為30秒。

浙公網安備 33010602011771號