netstat -anp | awk '/^tcp/ {++S[$6]} END {for (a in S) print a, S[a]}'
timewait數(shù)量有8w
這個項目(php)跟一般網(wǎng)站不同,主要是做一些適配分發(fā),就是有請求過來,就調(diào)用其他接口返回。因為是提供給內(nèi)網(wǎng)機器調(diào)用,所以請求的ip都是比較固定的幾個。http請求,沒有做長連接。
timewait比較高,但是load卻很平穩(wěn),同時請求的機器卻時不時會顯示timeout(3秒timeout)
修改/etc/sysctl.conf
增加了
net.ipv4.ip_local_port_range = 9000 65500
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 6
?sysctl -p
其中一臺機器,timewait下降到4w。另外一臺機器卻沒有變化……
因為之前用的apache,后來改成用nginx,并沒有好轉,還是會有超時情況發(fā)生。
感覺是要改用長連接了,之前redis因為連接數(shù)過高,改為用長連接之后就沒事了。但是改動上面的配置為什么一臺機有效,另外一臺卻沒有效果也是很奇怪。
下面是找的過程中看的一些文章的想法:
1. 其實timewait高應該沒有什么影響,只要CPU還在正常范圍就行了
2. 占用端口問題。并不是真正占用了一個端口,基于linux萬物皆文件的原理,只是產(chǎn)生了一個文件的handler,所以能提供多少鏈接的數(shù)量,應該跟能打開文件的數(shù)量差不多的。意思就是不止是6w多個。但是一個端口對應一個ip的話,好像就只能是6w多個。具體原因忘記了,要翻開文章來看。
3. 用keepalive其實能解決timewait過高的問題,因為請求完不關閉等待下一次請求。但是在我們這個場景是不適用的,因為php的curl請求并不支持長連,即使服務器開了keepalive也沒有效果。php實現(xiàn)長連接需裝pecl_http擴展 https://pecl.php.net/package/pecl_http /?https://mdref.m6w6.name/http (文檔)