我自己實(shí)現(xiàn)了基于TCP的的jsonRpc2.0服務(wù)端和客戶端;
服務(wù)端基于workerman實(shí)現(xiàn),客戶端使用stream_socket_client實(shí)現(xiàn);
客戶端每一次發(fā)送和接收一次消息會立即調(diào)用fclose關(guān)閉連接;
現(xiàn)在出現(xiàn)了一個情況,幾乎每一次客戶端請求到服務(wù)端達(dá)到15998次請求以后就會連接不上,報111錯誤;在停止請求2分鐘左右后又可以重新請求,但依然是15998左右會被阻止;不停止請求的情況下2分鐘左右也會陸陸續(xù)續(xù)有少量請求進(jìn)來;
單一的客戶端到單一的服務(wù)器;一對一;請求短時間內(nèi)達(dá)到15998次左右,QPS在500-1500浮動;
客戶端側(cè)發(fā)起的每個連接都會占用本地一個端口,連接關(guān)閉后這個端口會有一個time_wait時間,在這個期間這個端口默認(rèn)是無法被使用的。因?yàn)楸镜囟丝谑怯邢薜?,所以在快速?chuàng)建大量短連接時本地端口被timewait占用光后就會出現(xiàn)無法創(chuàng)建新的連接問題。
解決辦法:
你可以打開 /etc/sysctl.conf
添加如下配置
net.ipv4.tcp_tw_reuse = 1
運(yùn)行sysctl -p
試下。
如果不行再加如下配置
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 1
運(yùn)行sysctl -p
以上配置都是用于快速回收端口用的。
注意:如果開啟 net.ipv4.tcp_tw_recycle = 1
和 net.ipv4.tcp_timestamps = 1
可能會導(dǎo)致在NAT網(wǎng)絡(luò)里的客戶端連接當(dāng)前服務(wù)器超時丟包的情況。
好的,感謝!
之前一直在服務(wù)端來做這些配置的處理,所以一直是會請求失敗。
后面想了一下,是客戶端主動關(guān)閉的,服務(wù)端是close_wait,客戶端才是time_wait,哈哈哈,我的我的,低級失誤了,感謝~