Количество файловых дескрипторов: различается между /proc/sys/fs/file-nr и /proc/$pid/fd?

Я хотел бы проверить, сколько файловых дескрипторов фактически используется:

cat /proc/sys/fs/file-nr 
12750   0   753795

Первый столбец (12750) указывает количество дескрипторов файлов, выделенных с момента загрузки.

Я хотел бы знать, почему число из следующей команды отличается (при условии, что этот один лайнер возвращает правильное значение:

for pid in $(lsof | awk '{ print $2 }' | uniq); do find /proc/$pid/fd/ -type l 2>&1 | grep -v "No"; done | wc -l

11069

2 ответа

Решение

lsof только перечисляет идентификатор процесса. Чтобы получить информацию о темах, вы должны использовать ps -eLf, Согласно man proc:

   /proc/[pid]/ task (начиная с Linux 2.6.0-test6)
          Это каталог, который содержит один подкаталог для каждого
          нить в процессе. Имя каждого подкаталога
          числовой идентификатор потока ([tid]) потока (см. gettid (2)).
          В каждом из этих подкаталогов есть набор файлов
          с теми же именами и содержимым, что и в /proc/[pid]
          каталоги. Для атрибутов, которые являются общими для всех потоков,
          содержимое для каждого из файлов в задаче /[tid]
          подкаталоги будут такими же, как в соответствующем файле
          в родительском /proc/[pid] каталоге (например, в многопоточном
          процесс, все файлы задач /[tid]/ cwd будут одинаковыми
          значение в виде файла /proc/[pid]/ cwd в родительском каталоге,
          поскольку все потоки в процессе совместно используют рабочую
          каталог). Для атрибутов, которые различны для каждого потока,
          соответствующие файлы в задании /[tid] могут иметь разные
          значения (например, различные поля в каждой из задач /[tid]/ статус
          файлы могут быть разными для каждого потока). 
В многопоточном процессе содержимое Каталог /proc/[pid]/ task недоступен, если основной поток уже завершен (как правило, путем вызова pthread_exit (3)).

Я бы рассчитал количество открытых файловых дескрипторов, запустив:

ps -eL | awk 'NR > 1 { print $1, $2 }' | \
while read x; do \
    find /proc/${x% *}/task/${x#* }/fd/ -type l; \
done | wc -l

Результат 17270.

Давайте посмотрим, сколько файловых дескрипторов выделено с момента загрузки:

cat /proc/sys/fs/file-nr 
11616   0   398855

Почему количество файловых дескрипторов превышает /proc/[pid]/task/[tid]/fd по количеству выделенных файловых дескрипторов в /proc/sys/fs/file-nr? Я полагаю, что они созданы fork ed дочерние процессы:

man fork:

Дочерний объект наследует копии набора родительских дескрипторов открытых файлов.

man pthreads:

POSIX.1 также требует, чтобы потоки разделяли диапазон других атрибутов (т. Е. Эти атрибуты являются общими для всего процесса, а не для каждого потока): - идентификатор процесса

  • ID родительского процесса

  • идентификатор группы процессов и идентификатор сеанса

  • управляющий терминал

  • идентификаторы пользователей и групп

  • дескрипторы открытых файлов

http://www.netadmintools.com/part295.html Некоторые из открытых файлов, которые не используют файловые дескрипторы: библиотечные файлы, сама программа (исполняемый текст) и т. д., как указано выше. Эти файлы учитываются в других местах в структурах данных ядра (например, cat /proc/PID/maps для просмотра библиотек), но они не используют файловые дескрипторы и поэтому не исчерпывают максимум файловых дескрипторов ядра.

Другие вопросы по тегам