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