gpt4 book ai didi

linux - 为什么创建的 socketchannels 可以超过 max open files?

转载 作者:太空宇宙 更新时间:2023-11-04 10:52:07 25 4
gpt4 key购买 nike

在linux中socket也是一个文件,所以如果同时存在太多的sockets并且超过max open files,就会抛出如下异常:

java.net.SocketException: Too many open files
at sun.nio.ch.Net.socket0(Native Method)
at sun.nio.ch.Net.socket(Net.java:423)
at sun.nio.ch.Net.socket(Net.java:416)
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:142)

到目前为止我能理解,但我对以下现象有点困惑。我在终端中执行了以下命令以查找最大打开文件数:

$ ulimit -n
1024

但实际上我通过以下代码创建了大约 4091 个套接字(SocketChannel):

while(true) {   
new Thread(new Runnable() {
public void run() {
//...
try {
SocketChannel scChannel = SocketChannel.open();
scChannel.connect(new InetSocketAddress(hostname, port));
ByteBuffer buffer = ByteBuffer.allocate(1024);
scChannel.read(buffer);
} catch (IOException e) {
//...
}
}
}).start();
}

从控制台我知道直到它创建了 4091 socketChannel,然后它抛出异常:

Start client 4091
java.net.SocketException: Too many open files

4091 大于 1024,为什么会这样? ulimit 的结果不是真正的最大打开文件数?

最佳答案

按照n.m.的建议,查看了jvm是否改了ulimit。而且我发现 jvm 确实有所作为。我通过 java 代码执行了 ulimit 命令,如下所示:

ProcessBuilder pBuilder = new ProcessBuilder("sh","-c","ulimit -n");
Process p = pBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while(line!=null){
System.out.println(line);
line = reader.readLine();
}

输出为4096——与终端输出不同。但我不知道 jvm 如何以及何时何地更改了 ulimit 值。

关于linux - 为什么创建的 socketchannels 可以超过 max open files?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30435437/

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