如何在启动时为服务设置ulimit?


18

我需要让mysql使用大页面来设置ulimit-我已经在limits.conf中做到了。但是,limits.conf(pam_limits.so)不会为init读入,仅对于“真实” shell才读入。我通过在初始脚本启动函数中添加“ ulimit -l”来解决此问题。我现在需要某种可重复的方式来执行此操作,因为这些框是由厨师管理的,并且我们不希望接管RPM实际拥有的文件。


请看一下是否遇到相同的错误。 serverfault.com/questions/415570/...
明托约瑟夫

Answers:


8
$ 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个步骤可以立即更改系统的限制,并且在重新启动后仍然可以工作。您可以根据需要在Linux系统中将数字“ 102400”更改为最大打开文件数。和

$ sysctl -p

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


2
inittab无法读取limits.conf,因为不会读取limit.so。您也许可以破解PAM,但我无法弄清楚它可能读取哪个文件。
Xarses

请注意,通配符*不适用于root用户,您必须root明确指定...
Matt

@Xarses是正确的。在启动时开始,limit.conf不会应用于某些守护程序。我不认为这可以回答问题。
炼金术士

2

/etc/sysctl.conf应该能够设置ulimits项目。我无法对此进行良好的测试,但是调查显示,在sysctl.conf中对其进行设置后,您应该可以停止。

我发现各种主题表明仍然存在问题,并且我的团队和我讨论了一些解决方案,我们发现了两种潜在的解决方法。

选项1:大多数rhel初始化脚本都来自/etc/init.d/functions,您可以在那里更改ulimit设置

选项2:init声称/ etc / initscript每次都在init产生之前被获取,请参见:http : //linux.die.net/man/5/initscript。有趣的是,他们说出人们可以在其中设置ulimit =)


1

基于以下网址的独立配方片段:

http://pro.benjaminste.in/post/318453669/increase-the-number-of-file-descriptors-on-centos-

食谱摘要:

ruby_block "edit /etc/sysctl.conf" do
  _file = "/etc/sysctl.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "fs.file-max = 512000"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
  notifies :run, "execute[sysctl -p]", :immediately
end

execute "sysctl -p" do
  command "sysctl -p"
  returns 255 # which would normally signify error, but doesn't on sysctl on CentOS
  action :nothing
end

ruby_block "edit /etc/security/limits.conf" do
  _file = "/etc/security/limits.conf"
  _comment = "# TWEAK BY CHEF"
  _content = "* - nofile 65535"
  block do
    file = Chef::Util::FileEdit.new(_file)
    file.insert_line_if_no_match(/#{Regexp.escape(_comment)}/, "#{_comment}\n#{_content}")
    file.write_file
  end
  not_if "cat #{_file} | grep '#{_comment}'"
end

0

我的解决方案只是在厨师食谱中做到这一点:

# 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命令。


0

不确定这是特定于发行版的,但是我刚刚通过/etc/security/limits.d/20-somefile.conf在Ubuntu中使用来增加了安全限制。

无需修改现有文件,我的食谱中就有一个ERB模板,可以在属性文件中设置默认属性,然后不必担心将红宝石块与“ insert_line_if_no_match”内容一起使用-看起来更加复杂,并且配方更像这样可读:

execute "activate_sysctl" do
  user "root"
  command "sysctl -p /etc/sysctl.d/10-filemax.conf"
  action :nothing
end

template "/etc/sysctl.d/10-filemax.conf" do
  source "system/filemax.conf"
  action :create
  notifies :run, "execute[activate_sysctl]", :immediately
end

然后这是我的模板文件:

fs.filemax = <%= node[:mycookbook][:system_fs_filemax] %>

0

根据手册页,ulimit已过时。您需要使用setrlimit。问题在于这是系统调用而不是bash命令。

我在主管那里遇到了这个问题,这就是我发现的。如果该进程没有配置文件,该文件允许您调用setrlimit()系统调用。在其/etc/init.d bash脚本上使用ulimit进行设置。那就是启动您的过程的服务脚本。

如果该进程有一个配置文件,例如supervisor d,那么您可以使用该配置文件来设置文件数,并使该进程直接调用setrlimits()。

主管:http : //supervisord.org/configuration.html#supervisord-section-settings

TomcaT:http//www.jayway.com/2012/02/11/how-to-really-fix-the-too-many-open-files-problem-for-tomcat-in-ubuntu/


0

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

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

(将现有文件用于服务而不是myServiceName。)

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


-1

尝试在/etc/sysctl.conf文件中进行设置


为此,需要进行一些配置,这些配置属于sysctl.conf,并且已经配置好了-我们只需要修改ulimits即可访问那些大页面。
jayofdoom 2012年

-1

我实际上写了一本私人厨师食谱,用来为我们设置ulimit,效果很好。对于ubuntu,我们发现如果需要全局ulimit设置,则需要以下技巧:

将以下内容添加到您的普通会话中:

session required        pam_limits.so

在limit.conf中,您必须具有以下内容:

* soft  nofile  64000
* hard  nofile  65000

root  soft  nofile  64000
root  hard  nofile  65000

根部分很重要,因为如果没有某些init脚本,它将似乎无法正常工作。因此,我们有一本厨师食谱来设置以下内容,并且效果很好。

我们以前用于Tomcat的另一个选项是部署Tomcat,然后使用自定义脚本覆盖初始化脚本,该自定义脚本将设置ulimit并重新启动tomcat。这很好用,但是比起第一个来说有点麻烦。

我希望能有所帮助,也许有一天我可以在内部公开我们的食谱,因为它非常简单,但可能对像您这样的其他人有所帮助。


这不会解决张贴者的问题。仅当用户打开会话(shell)时才调用Pam。由于初始化系统是独立于用户会话启动的,因此pam不适用。
帕特里克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.