Вопрос

Недавно у меня был процесс Linux, который "слил" файловые дескрипторы:Это открыло их и не закрыло должным образом некоторые из них.

Если бы я следил за этим, я мог бы сказать - заранее, - что процесс достигает своего предела.

Есть ли хороший способ на Bash \ Python проверить коэффициент использования FD для данного процесса в системе Ubuntu Linux?

Редактировать:

Теперь я знаю, как проверить, сколько существует открытых файловых дескрипторов;Мне только нужно знать сколько файловых дескрипторов разрешено для процесса.Некоторые системы (например, Amazon EC2) не имеют /proc/pid/limits файл.

Спасибо,

Уди

Это было полезно?

Решение

Подсчитайте записи в /proc/<pid>/fd/.Жесткие и мягкие ограничения, применимые к процессу, можно найти в /proc/<pid>/limits.

Другие советы

Единственными интерфейсами, предоставляемыми ядром Linux для получения ограничений на ресурсы, являются getrlimit() и /proc/пид/limits. getrlimit() может получить ограничения ресурсов только вызывающего процесса. /proc/пид/limits позволяет получить ограничения ресурсов любого процесса с тем же идентификатором пользователя и доступен на RHEL 5.2, RHEL 4.7, Ubuntu 9.04 и любом дистрибутиве с ядром 2.6.24 или более поздней версии.

Если вам нужно поддерживать старые системы Linux, то вам нужно будет заставить сам процесс вызывать getrlimit().Конечно, самый простой способ сделать это - изменить программу или библиотеку, которую она использует.Если вы запускаете программу, то вы могли бы использовать LD_PRELOAD чтобы загрузить свой собственный код в программу.Если ни одно из этих действий невозможно, то вы могли бы подключиться к процессу с помощью gdb и заставить его выполнить вызов внутри процесса.Вы также могли бы сделать то же самое самостоятельно, используя ptrace() чтобы подключиться к процессу, вставьте вызов в его память и т.д., Однако это очень сложно сделать правильно и не рекомендуется.

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

чтобы увидеть 20 лучших дескрипторов файлов с использованием процессов:

for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`;done | sort -n -r | head -n 20

выходные данные представлены в формате количество дескрипторов файла, pid, cmndline для процесса

пример вывода

701 1216 /sbin/rsyslogd-n-c5
169 11835 postgres: spaceuser spaceschema [local] idle
164 13621 postgres: spaceuser spaceschema [local] idle
161 13622 postgres: spaceuser spaceschema [local] idle
161 13618 postgres: spaceuser spaceschema [local] idle

Вы можете попробовать написать скрипт, который периодически вызывает lsof -p {PID} на заданном pid.

Вы просили использовать методы bash / python.ulimit был бы лучшим подходом к bash (если не считать прожевывания /proc/$pid/fd и тому подобное вручную).Для python вы могли бы использовать модуль resource.

import resource

print(resource.getrlimit(resource.RLIMIT_NOFILE))
$ python test.py

(1024, 65536)

resource.getrlimit соответствует getrlimit вызовите программу на языке Си.Результаты представляют собой текущее и максимальное значения для запрошенного ресурса.В приведенном выше примере текущее (мягкое) ограничение равно 1024.Эти значения являются типичными значениями по умолчанию в системах Linux в наши дни.

В CentOS 6 и ниже (все, что использует GCC 3) вы можете обнаружить, что настройка ограничений ядра не решает проблему.Это происходит потому, что существует FD_SETSIZE - РАЗМЕР значение, которое устанавливается во время компиляции при использовании GCC.Для этого вам нужно будет увеличить значение, а затем повторно скомпилировать процесс.

Кроме того, вы можете обнаружить, что у вас происходит утечка файловых дескрипторов из-за известные проблемы в libpthread если вы используете эту библиотеку.Этот вызов был интегрирован в GCC в GCC 4 / CentOS7 / RHEL 7, и это, похоже, устранило проблемы с потоками.

Оболочка Python с использованием превосходного пакета psutil:

import psutil

for p in psutil.process_iter(attrs=['pid', 'name', 'username', 'num_fds']):
    try:
        soft, hard = p.rlimit(psutil.RLIMIT_NOFILE)
        cur = p.info['num_fds']
        usage = int(cur / soft * 100)
        print('{:>2d}% {}/{}/{}'.format(
            usage,
            p.info['pid'],
            p.info['username'],
            p.info['name'],
            ))
    except psutil.NoSuchProcess:
        pass
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top