Количество файловых дескрипторов: различается между /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 для просмотра библиотек), но они не используют файловые дескрипторы и поэтому не исчерпывают максимум файловых дескрипторов ядра.