mysqlでラージページを使用するには、ulimitを設定する必要があります。これは、limits.confで行いました。ただし、limits.conf(pam_limits.so)はinitには読み込まれず、「実際の」シェルに対してのみ読み込まれます。以前、initscriptの開始関数に「ulimit -l」を追加することでこれを解決しました。ボックスをchefで管理し、RPMが実際に所有しているファイルを引き継ぎたくないので、これを行うための何らかの反復可能な方法が必要です。
mysqlでラージページを使用するには、ulimitを設定する必要があります。これは、limits.confで行いました。ただし、limits.conf(pam_limits.so)はinitには読み込まれず、「実際の」シェルに対してのみ読み込まれます。以前、initscriptの開始関数に「ulimit -l」を追加することでこれを解決しました。ボックスをchefで管理し、RPMが実際に所有しているファイルを引き継ぎたくないので、これを行うための何らかの反復可能な方法が必要です。
回答:
$ 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
指定されたファイルからsysctl設定をロードするか、何も指定されていない場合は/etc/sysctl.confをロードします。
*
のために仕事しないroot
ユーザー、ユーザーが指定する必要がありますroot
明示的に...
/etc/sysctl.confは、ulimitsアイテムを設定できるはずです。私はこれをうまくテストできませんでしたが、調査によると、sysctl.confで設定した後に停止できるはずです。
しかし、それがまだ問題であることを示すさまざまなトピックを見つけました。私のチームと私はこれについていくつかのオプションを議論しました。2つの潜在的な回避策が見つかりました。
オプション1:ほとんどのrhel initscriptsのソースは/etc/init.d/functionsです。そこでulimit設定を変更できます
オプション2:initは、initがhttp://linux.die.net/man/5/initscriptを参照するものを生成する前に、/ etc / initscriptが毎回ソースされると主張します。興味深いことに、彼らは人々がulimit =)を設定できると言います
このURLに基づいた自己完結型のレシピスニペット:
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
すべてのinitscriptが設定されます。これは環境によっては望ましくない場合がありますが、私の場合は問題ありません。
完璧な世界では、RPMを更新してaを含め、/etc/sysconfig/mysqld
そこに同じulimit -lコマンドを入れます。
これがどのようにディストリビューション固有かは定かではありませんが、/etc/security/limits.d/20-somefile.conf
Ubuntuで使用することでセキュリティ制限の増加を取り入れました。
既存のファイルを変更するのではなく、クックブックにERBテンプレートを用意し、属性ファイルにデフォルトの属性を設定してから、「insert_line_if_no_match」のものでrubyブロックを使用することを心配する必要はありません。レシピは次のようにもう少し読みやすいです:
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] %>
manページによると、ulimitは非推奨です。setrlimitを使用する必要があります。問題は、bashコマンドではなくシステムコールであるということです。
私はスーパーバイザーでこの問題を抱えていましたが、これが私が見つけたものです。プロセスにsetrlimit()システムコールを呼び出すことができる設定ファイルがない場合。/etc/init.d bashスクリプトでulimitを使用して設定します。これがプロセスを開始するサービススクリプトです。
プロセスに設定ファイル(スーパーバイザー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/
RedHatの方法は、記事253043(サブスクリプションが必要)で説明されているように、適切なulimitステートメントをに追加すること/etc/sysconfig/<service name>
です。例えば:
# echo "ulimit -SHn 10240 # nfile" >> /etc/sysconfig/myServiceName
(myServiceNameの代わりに、サービスの既存のファイルを使用します。)
RedHat "sysconfig"スクリプトを使用せずに起動するデーモンの場合、デーモン起動スクリプトに適切なulimit行を追加する必要があります。
実際に、ulimitを設定するために使用されるプライベートシェフクックブックを作成しました。ubuntuでは、グローバルなulimit設定が必要な場合、次のトリックが必要であることがわかりました。
以下を共通セッションに追加します。
session required pam_limits.so
また、limit.confには次のものが必要です。
* soft nofile 64000
* hard nofile 65000
root soft nofile 64000
root hard nofile 65000
一部の初期化スクリプトが正しく機能しないことはないと思われるため、ルート部分は重要です。そのため、以下をセットアップするシェフクックブックがあり、それはうまく機能します。
Tomcatで使用した別のオプションは、Tomcatをデプロイしてから、initスクリプトをカスタムで上書きし、ulimitを設定してTomcatを再起動することでした。これはうまく機能しますが、最初の方法よりも少しハッキーです。
私はこの助けを願っています。そして、いつか私たちが内部的に持っているクックブックをオープンソースにできるかもしれません。