如何检查ulimit使用


29

有什么方法可以检查给定用户的ulimits使用情况吗?我知道您可以在启动时更改单个进程的ulimit,或者在运行时更改单个shell的ulimit,但是我希望能够“监视”用户接近其极限的距离。我正在计划编写一个bash脚本,该脚本将报告回statsd当前的使用百分比。具体来说,我想跟踪:

  1. 打开文件(ulimit -n
  2. 用户进程数上限(ulimit -u
  3. 待处理信号(ulimit -i

我想要的是使用百分比(0-100)。


如果您在内核中启用了进程记帐,则可以收集有关用户的详细使用情况统计信息。
casey 2015年

您如何打开流程记帐?
hazmat

这会增加多少开销?
hazmat

Answers:


22

也许这有助于解决第一个问题:

如果您知道特定用户的进程ID(PID),则可以使用以下方法获取每个进程的限制:

cat /proc/<PID>/limits

您可以使用以下命令获取每个PID的打开文件数:

ls -1 /proc/<PID>/fd | wc -l

然后只需将的值Max open files与第二个命令中打开的文件描述符的数量进行比较,即可得出百分比。


8

通过几种不方便的方法和标准工具,输出当前用户打开文件,proc和待处理信号的百分比:

paste <(grep 'open files\|processes\|pending signals' /proc/self/limits | 
        cut -c27-38) \
      <(i=`whoami` ; lsof -u $i | tail -n +2 | awk {'print $9'} | wc -l; 
                     ps --no-headers -U $i -u $i u | wc -l ; 
                     ps -u $i -o pid= | xargs printf "/proc/%s/status\n" |
                                        xargs grep -s 'SigPnd' |
                                        sed 's/.*\t//' | paste -sd+ | bc ; ) |
while read a b ; do echo $((${b}00/a))%; done

我的系统上的输出:

59%
9%
0%

假设这些数字是好的,那么这个答案表明它可以在shell中完成,但可能不应该这样做,除非有更好的shell方法。相反,这种问答会更好做gcc,或者python等。


-4

Ulimit是进程的属性,并继承到子进程。

您无法获得其他过程的限制。


2
废话。man lsofman ps,...
吉尔“SO-停止作恶”

1
您似乎误解了UNIX如何工作以及lsof如何获得其结果。lsof读取内核内存以获取值,lsof没有使用任何已记录的接口,因此,即使对内部内核数据结构进行了很小的更改,lsof也会失败。
2015年

2
当然,这对lsof维护人员来说是头疼的事。但与最终用户无关。在此问题的上下文中也是不正确的,因为它专门询问的是Linux,该文档已记录了接口(man proc)。
吉尔斯(Gillles)“所以-别再作恶了”

您所说的是未记录的接口,在这种情况下,如有更改,恕不另行通知。
schily

1
我不能对此表示拒绝的原因表示赞同,所以我只发表评论-1
Zun
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.