我有一個小型的Web應用程序,它打開一個TCP套接字連接,發出一個命令,讀取響應,然後關閉每個請求到特定REST端點的連接。太多的TIME_WAIT連接,得到「無法分配請求的地址」
我已經開始負載測試使用Apache JMeter的端點和我注意到,運行一段時間後,我開始看到類似「無法分配請求的地址」錯誤,該代碼打開此連接是:
def lookup(word: String): Option[String] = {
try {
val socket = new Socket(InetAddress.getByName("localhost"), 2222)
val out = new PrintStream(socket.getOutputStream)
val reader = new BufferedReader(new InputStreamReader(socket.getInputStream, "utf8"))
out.println("lookup " + word)
out.flush()
var curr = reader.readLine()
var response = ""
while (!curr.contains("SUCC") && !curr.contains("FAIL")) {
response += curr + "\n"
curr = reader.readLine()
}
socket.close()
curr match {
case code if code.contains(SUCCESS_CODE) => {
Some(response)
}
case _ => None
}
}
catch {
case e: Exception => println("Got an exception "+ e.getMessage); None
}
}
當我運行netstat時,我也看到很多下面的TIME_WAIT連接狀態,這意味着我在短暫的空間裏用完了端口。
tcp6 0 0 localhost:54646 localhost:2222 TIME_WAIT
tcp6 0 0 localhost:54638 localhost:2222 TIME_WAIT
tcp6 0 0 localhost:54790 localhost:2222 TIME_WAIT
tcp6 0 0 localhost:54882 localhost:2222 TIME_WAIT
我想知道什麼是最好的解決方案是這個問題。我目前的想法是創建一個連接池,其中連接到端口2222
上的此服務的連接可以被不同的HTTP請求重用,而不是每次都創建新的請求。這是解決問題並使應用程序擴展更好的明智方式嗎?看起來引入了很多開銷,並且使得我的應用程序更加複雜。
是否有任何其他解決方案來幫助此應用程序擴展並克服此端口問題,但我沒有看到?我的web應用程序在Ubuntu linux VM中運行。
你需要SO_REUSE_ADDR嗎?在這裏看到答案:http://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t – 2014-09-25 07:20:36
也http: //stackoverflow.com/questions/16014627/tcp-connection-cant-be-established-when-there-is-a-tcp-connection-with-state-t?rq = 1和幾百萬:)其他相關的問題 - 請參閱RHS列表 - > – 2014-09-25 07:22:11