java多线程SOCKET程序问题
去年在一个项目中,我设计了一个多线程的UDP通信程序,我们的一个主机在四个地方收发数据包。它已经在生产环境中稳定运行了1年。
最近随着业务的增加,远程连接数增加到12个,即一个IP向12个IP发送和接收数据包。
我在主线程里,管理这12个独立的通信线程,互不干扰。由于服务器是2U4核心,本方案的设计具有一定的可扩展性。可是最近维修人员告诉我们,某个地方要停业了。检查,线程异常终止。实际上,报告是:端口已经绑定,最常见的异常。但是在控制台中,重启这个线程,就可以正常启动,稳定运行。而且每次发生的概率都很随机,有时候死一个,有时候死三个,或者都是正常的。
去年程序做了很多压力测试,都没有发现这个问题。原因是线程的数量增加了三倍。仔细分析发现,多线程的启动方式是在spring中管理和注册jmx,每个线程都预先配置成mbean。启动时,注入一张地图,开始回收。udp通信模式是端口由OS随机分配。会不会是线程的请求太快,而OS没有锁口缓存的策略?我想到了这一点,在循环启动bean的方法中加入了Thread.sleep(100)。再次测试,解决。
最后,我认为操作系统在分配随机端口时可能没有锁定机制。如果一个线程的请求是高并发的,可能会有重叠,这将导致最简单的错误,端口lready bind。要解决这个问题,第一件事是尽可能延长启动间隔,尤其是在多个并发服务器上,第二件事是人为控制端口的分配。
0条评论