在Linux上,單個進程打開的文件句柄的個數是有限制的。如果達到限制就會報」too many open files「。會在系統日誌裡面記錄。
如果是MySQL進程,mysql會報錯:[ERROR] Error in accept: Two many open files ,這時候就要排查是否是程序異常導致打開的文件句柄過多,如果是正常的業務增長就需要修改文件句柄的限制。
查看用戶句柄限制:
ulimit -n
進程使用的文件句柄查看:
lsof -n | grep [pid]
也可以直接查看進程的limits文件
cat /proc/[pid]/limits
修改文件句柄
ulimit -n 65535
這個修改只對當前的session生效,終端退出就恢復成原來的樣子。因此可以將這個命令添加到profile文件裡面,在啟動終端的時候加載。
在CentOS系統上可以修改對應的limits.conf文件永久生效:
在/etc/security/limits.conf文件末尾添加下面內容。
* soft core 102400* hard core 102400* hard nofile 10000* soft nofile 10000* hard nproc 10000* soft nproc 10000
*代表domain,就是全局的意思,可以改成具體的用戶名來限制某個用戶。soft / hard:這個當中的硬限制是實際的限制,而軟限制,是warnning限制,只會做出warning。nofile 代表max number of opened file,10000:代表最大打開句柄數
mysql配置中一般是open_table_cache,max_connections, open_files_limit 三個參數會影響到文件句柄。
open_table_cache是限制mysql 開啟 table 的 cache file 數,一般 mysql 開一個 table就會開啟 *.frm 和 *.ibd等文件,因此,這個至少要表數量的2倍以上。
max_connections: 最高連接,連接也是會佔用文件句柄的。
open_files_limit: 限制打開文件句柄的個數,但是如果系統限制了,這個參數設置比系統限制更大也不會生效的。