起動時に開始するサービスにulimitsを設定する方法は?


18

mysqlでラージページを使用するには、ulimitを設定する必要があります。これは、limits.confで行いました。ただし、limits.conf(pam_limits.so)はinitには読み込まれず、「実際の」シェルに対してのみ読み込まれます。以前、initscriptの開始関数に「ulimit -l」を追加することでこれを解決しました。ボックスをchefで管理し、RPMが実際に所有しているファイルを引き継ぎたくないので、これを行うための何らかの反復可能な方法が必要です。


同じバグが発生しているかどうかを確認してください。 serverfault.com/questions/415570/...
ミントジョセフ

回答:


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つの手順により、システムの制限をすぐに変更でき、再起動後も引き続き機能します。必要に応じて、数字「102400」をLinuxシステムの最大オープンファイル数に変更できます。そして

$ sysctl -p

指定されたファイルからsysctl設定をロードするか、何も指定されていない場合は/etc/sysctl.confをロードします。


2
limit.soは読み込まれないため、limits.confはinittabによって読み込まれません。PAMをハッキングできるかもしれませんが、PAMが読み取る可能性のあるファイルを把握できません。
Xarses

ワイルドカードは、その注意*のために仕事しないrootユーザー、ユーザーが指定する必要がありますroot明示的に...
マット・

@Xarsesは正しい。limit.confは、ブート時に開始される一部のデーモンには適用されません。これが質問に答えるとは思わない。
錬金術師

2

/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 =)を設定できると言います


1

この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

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すべてのinitscriptが設定されます。これは環境によっては望ましくない場合がありますが、私の場合は問題ありません。

完璧な世界では、RPMを更新してaを含め、/etc/sysconfig/mysqldそこに同じulimit -lコマンドを入れます。


0

これがどのようにディストリビューション固有かは定かではありませんが、/etc/security/limits.d/20-somefile.confUbuntuで使用することでセキュリティ制限の増加を取り入れました。

既存のファイルを変更するのではなく、クックブックに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] %>

0

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/


0

RedHatの方法は、記事253043(サブスクリプションが必要)で説明されているように、適切なulimitステートメントをに追加すること/etc/sysconfig/<service name>です。例えば:

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

(myServiceNameの代わりに、サービスの既存のファイルを使用します。)

RedHat "sysconfig"スクリプトを使用せずに起動するデーモンの場合、デーモン起動スクリプトに適切なulimit行を追加する必要があります。


-1

/etc/sysctl.confファイルで設定してみてください


sysctl.confに属し、これを行うために必要な設定の部分があり、それらは適切です-それらのhugepagesにアクセスできるようにulimitsを修正する必要があります。
jayofdoom

-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

一部の初期化スクリプトが正しく機能しないことはないと思われるため、ルート部分は重要です。そのため、以下をセットアップするシェフクックブックがあり、それはうまく機能します。

Tomcatで使用した別のオプションは、Tomcatをデプロイしてから、initスクリプトをカスタムで上書きし、ulimitを設定してTomcatを再起動することでした。これはうまく機能しますが、最初の方法よりも少しハッキーです。

私はこの助けを願っています。そして、いつか私たちが内部的に持っているクックブックをオープンソースにできるかもしれません。


これは、ポスターの問題を解決しません。Pamは、ユーザーがセッション(シェル)を開いたときにのみ呼び出されます。initシステムはユーザーセッションとは無関係に起動されるため、pamは適用されません。
パトリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.