Sysctl 配置生效問題

前幾天拿到一臺新的物理機用jmeter做http接口壓測,結果發現錯誤率很高,一段時間後,抓包發現請求根本沒有發出去。

首先用:

netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'

查詢一下 time wait狀態的TCP連接數,發現有兩萬多個。可能是所有連接已經被佔滿,沒有新連接可以用了。

 

那怎麼處理TIMEWAIT過多的問題呢?

上網搜了一下,是編輯linux系統內核參數:sysctl。

首先打開文件:vim /etc/sysctl.conf

然後增加如下配置:

net.ipv4.tcp_max_tw_buckets = 2000  #表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。

net.ipv4.tcp_tw_recycle = 1  #表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。

net.ipv4.tcp_tw_reuse = 1 #表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;

net.ipv4.ip_local_port_range = 1024 65000    #表示用於向外連接的端口範圍。缺省情況下很小:32768到61000,改爲1024到65000。

使用如下命令使上述配置生效。

sysctl -p

 也有說要用這個的 

/sbin/sysctl -w net.ipv4.route.flush=1

更改完之後一定要確認一下配置是否生效:

sysctl -a | grep tw

注意:如果想從新的配置還原到默認配置,只把自己的配置註釋掉是不行的,必須改成原來的配置然後刷新才行!

比如說:註釋掉如下行之後

#net.ipv4.ip_local_port_range = 1024 65000 

之後 sysctl -p,再用sysctl -a | grep ip_local_port_range看下結果,發現仍然是net.ipv4.ip_local_port_range = 1024 65000!

所以必須要手動改成net.ipv4.ip_local_port_range = 32768 65000(默認配置) 再sysctl -p才行!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章