很多 mysql 进程记录错误“打开文件过多”

很多 mysql 进程记录错误“打开文件过多”

我的 CentOS 服务器运行缓慢,htop 显示大约 40 行,我认为这是导致问题的原因:

27218 mysql      20   0 17.7G 7449M  5088 S  0.0 46.8  0:00.24 /usr/libexec/mysqld /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql/ --user=mysql --log-error=/var/log/mysqld.log --open-files-limit=102400 --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

服务器有 16 GB 的 RAM,其中 17.7G 为红色。打开文件数限制之前为 65535,因此我将其增加到 102400,但使用更高的数字仍显示相同的错误。

有人能告诉我如何开始调试吗?我检查了 mysqld.log,没有与此相关的内容,似乎错误是无法写入日志文件?

答案1

我猜测有 2 个问题:

  1. 您的系统已将 mysqld 用户守护进程的打开文件数限制为默认的 1024 个。请将其设置为更大的值,然后重新启动 mysqld:

    echo "mysql soft nofile 65536" >> /etc/security/limits.conf
    echo "mysql hard nofile 102400" >> /etc/security/limits.conf
    
  2. 您的 innodb_buffer_pool_size 对于您的有线内存来说太大:

编辑 my.cnf 并检查该值。也许可以尝试 50-60% 的有线内存。其他设置(例如每个线程的缓冲区大小)将影响该值,尤其是在有大量连接/会话的情况下。

innodb_buffer_pool_size=8G

不太可能 - 使用以下命令检查系统范围内的打开文件限制:

cat /proc/sys/fs/file-max

您可以在 /etc/sysctl.conf 中使用以下值进行设置,例如:

fs.file-max = 204800

然后使用以下命令加载 sysctl 更改:

sysctl -p

答案2

需要注意的统计数据是 46.8% 的内存占用,这表明物理内存使用率很高。17.7G 包括交换空间,因此可能不具指示性。如果系统限制已经是 65535,将打开文件限制增加到 102400 可能没有帮助。

我在测试服务器(centOS7 + VPS 上的 WHM/cPanel 构建)上看到了类似/重复的行。测试应用程序在 10-20% 的内存使用率下运行正常,但性能仍然很快。

相关内容