我們有一臺運行tomcat的服務器和使用iphones的客戶端。在iphone上,應用程序在池中使用ASIHTTPRequest(我沒有關於這部分的細節)。通常服務器會停止響應,當檢查netstat時,我們發現CLOSE_WAIT中有數百個連接。現在我可以確定的是,服務器正在等待將最終的ACK發送到手機,但電話不再存在或者沒有響應,因此在tomcat重新啓動之前連接會繼續掛起。Tomcat和ASIHTTPRequest
我通過在服務器上的Recv-Q中注意到剩下1個字節來確定這一點,這些連接中的每一個都是這樣的,也是由msdn決定的:「在關閉連接的一邊,你將有FIN_WAIT_2,這邊是發送最後的FIN_ACK和ACK,你將擁有CLOSE_WAIT。「
所以我的問題是有沒有ASIHTTPRequest其中,關閉它收到ACK之前的連接錯誤?或者有辦法配置Ubuntu X時間後終止這些連接?
附加信息
Tomcat連接器配置:
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="3000"
connectionLinger="-1"
tcpNoDelay="true"
acceptCount="300"
maxThreads="400"
maxKeepAliveRequests="100"
redirectPort="8443"
/>
sysctl的選擇採用:
kernel.printk = 4 4 1 7 fs.inotify.max_user_watches = 524288 fs.file-max = 13337 vm.mmap_min_addr = 65536 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.tcp_keepalive_probes = 9 net.ipv4.tcp_retries2 = 6
違規連接的netstat:
[email protected]:~# netstat -an | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN tcp 1 0 xx.xx.xx.xx:8080 xx.xx.xx.xx:49864 CLOSE_WAIT
IP的刪除,以保護無辜
更新
這是一個有點奇怪,但我覺得我應該補充一點,這似乎只有當我們的代碼在運行slicehost發生。在Amazon EC2實例上運行相同的「所有內容」不會出現問題。
你知道這個問題到底是什麼嗎?即時通訊面臨同樣的問題。 :( – ligerdave
我們使用SliceHost/Rackspace,我們的帳戶擁有「共享」帶寬;據我們所知,這與他們共享/強制帶寬的方式有關。當我們切換到亞馬遜時,問題完全消失。 –