【发布时间】:2014-11-19 01:55:44
【问题描述】:
我有一个小型 Web 应用程序,它打开 TCP 套接字连接、发出命令、读取响应,然后关闭对特定 REST 端点的每个请求的连接。
我已经开始使用 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 吗?在这里查看答案:stackoverflow.com/questions/14388706/…
-
还有 stackoverflow.com/questions/16014627/… 和几百万个 :) 其他相关问题 - 请参阅 RHS 上的列表 ->
标签: linux scala sockets tcp scalability