sys*_*138 5 linux redhat ulimit pam rhel6
我正在从事的项目之一是将某些人偶应用的ulimit设置从“听起来不错”转移到基于环境动态分配的设置。这是针对单应用程序环境的,所以我最担心的是防止应用程序资源匮乏,同时将内核和实用程序空间保持在足够的句柄中,以及不做他们应该做的事情。
我们从应用程序团队收到了对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
Run Code Online (Sandbox Code Playgroud)
它做它在锡上所说的。它采用中定义的内核值/proc/sys/fs/file-max并占用其中的 85%,留出 15% 用于系统使用。::app2_nofile在另一个 puppet 资源中使用这个事实设置一个软和硬 nofile ulimit ,所以 /etc/security/limits.conf 被更新,tada!简单的!如果他们想要更多的文件句柄,他们就必须更聪明地编写应用程序。
除了,它没有工作。尝试su app2_user -与具有该nofileulimit的用户打开用户会话 ( ) 时,我们收到错误消息:
无法打开会话
这是不好的。
显然,有一个独立于简单 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'
Run Code Online (Sandbox Code Playgroud)
op 是一个 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 没有显示任何内容,这只是这一失败。
出于我的目的,我将把这个事实写为取静态值或内核最大文件数的 85% 中的较低者。我需要做更多的测试来弄清楚静态值是什么,但工具似乎会更好地支持这种混合方法。