在 mysql 5.5 中更改打开文件限制

dav*_*idv 9 mysql ulimit open

我在使用 open-files-limit 参数在 Ubuntu 12.04 上运行 mysql 5.5 时遇到问题。

我最近注意到由于 1024 限制导致的一些问题,实际上主系统限制设置为 1024,因此我将 /etc/security/limits.conf 修改为以下内容:

* soft nofile 32000
* hard nofile 32000
root soft nofile 32000
root hard nofile 32000
Run Code Online (Sandbox Code Playgroud)

之后我检查 root 甚至 mysql 用户的 ulimit 值,都返回了新值:32000,所以我假设更改已经完成。

我还更改了 my.cnf 文件中的值,将 open-files-limit 设置为 24000,如下所示:

open-files-limit    = 24000
Run Code Online (Sandbox Code Playgroud)

现在是奇怪的部分,当我重新启动 mysql 服务并检查 open_files_limit 变量时,它返回它仍然设置为 1024,所以我遇到了与之前(显然)相同的问题,我尝试使用 open-files-limit而是 my.cnf 配置文件中的 open_files_limit,结果相同,但如果我覆盖服务命令以启动服务并仅使用 mysqld 启动(没有其他参数),服务将启动,当我检查参数时,它返回 32000...我不知道它从哪里获取该值,因为它不是在 my.cnf 中设置的,也不是通过命令行提供的,至少不是为我自己提供的。

关于为什么更改不起作用以及如何以正常方式解决它(通过服务启动它...)的任何想法?

小智 9

我终于找到了问题,似乎 upstart 没有使用在 /etc/security/limits.conf 中定义的参数,所以当我通过 service 命令启动 mysql 时(因此,在 upstart 下),它会覆盖那些定义的限制并使用默认 1024。

解决方法是修改定义 upstart 服务的 mysql.conf 文件,它位于 /etc/init/mysql.conf 并在 pre-start 块之前添加以下行:

# NB: Upstart scripts do not respect
# /etc/security/limits.conf, so the open-file limits
# settings need to be applied here.
limit nofile 32000 32000
limit nproc 32000 32000
Run Code Online (Sandbox Code Playgroud)

第一个值定义了软限制,另一个定义了硬限制,一旦添加了这些行,服务就会应用 my.conf 文件中定义的值按预期工作。

此限制应适用于在 /etc/init 中定义的每个 upstart 服务,因此如果任何服务在打开文件限制方面存在相同的问题,则此解决方案也应该有效。