linux不能获取地址,在Linux中TIME_WAIT连接太多,得到“无法分配请求的地址”

我有一个小型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中运行.

是的,创建连接池是一个很好的解决方案.但是,更简单的解决方案是让服务器关闭连接,而不是客户端.在这种情况下,服务器的套接字而不是客户端将最终处于TIME_WAIT状态,因此客户端不会耗尽端口.在服务器端,处于TIME_WAIT状态的连接不会使服务器用完端口,因为它们都使用相同的本地端口.

要确保服务器关闭连接,您需要从套接字(在客户端上)读取,直到达到文件结束条件.此时,可以安全地关闭客户端上的套接字,因为服务器已经关闭了它.当然,您需要确保服务器关闭套接字,而不是等待新请求.

或者,如果您具有root访问权限,则可以调整一些sysctl个选项:

> net.ipv4.ip_local_port_range – 短暂端口的范围.增加它以使更多端口可用于传出连接.

> net.ipv4.tcp_tw_recycle – 在TIME_WAIT状态下更快地回收连接.

> net.ipv4.tcp_tw_reuse – 在TIME_WAIT状态下启用连接重用.不建议.

有关更多信息,请参见手册页ip(7)和tcp(7).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值