私が取り組んでいるプロジェクトの1つは、特定のパペットが適用されたulimit
設定を、「ほぼ正しい」から環境に基づいて動的に割り当てられるように移動することです。これは単一アプリケーション環境用であるため、カーネルとユーティリティスペースを十分なハンドルに保持し、必要な処理を実行しないようにしながら、アプリケーションがリソース不足になるのを防ぐことを主に心配しています。
App-teamsからmoarファイルハンドル!の永続的なリクエストを受け取るので、それに対処する方法を見つけようとしています。だから私は人形の事実を作りました:
Facter.add('app2_nofile') do
confine :kernel => 'Linux'
setcode do
kernel_nofile = `/bin/cat /proc/sys/fs/file-max`.chomp
app2_limit = (kernel_nofile.to_i * 0.85).round
app2_limit
end
end
それが缶に言うことをします。 /proc/sys/fs/file-max
で定義されたカーネル値を取り、その85%を取り、システム使用のために15%を残します。別のパペットリソースでこの::app2_nofile
ファクトを使用して、ソフトおよびハードのnofile ulimitを設定し、/ etc/security/limits.confを更新して、tada!シンプル!より多くのファイルハンドルが必要な場合は、アプリの作成について賢くする必要があります。
を除いて、それは機能しませんでした。そのnofile
ulimitを持つユーザーとのユーザーセッション(su app2_user -
)を開こうとすると、次のエラーメッセージが表示されます。
セッションを開くことができませんでした
どちらが悪いです。
明らかに、単純なulimitとは独立した上限がどこかにあります。あるいは、それらが基本的にどのように機能するかを理解しているのかもしれません。 nofile
制限はどのように相互作用し、セッションを作成できなくなる原因は何ですか?
さらなるテストは、上限が静的な境界であるか、単純なパーセンテージよりも複雑である可能性があることを示唆しています。ファイルの最大数が797,567の小さなRAMシステムでは、このulimitを非常に高く設定でき、再現できません。 1,619,938の大規模なシステムでは、「セッションを開くことができませんでした」と表示される前に、そのulimitを約63%に設定できます。そのパーセンテージがより大きなRAMで動くかどうかを確認するためにテストするために、今のところ大きなものは何もありません。
私はaudit.logエントリを取得します:
type=USER_START msg=audit(1416420909.479:511331): user pid=5022 uid=0 auid=1194876420 ses=44826
subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:session_open
acct="app2" exe="/bin/su" hostname=? addr=? terminal=pts/0 res=failed'
操作はPAM操作でした。
これはPAMの機能のようです。
https://bugzilla.redhat.com/show_bug.cgi?id=485955
決定的なものではありませんが、ソースはそのための場所ですが、PAMが特定のリソースに何らかの上限を適用していることを強く示唆しています。 su
コマンドでstraceを使用して、それが何をしようとしているかを確認しているときに中断が発生し、拒否されました。次の行が表示されました。
setrlimit(RLIMIT_NOFILE、{rlim_cur = 1049000、rlim_max = 1049000})= -1 EPERM(操作は許可されていません)
PAMの失敗以外はaudit.logに記録されません。syslogには何も表示されません。これは、この1つの失敗だけです。
私の目的のために、静的な値またはカーネルの最大ファイルの85%の低い方を取得するようにそのファクトを記述します。その静的な値がどうなるかを理解するためにさらにテストを行う必要がありますが、このハイブリッド方式はツールによってより適切にサポートされるようです。