2013-09-16 40 views
0

我在客户端连接到服务器时遇到了“java.net.ConnectException:Connection timed out”异常。高负载下“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 
} 
+0

你确定服务器可以处理1200个并发客户端? – Joni

回答

0

检查网络负载。所有这些客户端的网卡使用率是否达到100%?而且,100%的CPU可能是瓶颈。看一下这个。你不会提供太多的细节,但也可以检查你的操作系统是否需要调整。

如果您排除硬件,是时候检查软件了。

基本上,你有什么是C10K的问题。 下面是关于它的一个非常好的读(与链接到更多阅读) http://www.kegel.com/c10k.html

0

显然,原因是该服务器没有接受新的连接到足够快,因为它处理他们每个人,只接受后下一个连接。

那怎么我终于解开了它,从而使服务器可以做的东西,同时还接受新客户端,防止超时他们:

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 
    } 
} 
相关问题