gpt4 book ai didi

Java 多线程套接字服务器在获得约 50 个同时连接后挂起

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:57:14 24 4
gpt4 key购买 nike

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

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

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

它似乎工作得很好,直到客户端数量超过 ~ 50,然后它就挂起,没有异常/警告/等。cpu 线程限制为 32k,打开文件/打开的数量没有限制套接字/等 OS = CentOS 5.5(在 ubuntu 中似乎也发生了同样的事情)。服务器使用 ODBC 将数据记录到 MySQL。两者的单独压力测试表明我最多可以有 32k 个 java 进程(受/proc/sys/kernel/threads-max 限制)并且 MySQL 每秒最多可以执行 20k 个简单操作,所以我假设问题出在套接字上.

所以真正的问题是:

  • 套接字连接的限制因素是什么?我怎样才能让它变大?
  • 还是我看错地方了?

最佳答案

很可能您在代码中的某处引发了死锁。这里的关键指标是,如果“挂起”是指服务器的 CPU 使用率下降到零,并且在服务器中看不到任何进一步的 Activity 。

当服务器挂起时运行jdk tool: jstack反对它的过程。这应该告诉你什么在等待什么锁。工具包中还有 jvisualvm如果在 unix 机器上,一个简单的 kill -3 pid 将把线程转储到 stderr。

没有代码或至少没有可重现的示例,恐怕我帮不上什么忙。你可能想看看的一件事是使用 jetty作为您的嵌入式服务器而不是手动服务器,它们已经解决了死锁/线程问题,因此您不必再这样做。

关于Java 多线程套接字服务器在获得约 50 个同时连接后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4781232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com