mysql分区后Too many open files报错

来源:互联网 发布:葛底斯堡战役 知乎 编辑:程序博客网 时间:2024/05/28 18:43

错误日志

mysql错误日志:130806 12:05:14 [ERROR] Error in accept: Too many open files130806 12:09:30 [ERROR] Error in accept: Too many open files或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加 ulimit -n 8192

本次出现原因:在应用分区以后, mysql 打开文件数明显增多,因为每个区都要占用文件数。mysql打开文件数首先检查的OS层,然后才是mysql层。如果nginx的error.log出现大量的Too many open files,说明文件句柄不够用了,这时候我们需要加大系统的文件句柄数和nginx的允许最大的连接数。

【OS】 6.1之前有文件”/etc/security/limits.conf”中设置mysql可打开的文件数 6.1后有新增一个”/etc/security/limits.d/90-nproc.conf”个性化的配置文件。 如果两个都存在则已后者为准。

解决方案

【mysql】在配置文件”my.cnf”中[mysqld]下面添加关于打开文件限制的配置open_files_limit = 65535
此外innodb本身还有一个打开文件的限制:innodb_open_files = 300首先查看:ulimit -nulimit -alsof  -p MYSQL_PID | wc -l 打开文件数       然后调整相应的open-files-limitlsof  -p 49600 | wc -lcat /proc/sys/fs/file-maxsysctl -w fs.file-max=406914cat /proc/sys/fs/file-maxulimit -a |grep “open files”
able_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) show global variables like ‘%open%’;open_files_limit  这个数字少了点,这里有个算法:max_open_files_1 = max_connections + table_cache * 2 = 100 + 1000 * 2 = 2100max_open_files_2 = max_connections*5 = 100 * 5 = 500

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 个档案。但实际却在我 DBtable 数大增后,便很容易因为文章一开头的error 让 mysql 挂点了。

0 0
原创粉丝点击