2011-10-24 17 views
1

我們有一臺運行tomcat的服務器和使用iphones的客戶端。在iphone上,應用程序在池中使用ASIHTTPRequest(我沒有關於這部分的細節)。通常服務器會停止響應,當檢查netstat時,我們發現CLOSE_WAIT中有數百個連接。現在我可以確定的是,服務器正在等待將最終的ACK發送到手機,但電話不再存在或者沒有響應,因此在tomcat重新啓動之前連接會繼續掛起。Tomcat和ASIHTTPRequest

我通過在服務器上的Recv-Q中注意到剩下1個字節來確定這一點,這些連接中的每一個都是這樣的,也是由msdn決定的:「在關閉連接的一邊,你將有FIN_WAIT_2,這邊是發送最後的FIN_ACK和ACK,你將擁有CLOSE_WAIT。「

鏈接:http://blogs.msdn.com/b/spike/archive/2008/10/09/tcp-connections-hanging-in-the-close-wait-and-fin-wait-2-state.aspx

所以我的問題是有沒有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實例上運行相同的「所有內容」不會出現問題。

回答

0

事實證明這是主機提供商的問題,而不是服務器或庫中的問題。

+0

你知道這個問題到底是什麼嗎?即時通訊面臨同樣的問題。 :( – ligerdave

+0

我們使用SliceHost/Rackspace,我們的帳戶擁有「共享」帶寬;據我們所知,這與他們共享/強制帶寬的方式有關。當我們切換到亞馬遜時,問題完全消失。 –