Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程套接字服务器在获得~50个同时连接后挂起_Java_Sockets - Fatal编程技术网

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

Java多线程套接字服务器在获得~50个同时连接后挂起,java,sockets,Java,Sockets,所以基本上这个问题在标题中有描述。 服务器的工作方式如下: 侦听新连接 一旦请求连接-将请求添加到Q 继续侦听新连接 单独的进程负责一个Q,并生成一个新线程来处理客户机的请求 服务器代码类似于(所有内容都在try/catch中,很遗憾,我无法显示源代码-公司策略) 它似乎工作得很好,直到客户端数量超过~50,然后它就会挂起,没有异常/警告等。cpu线程限制为32k,打开文件/打开套接字的数量没有限制等。OS=CentOS 5.5(在ubuntu tho中似乎也是如此)。服务器使用ODBC将数

所以基本上这个问题在标题中有描述。 服务器的工作方式如下:

  • 侦听新连接
  • 一旦请求连接-将请求添加到Q
  • 继续侦听新连接
  • 单独的进程负责一个Q,并生成一个新线程来处理客户机的请求
服务器代码类似于(所有内容都在try/catch中,很遗憾,我无法显示源代码-公司策略)

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

所以问题是:

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

    • 很可能是您在代码中的某个地方导致了死锁。这里的关键指标是,如果“挂起”,您的意思是服务器的CPU使用率降至零,并且在服务器中看不到进一步的活动

      当服务器挂起时,对其进程运行。这应该会告诉你什么是等待什么锁。工具包中还有,如果在unix机器上,一个简单的
      kill-3PID
      会将线程转储到stderr


      没有代码或者至少有一个可复制的样本,恐怕我帮不了什么忙。您可能希望看到的一件事是将其用作嵌入式服务器而不是手动服务器,它们已经经历了死锁/线程痛苦,因此您不必这样做。

      不知道这是否会帮助您以及您是否正在使用它,但请尝试使用java switch“-server”运行套接字服务器,这将选择JavaHotSpot服务器VM,-Server打开优化JIT以及一些其他“服务器类”设置。通常,您可以从该设置中获得最佳性能。默认的VM是-client

      同时检查其他参数,使套接字服务器不会以最少的资源运行

      祝你度过愉快的一天

      +1此外,如果他至少告诉他服务器“挂起”时CPU的利用率是多少,那也会有所帮助。如果它很低,那肯定是一个僵局。jstack技巧是无价的。谢谢,死锁似乎就是它:)需要花一些时间来解决这个问题。任何形式的多线程编程都不适合胆小鬼。推荐的(几乎是必需的)读取是的,谢谢,实际上这是java.io.DataInputStream.readByte()的问题-它得到了一个意外的EOF和挂起,然后参数是默认值,所以它也会占用它想要的任何空间。。。应该有足够的资源来促进它。添加了-server switch,但这不是问题。嗨,你说“实际上是java.io.DataInputStream.readByte()的问题-它得到了意外的EOF并挂起了”-你能说明问题是什么以及你做了什么来修复它吗?@phobus Hi,问题是客户端停止发送它要发送的字符串(连接问题/延迟等),而服务器正在等待字符串的其余部分(直到找到定义的EOF)执行某些操作。我没有修复它,而是更改了它,因此它将只读取找到的内容,例如:
      int available=streamIn.available();虽然(available>0){byte cr=streamIn.readByte();if(cr==EOF){break;}myString+=(char)cr;available--;}
      抱歉,它在注释部分看起来不太好,但它是可读的,我希望您能理解。