Как проверить использование ulimit

29

Есть ли способ проверить использование ulimits для данного пользователя? Я знаю, что вы можете изменить ulimits для одного процесса при запуске или для одной оболочки при запуске, но я хочу иметь возможность «отслеживать», насколько близко пользователь находится в пределах своих ограничений. Я планирую написать bashскрипт, который будет сообщать statsd текущий процент использования. В частности, я хочу отслеживать:

  1. открыть файлы ( ulimit -n)
  2. максимальное количество пользовательских процессов ( ulimit -u)
  3. ожидающие сигналы ( ulimit -i)

То, что я хочу, это процент использования (0-100).

HazMat
источник
если в вашем ядре включен учет процессов, вы можете собирать подробную статистику использования ваших пользователей.
Кейси
Как включить процесс учета?
Хазмат
И сколько накладных расходов это добавляет?
Хазмат

Ответы:

22

Может быть, это помогает для первого вопроса:

Если вам известны идентификаторы процессов (PID) конкретного пользователя, вы можете получить ограничения для каждого процесса с помощью:

cat /proc/<PID>/limits

Вы можете получить количество открытых файлов для каждого PID с помощью:

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

А затем просто сравните значение Max open filesс количеством дескрипторов открытых файлов из второй команды, чтобы получить процент.

m13r
источник
8

Выведите процент текущего пользователя для открытых файлов, процедур и ожидающих сигналов, используя несколько неудобных методов и стандартных инструментов:

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%

Предполагая, что эти числа хороши, этот ответ показывает, что это можно сделать в оболочке, но, вероятно, не следует делать это, если не существует гораздо лучших методов оболочки. Скорее, этот вопрос лучше сделать с помощью gccили python, и т. Д.

АРУ
источник
-4

Ulimits являются свойствами процессов и наследуются дочерним процессам.

Вы не можете получить ограничения для другого процесса.

Шили
источник
2
Ерунда. man lsof, man ps...
Жиля SO- перестать быть злом »
1
Вы, похоже, неправильно понимаете, как работает UNIX и как lsof получает свои результаты. lsof считывает память ядра для получения значений, документированный интерфейс, который используется lsof, отсутствует, поэтому lsof завершится ошибкой, если будут внесены даже незначительные изменения во внутренние структуры данных ядра.
Щил
2
Это головная боль для lsofсопровождающего, конечно. Но не актуально для конечного пользователя. Также неверно в контексте этого вопроса, так как он спрашивает конкретно о Linux, который имеет документированные интерфейсы ( man proc).
Жиль "ТАК - перестань быть злым"
Вы говорите о недокументированных интерфейсах, которые могут быть изменены без уведомления в этом случае.
Сhily
1
Я не могу опровергнуть эту причину своей низкой репутации, поэтому я просто прокомментирую-1
Zun