[ERROR] Error in accept: Too many open files in system

作者: admin 分类: linux 发布时间: 2010-12-24 09:01 ė 6 没有评论

mysql出现[ERROR] Error in accept: Too many open files in system

vi /etc/profile
ulimit -HSn 65535
source /etc/profile
下面是转载的相关解释
mysql非root启动解除文件句柄的1024限制的注意事项

问题描述:couldn’t increase number of open files to more than 1024
/usr/sbin/mysqld: Can’t open file: ‘./xxxx/xxxx.frm’ (errno: 24)

如果非root启动时不修改最大句柄数,启动日志就会出现:
: Can’t open file: ‘.\database\certain_table.frm’ (errno: 24)
查询原因:
[~]# perror 24
OS error code 24: Too many open files
待到句柄数耗光时,就会出现:
导致mysql无法应答新连接。
规避方法:
在root下修改ulimit后(比如ulimit -HSn 16666 ),
不能”su -” 或者”exit”到普通用户, 需要用su 到普通用户,否则修改的ulimit无效,导致句柄还是会不够用。
关于修改可打开最大文件句柄数,针对不同的linux系统有不同的方案

由於最近在 mysql 上面安裝了一些系統,導致 DB 裡的 table 量大增,突然有一天 mysql 自己就掛點了,看了 log 後發現訊息如下:
[ERROR] /usr/sbin/mysqld: Can’t open file: ‘./xxxx/xxxx.frm’ (errno: 24)
………………………………………
[ERROR] /usr/sbin/mysqld: Can’t open file: ‘./xxxx/xxxx.frm’ (errno: 24)
[ERROR] Error in accept: Too many open files
[ERROR] Error in accept: Too many open files

網路上的討論有很多,包括調整系統本身的 fs.file-max 大小,還有在 /etc/my.cnf 中加入 open_files_limit 的設定值,但是實際上,光是這樣的調整是不夠或方向是不對的,因為 mysql 要開多少的 files,真正相關的不只這些設定。

相關的設定有:

/proc/sys/fs/file-max
這是系統資源配置的最高檔案數,設定值與記憶體大小有關,早期 ram 很貴的時代,這個值通常不會太大,所以 mysql 開的檔案數如果太多,確實可能被這個值限制住,但是現在動輒數 G 的 memory,這個值在我的 linux 系統上都內定開到 20 萬以上,因此問題不在這個值。 (若真想修改這個值,可以用 sysctl -w fs.file-max=##### 來修改,但系統重開後自動改回,可寫入 /etc/rc.local 開機執行)

ulimit -n
ulimit 可以查看每個 shell 的使用資源大小,-n 參數在 man page 中是寫 The maximum number of open file descriptors,換句話說,mysql 所處的 shell,真的能開的檔案只是 ulimit -n 的值,在我的系統上 ulimit -n 的值僅有 1024,所以就算 fs.file-max 有幾十萬,mysql shell 可以開的就是 1024 而已,這才是關鍵所在。

my.cnf 中的 table_cache, max_connections, open_files_limit 三個參數
table_cache: mysql 5.1.3 版後已更名為 table_open_cache,指 mysql 開啟 table 的 cache file 數,一般 mysql 開一個 table 就會開啟 *.MYI 和 *.MYD 兩個檔,比方說我們用 phpMyAdmin 開一個有 100 個 tables 的 DB,mysql 會 cache 住 200 個 files。 (default: 64)
max_connections: 最高連線數。 (default: 100)
open_files_limit: mysqld 開啟的最高檔案數。 (default: 0)

理論上 mysqld 在 open file 後會 cache 住,那它要開到多少個檔案之後,才會去釋放掉 cache 的檔案?那就得看 my.cnf 裡面,table_cache, max_connections, open_files_limit 的值,如果 open_files_limits 的值為 0,就看 table_cache 和 max_connections 透過某個函數計算出來的值;如果 open_files_limits 的值不為 0,那應該是要看這個值的大小設定。

問題來了,那個函式怎麼算的,一般說法是 table_cache * 2 + max_connections,我自己的系統則是還要再 +10,我在 my.cnf 原本的設定是 table_cache 1024, max_connections 150, open_files_limits 則不設 (default: 0),結果計算出來是 1024 x 2 + 150 + 10 = 2208,所以照理論來說 mysql 可以開到 2208 個檔案。但實際卻在我 DB table 數大增後,便很容易因為文章一開頭的 error 讓 mysql 掛點了。

仔細一看 log 後更可以進一步發現這個 [Warning] Could not increase number of max_open_files to more than 1024 (request: 2208)。

換句話說,如果 table_cache * 2 + max_connections 超过 1024 就会有警告,而 1024 便是 ulimit -n 那個 1024,即 shell 的限定使用资源。因此 mysql 真正會掛的主因是,它认为可以開到 2208 个,但系統只給它开到 1024 个,所以 mysql 就会一直去开第 1025 个失败,然后mysql挂了

结论就是,不管我們要將我們的 mysql 设置 open_files_limit 或是使用 table_cache * 2 + max_connections,都应该要注意 ulimit -n 的值才是正解,跟 fs.file-max 关联反而较小了。

PS: 要查看 mysql 开启的 files 数,可先用 ps aux | grep mysql 看 mysql PID,再利用 lsof -p PID# | wc -l 来统计。
转载注明(LINUXQQ)

本文出自 小Q,转载时请注明出处及相应链接。

本文永久链接: http://www.linuxqq.com/archives/555.html

0
更多
Ɣ回顶部