高负载下“java.net.ConnectException:连接超时”的可能原因?
Posted
技术标签:
【中文标题】高负载下“java.net.ConnectException:连接超时”的可能原因?【英文标题】:Possible causes for "java.net.ConnectException: Connection timed out" under high load? 【发布时间】:2013-09-16 16:01:06 【问题描述】:当我的客户端连接到服务器时,我遇到此“java.net.ConnectException:连接超时”异常。
它们都在同一个 LAN 中,在同一个集群中,它们之间没有防火墙。此外,它们对多达 1000 个客户也能正常工作,或多或少。当我启动 1200 个客户端时,其中许多(数百个)在连接到服务器时超时。每个客户端不断地向服务器发送请求,这会给服务器带来 cpu 负载,这在几个线程中约为 100%。
如何在不添加服务器或增加超时的情况下避免此问题?我也做过sudo sysctl -w net.core.somaxconn=2048
,但无济于事。
我正在使用 NIO 连接服务器:
SocketChannel serverChannel = SocketChannel.open();
serverChannel.connect(new InetSocketAddress(serverAddr, serverPort));
serverObjectOutStream = new ObjectOutputStream(Channels.newOutputStream(serverChannel));
serverObjectInStream = new ObjectInputStream (Channels.newInputStream (serverChannel));
至于服务器:
while (running)
SocketChannel newClientChannel = serverSocketChannel.accept();
ObjectInput cliInput = new ObjectInputStream (Channels.newInputStream (newClientChannel));
ObjectOutput cliOutput = new ObjectOutputStream(Channels.newOutputStream(newClientChannel));
// receive client's id and put it in a hashtable of id -> in,out channels
// acknowledge the client
【问题讨论】:
你确定服务器可以处理1200个并发客户端吗? 【参考方案1】:检查网络负载。所有这些客户端的 NIC 使用率是否达到 100%?此外,100% 的 CPU 可能是一个瓶颈。看一下这个。您没有提供太多细节,但还要检查您的操作系统是否需要调整。
如果排除硬件,则该检查软件了。
基本上,您遇到的是 C10K 问题。 这是一个非常好的读物(带有更多读物的链接) http://www.kegel.com/c10k.html
【讨论】:
【参考方案2】:显然,原因是服务器没有足够快地接受新连接,因为它处理了每个连接,只有在接受下一个连接之后。
这就是我最终解决它的方法,这样服务器就可以在接受新客户端的同时做一些事情,防止它们超时:
BlockingQueue acceptedConnections = new LinkedBlockingQueue<SocketChannel>();
// Thread 1 (connection acceptor):
public void run()
while (running)
SocketChannel newClientChannel = serverSocketChannel.accept();
acceptedConnections.add(newClientChannel);
// Thread 2 (connection handler):
public void run()
while (running)
SocketChannel newConn = acceptedConnections.take();
// handle new connection, while still accepting others
【讨论】:
以上是关于高负载下“java.net.ConnectException:连接超时”的可能原因?的主要内容,如果未能解决你的问题,请参考以下文章
在高并发高负载的情况下,如何给表添加字段并设置DEFAULT值?
【Linux】Linux系统下简单模拟高CPU\高内存\高负载的方法
在高并发高负载的情况下,如何给表添加字段并设置DEFAULT值?