获得~50个并发连接后,Java多线程套接字服务器挂起

时间:2011-01-24 11:06:00

标签: java sockets

所以基本上问题在标题中描述。 服务器以下列方式工作:

  • 收听新连接
  • 请求连接后 - 将请求添加到Q
  • 继续收听新连接
  • 单独的流程负责处理Q并生成一个新线程来处理客户的请求。

服务器代码类似于this tutorial(一切都在try / catch中,遗憾的是我无法显示源代码 - 公司政策)

它似乎运行得很好,直到客户端数量超过~50,然后它就会挂起,没有异常/警告/等等。有一个cpu线程限制为32k,打开文件数量没有限制/打开套接字/等OS = CentOS 5.5(在ubuntu tho中似乎也是如此)。服务器使用ODBC将数据记录到MySQL。两者的单独压力测试表明我可以拥有多达32k的java进程(受/ proc / sys / kernel / threads-max限制),而MySQL可以执行高达20k的简单操作/秒,所以我假设问题在于套接字

所以问题确实是:

  • 套接字连接的限制因素是什么?如何使其更大?
  • 或者我找错了地方?

2 个答案:

答案 0 :(得分:5)

您可能在代码中的某处导致了死锁。这里的关键指标是,如果“挂起”,则意味着服务器的CPU使用率降至零,服务器中没有进一步的活动。

当服务器挂起对其进程运行jdk tool: jstack时。这应该会告诉你什么在等什么锁。工具包中还有jvisualvm,如果在unix框中,一个简单的kill -3 pid将向stderr执行一个线程转储。

没有代码或至少是可重复的样本,恐怕我无法帮助更多。您可能希望看到的一件事是使用jetty作为您的嵌入式服务器而不是手持式服务器,它们已经遇到了死锁/线程故障,因此您不必这样做。

答案 1 :(得分:0)

不知道这是否对您有所帮助,如果您正在使用它,但尝试使用java开关“ -server ”运行套接字服务器,则会选择Java HotSpot Server VM。 -server打开优化JIT以及一些其他“服务器级”设置。通常,您可以从此设置中获得最佳性能。默认VM是-client。

同时检查您的其他参数,以便您的套接字服务器不会以最少的资源运行 祝你有愉快的一天