linux fopen個數限制的問題(檔案描述符限制)
問題出現的情況大概是這樣的:我有一個多執行緒程式,每個執行緒是要fopen一個檔案。當開啟到第900+個的時候,程式突然異常退出,原因是fopen得到的為空,及不能再開啟檔案了。這是我查看了一下程序最大開啟檔案描述符數:ulimit -Sn ,值是1024。ulimit -Hn,值是4096。我就懷疑是這個1024限制了執行緒的開啟檔案數。接下來我就參照以下文件改這個值。
ile Descriptor Requirements (Linux Systems)
To ensure good server performance, the total number of client connections, database files, and log files must not exceed the maximum file descriptor limit on the operating system (ulimit
After the directory server has exceeded the file descriptor limit of 1024 per process, any new process and worker threads will be blocked. For example, if the directory server attempts to open a Oracle® Berkeley JE database file when the operating system has exceeded the file descriptor limit, the directory server will no longer be able to open a connection that can lead to a corrupted database exception. Likewise, if you have a directory server that exceeds the file descriptor limit set by the operating system, the directory server can become unresponsive as the LDAP connection handler consumes all of the CPU's processing in attempting to open a new connection.
To fix this condition, set the maximum file descriptor limit per process on Linux machines.
To Increase the File Descriptor Limit (Linux)
- Display the current hard limit of your machine.
The hard limit is the maximum server limit that can be set without tuning the kernel parameters in proc file system.
$ ulimit -aH core file size (blocks) unlimited data seg size (kbytes) unlimited file size (blocks) unlimited max locked memory (kbytes) unlimited max memory size (kbytes) unlimited open files 1024 pipe size (512 bytes) 8 stack size (kbytes) unlimited cpu time (seconds) unlimited max user processes 4094 virtual memory (kbytes) unlimited
- Edit the /etc/security/limits.conf and add the lines:
* soft nofile 1000000 * hard nofile 1000000
- Edit the /etc/pam.d/login by adding the line:
session required /lib/security/pam_limits.so
- Use the system file limit to increase the file descriptor limit to 65535.
The system file limit is set in /proc/sys/fs/file-max .
echo 1000000> /proc/sys/fs/file-max
- Use the ulimit command to set the file descriptor limit to the hard limit specified in/etc/security/limits.conf.
ulimit -n 1000000
- Restart your system.
reboot
再次檢視unlimit -Sn ,值為1000000,unlimit -Hn,值為1000000.
再次跑我的程式的時候,順利突破1000的大關。這會兒已經跑到2000+了也沒出問題。
參考https://www.cnblogs.com/qq78292959/archive/2012/03/07/2383337.html。
參考https://blog.csdn.net/chinaclock/article/details/48346117?utm_source=blogkpcl8。
感謝這兩位博主的無私奉獻!