Answers:
$ 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设置(如果未给出)。
*
不适用于root
用户,您必须root
明确指定...
/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 =)
基于以下网址的独立配方片段:
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
我的解决方案只是在厨师食谱中做到这一点:
# 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命令。
不确定这是特定于发行版的,但是我刚刚通过/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] %>
根据手册页,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/
如文章253043中所述(需要订阅),RedHat方式是向添加适当的ulimit语句/etc/sysconfig/<service name>
。例如:
# echo "ulimit -SHn 10240 # nfile" >> /etc/sysconfig/myServiceName
(将现有文件用于服务而不是myServiceName。)
对于不使用RedHat“ sysconfig”脚本启动的守护程序,您需要向守护程序启动脚本中添加适当的ulimit行。
尝试在/etc/sysctl.conf文件中进行设置
我实际上写了一本私人厨师食谱,用来为我们设置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。这很好用,但是比起第一个来说有点麻烦。
我希望能有所帮助,也许有一天我可以在内部公开我们的食谱,因为它非常简单,但可能对像您这样的其他人有所帮助。