2011-01-24 32 views
3

所以基本上在标题中描述了该问题。 服务器工作在以下方式:Java多线程套接字服务器在获得约50个同时连接后挂起连接

  • 监听到一个新的连接
  • 一旦连接请求 - 将请求发送到Q,
  • 继续侦听新的连接
  • 独立的过程需要关心Q并产生一个新线索来处理客户的要求。

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

这似乎很好地工作,直到客户端的数量超过〜50,然后挂起,没有例外/警告/等等。有一个32k的cpu线程限制,对打开的文件/打开的套接字/等的数量没有限制。OS = CentOS 5.5(同样的情况发生在ubuntu tho )。服务器使用ODBC将数据记录到MySQL。单独的压力测试表明,我可以有多达32k的java进程(受/ proc/sys/kernel/threads-max限制),MySQL可以执行高达20k次的简单操作/秒,所以我假设问题出在插槽。

所以,真正的问题是:

  • 什么是套接字连接的限制因素,我怎么可以把它做大?
  • 或者我看错了地方?
+0

嗨,那你的意思,当你说:“其实它与java.io.DataInputStream中的一个问题.readByte() - 它得到一个意想不到的EOF并挂起然后“ - 你能显示出问题是什么以及你做了什么来解决它? – phobus 2011-03-17 09:13:10

+0

@phobus嗨,问题是客户端停止发送它要发送的字符串(连接问题/延迟等),服务器正在等待字符串的其余部分(直到找到定义的EOF)才能执行某些操作。我没有修复它,我宁愿修改它,所以它只会读取它找到的内容,例如: `int available = streamIn.available(); while(available> 0) \t { \t \t byte cr = streamIn.readByte(); \t \t如果(CR == EOF) \t \t { \t \t \t中断; \t \t} \t \t myString + =(char)cr; \t \t可用 - ; \t}` – Sigtran 2011-03-18 11:15:31

+0

对不起,它在评论部分看起来不太好,但它的可读性好,我希望你明白。 – Sigtran 2011-03-18 11:18:59

回答

5

您有可能在代码中的某处导致了死锁。这里的关键指标是,如果通过“挂起”,您的意思是服务器的CPU使用率下降为零,并且服务器中没有看到进一步的活动。

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

无法使用代码或至少可重现的示例,恐怕我无法提供更多帮助。你可能想要看的一件事是使用jetty作为你的嵌入式服务器而不是一个手工的服务器,它们已经经历了死锁/线程化的痛苦,所以你不必这样做。

0

不知道这是否会帮助你,如果你正在使用它,但尝试运行你的套接字服务器与Java开关“-server”,这将选择Java HotSpot服务器虚拟机。关于优化JIT以及其他一些“服务器级”设置。一般来说,您可以通过此设置获得最佳性能。默认的VM是-client。

还要检查你的其他参数,可以使以最少的资源
您的套接字服务器鸵鸟政策运行有一个愉快的一天

相关问题