2014-03-28 4 views
5

Mac OS에서 Java Vert.x 웹 서버 (Netty 기반)의 확장 성을 테스트하려고합니다. 이를 위해 X., 나는 1 만 연결 제한을 증가 :"피어로 연결 재설정"및 "너무 많은 열린 파일"예외가 발생하여 Vert.x 서버를 수평 확장하려고합니다.

sudo sysctl -w kern.maxfiles=1000200 
sudo sysctl -w kern.maxfilesperproc=1000100 
sudo ulimit -n 1000000 

그럼 내가 만든 로컬 호스트 별명을 가진 :

for i in `seq 200 250`; do sudo ifconfig lo0 alias 172.16.123.$i ; done 

내가 지금이 IP 주소에 연결할 수 있어요; 내가 나열 할 때, 흥미롭게도

Caused by: java.net.SocketException: Too many open files 
    at sun.nio.ch.Net.socket0(Native Method) 
    at sun.nio.ch.Net.socket(Net.java:393) 
    at sun.nio.ch.Net.socket(Net.java:386) 
    at sun.nio.ch.SocketChannelImpl.<init>(SocketChannelImpl.java:104) 
    at sun.nio.ch.SelectorProviderImpl.openSocketChannel(SelectorProviderImpl.java:60) 
    at java.nio.channels.SocketChannel.open(SocketChannel.java:145) 
    at io.netty.channel.socket.nio.NioSocketChannel.newSocket(NioSocketChannel.java:48) 

:

java.net.SocketException: Connection reset by peer 
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) 
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:712) 
    at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:191) 
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:228) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:497) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:447) 

그들은 "열려있는 파일이 너무 많습니다"예외가옵니다 : 그러나, 주위 1000-2000 설정된 연결 후 나는 연결 "피어에 의해 연결 재설정"GET

tcp4  0 213 172.16.123.230.55618 172.16.123.230.8877 FIN_WAIT_1 
tcp4  0 213 172.16.123.229.55624 172.16.123.229.8877 FIN_WAIT_1 
tcp4  0 213 172.16.123.228.55617 172.16.123.228.8877 FIN_WAIT_1 
tcp4  0 213 172.16.123.227.55616 172.16.123.227.8877 FIN_WAIT_1 
tcp4  0 213 172.16.123.226.55612 172.16.123.226.8877 FIN_WAIT_1 

기타 결과 : NETSTAT 모든 연결은 내가 FIN_WAIT_1 상태에서 연결이 많이 있다는 것을 볼 수

$ netstat -a | wc -l: 
14282 
$ lsof | wc -l 
6922 

서버 코드 (간체) :

HttpServer server = vertx.createHttpServer(); 
server.websocketHandler(ws -> { 
    connections++; 
    ws.exceptionHandler(t -> t.printStackTrace()); 
    ws.closeHandler(h -> { 
     connections--; 
    }); 

    if (ws.path().equals("/app")) { 
     ws.dataHandler(data -> { 
      // ... 
     }); 
    } else { 
     ws.reject(); 
    } 
}).listen(8877); 

클라이언트 코드 (간체) :

Handler<Void> connectHandler = new Handler<Void>() { 
    @Override 
    public void handle(Void e) { 
     HttpClient client = vertx.createHttpClient().setHost(nextHost()).setPort(8877); 

     client.connectWebsocket("/app", ws -> { 
      connections++; 
      ws.exceptionHandler(t -> t.printStackTrace()); 
      ws.closeHandler(h -> { 
       connections--; 
      }); 

      // ... 
     }); 

     if (connections < 1000000) { 
      vertx.runOnContext(this); 
     } 
    } 
}; 
connectHandler.handle(null); 

모두 시작 (같은 컴퓨터에서) :

vertx run Class -cp classes:... -instances 8 

합니까 아무도 문제가 될 수있는 아이디어가 있습니까? 나는 아직 그러한 셋업을 경험하지 못했고 아마도 나는 단순한 실수를했을 것이다. 수락 백 로그를 늘리는 데 도움이되지 않습니다.

상세 내용 :

업데이트 :

limit maxfiles 1000100 2000200 
,691을 첨가 한 후 363,210

는 /etc/launchd.conf하고

kern.maxfiles=2000400 
kern.maxfilesperproc=1000200 

는 /etc/sysctl.conf에 컴퓨터를 다시 시작, 이미 조금 더 얻었다.

Caused by: sun.nio.fs.UnixException: Too many open files 
     at sun.nio.fs.UnixNativeDispatcher.getcwd(Native Method) 
     at sun.nio.fs.UnixFileSystem.<init>(UnixFileSystem.java:67) 
     at sun.nio.fs.BsdFileSystem.<init>(BsdFileSystem.java:41) 
     at sun.nio.fs.MacOSXFileSystem.<init>(MacOSXFileSystem.java:44) 
     at sun.nio.fs.MacOSXFileSystemProvider.newFileSystem(MacOSXFileSystemProvider.java:45) 
     at sun.nio.fs.MacOSXFileSystemProvider.newFileSystem(MacOSXFileSystemProvider.java:38) 
     at sun.nio.fs.UnixFileSystemProvider.<init>(UnixFileSystemProvider.java:56) 
     at sun.nio.fs.BsdFileSystemProvider.<init>(BsdFileSystemProvider.java:36) 
     at sun.nio.fs.MacOSXFileSystemProvider.<init>(MacOSXFileSystemProvider.java:40) 

업데이트 2 : 나는 여러 가지 시도

이상 만 개 열려있는 파일이 아니지만 그러나, 나는 후 난 정상 파일을 읽기 위해 지금 "열려있는 파일이 너무 많습니다"예외다면 다른 옵션도 있지만 초과 할 수없는 정확히 10180 연결에는 제한이있는 것으로 보입니다. 누군가 다른 아이디어가 없다면 아마도 리눅스로 전환 할 것입니다.

업데이트 3 : 나는 다음과 같은 예외를 얻을 때까지 지금 열려 16331 개 연결 할 수 있습니다

java.net.BindException: Can't assign requested address 
     at sun.nio.ch.Net.connect0(Native Method) 
     at sun.nio.ch.Net.connect(Net.java:435) 
     at sun.nio.ch.Net.connect(Net.java:427) 
     at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:643) 
     at io.netty.channel.socket.nio.NioSocketChannel.doConnect(NioSocketChannel.java:176) 

이 아마 때문이다 :

은 JVM 옵션 "-MaxFDLimit -XX"를 추가 한 후 기본 포트 범위 (16383 개 포트) :

net.inet.ip.portrange.first: 49152 
net.inet.ip.portrange.last: 65535 

그러나 50 개의 로컬 호스트를 사용하기 때문에 나는 ab 최대 16383 * 50 = 819150 개의 연결을 열 수 있습니다. 또는 다른 별칭에 대해 동일한 포트를 사용할 수 없다는 것이 알려진 제한 사항입니까?

업데이트 4 : 나는 networksetup 가상 인터페이스를 만들려고했지만 결과는 동일

: https://developer.apple.com/library/mac/documentation/Java/Reference/Java_VMOptionsRef/Articles/JavaVirtualMachineOptions.html

-XX:- MaxFDLimit :

for i in `seq 200 250`; do sudo networksetup -createnetworkservice lo$i lo0 ; sudo networksetup -setmanual lo$i 172.16.123.$i 255.240.0.0 ; done 
+0

'Ephemeral Ports'가 부족한 걸까요? – swKK

+0

@swKK localhost 또는 50 개의 별칭 모두에 연결할지 여부는 중요하지 않으므로 그렇게 생각하지 않습니다. 또한 portrange에는 16383 개의 포트가 있습니다. 어쨌든, 나는 그것을 늘리고 어떤 차이가 있는지 확인해 보겠습니다. –

+0

@swKK 유감스럽게도 임시 포트 범위를 늘리는 데는 도움이되지 않았습니다. –

답변

1

이 JVM 옵션이 추가

원래 대답 : Java file limit on OSX lower than in bash

+0

이 팁을 주셔서 감사합니다! 이제 16331 연결을 열 수 있고 "java.net.BindException : 요청 된 주소를 할당 할 수 없습니다"예외가 발생합니다. 이는 아마도 임시 포트 범위 제한 (현재 16383) 때문일 수 있습니다.하지만이를 회피하기 위해 50 개의 별칭을 사용하기 때문에 이유를 이해하지 못합니다. 나는 그 질문을 갱신 할 것이다. –

관련 문제