在我们的开发系统之一(Ubuntu 21.10 桌面)上运行的自定义应用程序因错误而崩溃socket: Too many open files
。所以我立即检查了限制。这是输出:
$ ulimit -n
65535
Run Code Online (Sandbox Code Playgroud)
现在这很奇怪的原因是应用程序在崩溃时仅使用 1019 个套接字。鉴于可能还有其他一些文件描述符打开,我认为它达到了 1024 的限制。
为什么桌面ulimit -n
明确表示限制是 65535 却强加 1024 限制?
只是为了让这件事变得更加奇怪。我有两个应用程序。一个epoll
基于网络抓取工具和一个PACKET_MMAP
基于应用程序,该应用程序SYN
向多个网络服务器发送消息以启动连接。该epoll
应用程序不会崩溃,但使用的套接字数量远多于 1024 个。而使用原始套接字的基础应用程序却PACKET_MMAP
崩溃了。
此外,在服务器(也运行 Ubuntu)上测试的相同应用程序不会崩溃。
因此,无论问题是什么,它都是特定于桌面和原始套接字应用程序的。
编辑:
cat /proc/pid/limits
按要求输出:
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 31106 31106 processes
Max open files 1024 1048576 files
Max locked memory 1025802240 1025802240 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 31106 31106 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us
Run Code Online (Sandbox Code Playgroud)
输出显示最大打开文件的软限制实际上是 1024,这与ulimit -n
. 是什么赋予了?