gpt4 book ai didi

macos - 尝试横向扩展 Vert.x 服务器时出现 "Connection reset by peer"和 "Too many open files"异常

转载 作者:行者123 更新时间:2023-12-04 21:42:39 26 4
gpt4 key购买 nike

我正在尝试在 Mac OS X 上测试 Java Vert.x 网络服务器(基于 Netty)的可扩展性。为此,我将连接限制增加到 100 万:

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

然后我创建了 localhost 别名:
for i in `seq 200 250`; do sudo ifconfig lo0 alias 172.16.123.$i ; done

我现在可以连接到这些 IP 地址;但是,在建立了大约 1000-2000 个连接后,我得到“对等连接重置”连接:
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)

它们之后是“打开的文件太多”异常:
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)

有趣的是,当我使用 netstat 列出所有连接时,我看到有很多连接处于 FIN_WAIT_1 状态:
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 -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

有人知道可能是什么问题吗?我还没有这种设置的经验,也许我只是犯了一个简单的错误。增加接受积压无济于事。

更多的信息:
  • http://krypted.com/mac-os-x/maximum-files-in-mac-os-x/
  • Virtual network interface in Mac OS X

  • 更新:

    添加后
    limit maxfiles 1000100 2000200

    到/etc/launchd.conf 和
    kern.maxfiles=2000400
    kern.maxfilesperproc=1000200

    到/etc/sysctl.conf 并重新启动计算机,它已经好一点了。但是,在我现在得到“打开的文件太多”异常之后,即使打开的文件不超过 10000 个,即使读取普通文件也是如此:
    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 个连接的限制,不能超过。除非有人有其他想法,否则我可能会切换到 linux。

    更新 3 :

    添加 JVM 选项“-XX:-MaxFDLimit”后,我现在可以打开 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)

    这可能是因为默认端口范围(16383 个端口):
    net.inet.ip.portrange.first: 49152
    net.inet.ip.portrange.last: 65535

    但是,由于我使用 50 个 localhost 别名,因此我预计最多可以打开 16383 * 50 = 819150 个连接。或者您不能为不同的别名使用相同的端口是一个已知的限制?

    更新 4 :

    我试图用networksetup创建虚拟接口(interface),但结果是一样的:
    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

    最佳答案

    关于macos - 尝试横向扩展 Vert.x 服务器时出现 "Connection reset by peer"和 "Too many open files"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22724334/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com