我正在进行的项目之一是将某些 puppet 应用ulimit
设置从“听起来不错”改为根据环境动态分配。这适用于单应用程序环境,因此我最担心的是防止应用程序资源匮乏,同时保持内核和实用程序空间有足够的句柄等来做它们应该做的事情。
我们不断收到来自应用程序团队的请求更多文件句柄!所以我正在尝试找到一种方法来解决这个问题。所以我做了一个木偶事实:
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
在另一个 puppet 资源中使用此事实设置软和硬 nofile ulimit,以便更新 /etc/security/limits.conf,然后就大功告成了!简单!如果他们想要更多文件句柄,他们就必须更聪明地编写应用程序。
但它不起作用。当尝试su app2_user -
与具有该 ulimit 的用户打开用户会话 ()时nofile
,我们收到错误消息:
无法打开会话
这很糟糕。
显然,在某个地方存在一个独立于简单 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 操作。
答案1
这似乎是 PAM 的一个特性:
https://bugzilla.redhat.com/show_bug.cgi?id=485955
虽然不是确定的,但来源是可以去的地方,它是强烈这表明 PAM 正在对某些资源实施某种上限。当我使用 strace 查看命令时出现中断,su
以查看它尝试执行的操作是否被拒绝,然后我看到了以下行:
setrlimit(RLIMIT_NOFILE,{rlim_cur=1049000,rlim_max=1049000}) = -1 EPERM(操作不允许)
除了 PAM 故障之外,audit.log 中没有记录任何内容,syslog 也没有显示任何内容,只有这一次故障。
就我的目的而言,我会写下这个事实,即取静态值或内核最大文件数的 85% 中较低的一个。我需要做更多测试来确定这个静态值是多少,但似乎这种混合方法会得到工具的更好支持。