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

Sig*_*ran 3 java sockets

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

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

服务器代码与本教程类似(一切都在try/catch中,遗憾的是我无法显示源代码 - 公司策略)

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

所以问题确实是:

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

Gar*_*vis 5

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

当服务器挂起运行jdk工具:jstack对它的进程.这应该会告诉你什么在等什么锁.同样在工具包中是jvisualvm,如果在unix框中,一个简单的kill -3 pid将执行到stderr的线程转储.

没有代码或至少一个可重复的样本我恐怕我不能帮助更多.你可能想要看到的一件事是使用jetty作为你的嵌入式服务器而不是手持式服务器,它们已经经历了死锁/线程的痛苦,所以你不必这么做.