如何为启动时启动的服务设置 ulimits?

如何为启动时启动的服务设置 ulimits?

为了让 mysql 使用大页面,我需要设置 ulimit - 我在 limits.conf 中设置了此项。但是,limits.conf (pam_limits.so) 不会为 init 读取,只会为“真实”shell 读取。我之前通过在 initscript 启动函数中添加“ulimit -l”解决了这个问题。我需要某种可重复的方式来执行此操作,现在这些框由 chef 管理,我们不想接管实际上由 RPM 拥有的文件。

答案1

$ echo "* hard nofile 102400" >> /etc/security/limits.conf
$ echo "* soft nofile 102400" >> /etc/security/limits.conf
$ sysctl -w fs.file-max=102400
$ sysctl -p

这 4 个步骤可以立即更改系统的限制,并且在重启后仍然有效。您可以根据需要将数字“102400”更改为 Linux 系统中的最大打开文件数。并且

$ sysctl -p

从指定的文件或 /etc/sysctl.conf(如果未指定)加载 sysctl 设置。

答案2

/etc/sysctl.conf 应该能够设置 ulimits 项。我还没有对此进行很好的测试,但调查表明在 sysctl.conf 中设置后您应该能够停止。

我发现各种主题都表明这仍然是一个问题,我和我的团队就此问题讨论了一些选择,我们找到了两种潜在的解决方法。

选项 1:大多数 rhel initscripts 源 /etc/init.d/functions,您可以在那里更改 ulimit 设置

选项 2:init 声明每次在 init 生成任何内容之前都会获取 /etc/initscript,如下所示:http://linux.die.net/man/5/initscript。有趣的是,他们说人们可以在这里设置 ulimit =)

答案3

我的解决方案很简单,按照我们的厨师菜谱来做:

# Ensure ulimits are properly set for the initscript
bash "Set Ulimits" do
    user "root"
    code <<-EOH
    echo -e "n#Setting ulimits. Performed by chef recipe MYSQLULIMIT\nulimit -l" >> /etc/sysconfig/init
    EOH
    not_if "grep MYSQLULIMIT /etc/sysconfig/init"
end

这会导致ulimit -l所有启动脚本都被设置,这在某些环境中可能是不可取的,但对我来说没问题。

在理想情况下,我会更新 RPM 以包含/etc/sysconfig/mysqld,并在其中放入相同的 ulimit -l 命令。

答案4

RedHat 方式,如所述文章 253043(需要订阅)是向 中添加适当的 ulimit 语句/etc/sysconfig/<service name>。例如:

# echo "ulimit -SHn 10240   # nfile" >> /etc/sysconfig/myServiceName

(使用现有文件作为您的服务,而不是 myServiceName。)

对于不使用 RedHat“sysconfig”脚本启动的守护进程,您需要在守护进程启动脚本中添加适当的 ulimit 行。

相关内容