Назад | Перейти на главную страницу

Количество файловых дескрипторов: отличается в / 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

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

   / proc / [идентификатор] / задача (since Linux 2.6.0-test6)
          This is a directory that contains one subdirectory for each
          thread in the process.  The name of each subdirectory is the
          numerical thread ID ([tid]) of the thread (see gettid (2)).
          Within each of these subdirectories, there is a set of files
          with the same names and contents as under the / proc / [pid]
          directories.  For attributes that are shared by all threads,
          the contents for each of the files under the задача / [tid]
          subdirectories will be the same as in the corresponding file
          in the parent / proc / [pid] directory (e.g., in a multithreaded
          process, all of the задача / [tid] / cwd files will have the same
          value as the / proc / [идентификатор] / cwd file in the parent directory,
          since all of the threads in a process share a working
          directory).  For attributes that are distinct for each thread,
          the corresponding files under задача / [tid] may have different
          values (e.g., various fields in each of the задача / [tid] / статус
          files may be different for each thread).
In a multithreaded process, the contents of the / proc / [идентификатор] / задача directory are not available if the main thread has already terminated (typically by calling 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? Я полагаю, что они созданы forked дочерние процессы:

man fork:

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

man pthreads:

POSIX.1 также требует, чтобы потоки Поделиться ряд других атрибутов (т.е. эти атрибуты относятся к процессу, а не к потоку): - ID процесса

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

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

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

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

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

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