Linux количество открытых файлов linux

Обновлено: 06.07.2024

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

Зачем суживать количество открытых файлов

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

  • Soft Limit Свойство, которое может быть изменено процессом в любое время.
  • Hard Limit обозначает наибольшее значение, которое не может быть превышено путем установки мягкого ограничения

Бригада ulimit

Команду ulimit можно использовать для увеличения количества файлов, которые можно раскрыть в оболочке. Эта команда является встроенной командой bash, поэтому она влияет только на bash и програмки, запускаемые из него. Синтаксис ulimit следующий:
Ulimit [options [limit]]
Параметры определяют, что довольствуется. Вы можете увидеть некоторые варианты, как показано ниже

  • -a (Передача текущих настроек): заставляет ulimit извещать о своих текущих настройках.
  • -f (Ограничения файлов) ограничивает размер файлов, которые могут быть сделаны оболочкой.
  • -n Ограничивает количество открытых файловых дескрипторов.
  • -H и -S (Жесткие и мягкие ограничения) параметры меняют другие параметры, в результате чего они устанавливаются как жесткие или мягкие ограничения соответственно. Жесткие ограничения смогут впоследствии не увеличиваться, но мягкие ограничения могут быть. Если ни один из вариантов не предусмотрен, ulimit ставит как жесткие, так и мягкие ограничения для указанной функции.

Модуль подключаемых модулей аутентификации (PAM)

Устанавливать такие ограничения лучше всего с помощью Включаемых модулей аутентификации (PAM), называемых Pam_limits. Большинство основных дистрибутивов Linux используют этот часть как часть своей стандартной конфигурации PAM, поэтому он уже присутствует в некоторых системах Linux, но вам нужно станет настроить его, отредактировав /etc/security/limits. conf файл. Этот файл содержит четыре главных поля:

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

Дабы отредактировать максимальное количество открытых файлов для всех пользователей, вы можете добавить, например, приплюсовать в конец файла строки ниже:

После данного вам необходимо отредактировать файл /etc/pam. d/login

Затем сохраните файл. Вы сможете проверить результат, как показано ниже:

Общесистемный предел

В системе Linux у нас есть Файл-макс, какой является максимальным дескриптором файлов (FD), и настройки по умолчанию для ulimit и file-max предполагают, что несколько юзеров будут совместно использовать систему. Вот почему эти настройки ограничивают количество ресурсов, используемых любым пользователем. Вы можете увеличить количество открытых файлов в Linux, отредактировав /etc/sysctl. conf или путем редактирования директивы Fs. file-max

Вы сможете увидеть текущее значение для открытых файлов с помощью команды

И вы можете менять значение по умолчанию, как показано ниже:

Вы можете проверить итог, как показано ниже

С помощью Sysctl command, изменения применяются до следующей повторная загрузки. Чтобы сделать конфигурацию постоянной, вы можете напрямую отредактировать /etc/sysctl. conf файл, как представлено ниже:

Оценить 2 комментария

buloshnik

Было бы интересно узнать почему команды показывают разные результаты.

buloshnik

И еще одна загвоздка, если lsof | wc -l запихнуть в скрипт и запустить, то он показывает около 2500. единственная разница, что скрипт запускался от рута. Когда запускаешь из под своего пользователя показывает около 400.

Открытые файлы показывает конечно же lsof, а параметры ядра больше касаются дескрипторов, эти конкретные, означают:
nr_open - жесткий лимит на открытые дескрипторы, более полезен параметр file-max - мягкий лимит.
file-nr - показывает выделенные дескрипторы, неиспользуемые и максимум, соответственно. Число выделенных дескрипторов больше, т.к. ядро их выделяет динамически и не освобождает, так что их число постоянно растет.

buloshnik

@custos, такой вопрос - sysctl kern.openfiles во freebsd это то же самое что и lsof? Почему lsof при запуске от разных пользователей показывает разные цифры? И почему когда засовываешь его в bash - то цифра вообще не похожа на ту, что показывается при запуске из консоли?

На счет kern.openfiles не знаю, вероятно это число открытых файлов. lsof показывает открытые файлы, но важно что файлы в linux это, кроме очевидных файл/директория, ещё и локальные сокеты, устройства, пайпы, ссылки. Т.е. чтобы посмотреть открытые файлы нужного типа, lsof требуется указывать параметры. То что пользователю показывает только открытые им файлы, а суперпользователю (root) все - это естественно.

A_Maksimov

Команда "lsof | wc -l" показывает гораздо большее значение, чем всего открыто файлов в системе на данный момент на самом деле.
Это связано с тем, что по несколько раз в подсчёт попадают одни и теже файлы, используемые разными процессами.
Для подсчёта общего числа открытых файлов лучше использовать первое значение в выводе команды "cat /proc/sys/fs/file-nr".
Либо, если всё же использовать lsof, то вывод придётся подвергать дополнительной обработке, убирая дубликаты.

Lsof расшифровывает как List Open Files (список открытых файлов). Команда формирует список дескрипторов открытых файлов по процессам и именам файлов. В Линукс все является файлами (очереди, сокеты, директории, устройства и т.д. ). Таким образом, с помощью Lsof, вы можете получить информацию о любых открытых файлов.

Автор утилиты - Вик Эйбелл из университета Пердью, штат Индиана. В большинстве дистрибутивом Linux, Lsof устанавливается по-умолчанию, во FreeBSD ее можно установить из портов -

1. Введение в lsof

Набрав в консоли lsof без ключей, мы получим все открытые файлы, принадлежащих всем активным процессам Как можно увидеть из листинга, один и тот же процесс открывает много файлов, каждому из которых соответствует строка в выводе lsof . Название колонок говорят сами за себя, так что мы остановимся толькор на 2-х (FD и TYPE) FD - показывает файловый дескриптор, некоторые возможные значения: Число - номер файлового дескриптора, сопровождается символом, указывающим режим, в котором файл был открыт - r -для чтения; w – для записи; u - для чтения и записи. TYPE – столбец показывает тип файла, некоторые возможные значения: Полный список значений этих полей вы моежете найти в руководстве по lsof (man lsof). 2. Список процессов открывших конкретный файл Вы можете просмотреть список процессов открывших конкретный файл, используя имя файла в качестве аргумента - 3. Список открытых файлов в конкретной директории Вы можете просмотреть список процессов, открывших файлы в конкретной директории используя ключ +D. Ключ +D просматривает каталоги рекурсивно (то бишь вместе с подкаталогами). Если рекурсия не нужна используйте ключ +d. 4. Просмотр списка процессов по имени, заданном неполностью Используя ключ -с можно просматривать файлы открытые процессами начинающимися с набранных Вами букв. Ключей -с может быть несколько в одной команде: В примере, мы набрали в качестве имени процессов мы набрали только ssh и init, и получили весь список процессов начинающихся с этого набора букв. 5. Просмотр процессов использующих определенную точку монтирования Иногда, когда мы пытаемся размонтировать директорию, система выдает ошибку “Device or Resource Busy” (устройства или ресурс занят). Соотвественно нам необходимо найти все процессы использующие данную точку монтирования и завершить их для удачного размонтирования данной директории.

Также работает рекурсивный просмотр:

6. Просмотр файлов открытых конкретным пользователем

Для поиска файлов открытых определенным пользователем, используем ключ -u

Иногда необходимо вывести файлы открытые всеми пользователями, за исключением конкретного. Для этого используется -'^'

Данная команда выводит список файлов открытых всеми пользователями, за исключением пользователя alex1812

7. Список всех файлов открытых конкретным процессом

Для вывода списка всех файлов открытых конкретным процессов используется ключ -p. Это может быть полезно для получения большей информации о самом процессе.

8. Уничтожить все процессы используемые конкретным пользователем

Если необходимо уничтожить все процессы, имеющие открытые файлы, конкретного пользователя, мы можем использовать ключ -t для просмотра id процессов и уничтожить их с помощью kill -

Данная команда уничтожит все процессы пользователя alex1812, которые имели открытые файлы.

Аналогичным образом, вы можете использовать ключ -t для других целей, например, чтобы получить список id процессов, которые открыли /var/log/syslog

9. Комбинирование ключей

По умолчанию, если вы используете более одного ключа в Lsof, то вывод команды будет объеденен по этим ключам. Например,

В этой команде мы используем два ключа -u и -c, таким образом команда одновременно выводит и список процессов принадлежащих пользователю alex1812, и процессы начинающиеся со слова init (принадлежащих любым пользователям).

Вы можете использовать ключ -a, чтобы совместить вывод по нескольким параметрам, например процессы принадлежащие пользователю alex1812 и начинающиеся с init:

10. Выполнение Lsof в режим повтора

Lsof поддерживает вывод в режиме повтора. То бишь сначала будет выведет список файлов с заданными параметрами, затем задержка на заданный интервал и опять вывод на основе этих же параметров.

Режим повтора может быть включен ключами +r и -r. Если используем +r, то режим повтора будет прерван в случае отсутствия открытых файлов. Ключ -r будет продолжать вывод с заданным интервалом вне зависимости от наличия открытых файлов.

Каждый цикл вывода будет разделен с помощью "====== brush:bash;gutter:false;"> lsof -u alex1812 -c x-session -a -r5 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME x-session 3188 alex1812 cwd DIR 8,17 4096 7208963 /home/alex1812 x-session 3188 alex1812 rtd DIR 8,17 4096 2 / x-session 3188 alex1812 txt REG 8,17 109768 6946945 /bin/dash x-session 3188 alex1812 mem REG 8,17 1802936 1179931 /lib/x86_64-linux-gnu/libc-2.15.so x-session 3188 alex1812 mem REG 8,17 149280 1179933 /lib/x86_64-linux-gnu/ld-2.15.so x-session 3188 alex1812 0r CHR 1,3 0t0 1029 /dev/null x-session 3188 alex1812 1w REG 8,17 18078 7208967 /home/alex1812/.xsession-errors x-session 3188 alex1812 2w REG 8,17 18078 7208967 /home/alex1812/.xsession-errors x-session 3188 alex1812 10r REG 8,17 18712 3558840 /usr/bin/startkde ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME x-session 3188 alex1812 cwd DIR 8,17 4096 7208963 /home/alex1812 x-session 3188 alex1812 rtd DIR 8,17 4096 2 / x-session 3188 alex1812 txt REG 8,17 109768 6946945 /bin/dash x-session 3188 alex1812 mem REG 8,17 1802936 1179931 /lib/x86_64-linux-gnu/libc-2.15.so x-session 3188 alex1812 mem REG 8,17 149280 1179933 /lib/x86_64-linux-gnu/ld-2.15.so x-session 3188 alex1812 0r CHR 1,3 0t0 1029 /dev/null x-session 3188 alex1812 1w REG 8,17 18078 7208967 /home/alex1812/.xsession-errors x-session 3188 alex1812 2w REG 8,17 18078 7208967 /home/alex1812/.xsession-errors x-session 3188 alex1812 10r REG 8,17 18712 3558840 /usr/bin/startkde =======

В данном примере мы выводим список процессов принадлежащих alex1812 c именем x-session и задержкой повторного вывода в 5 секунд.

Поиск сетевых подключений

Сетевые соединения в Linux также являются файлами. Таким образом, мы можем найти информацию о них с помощью Lsof.

11. Просмотр всех сетевых подключений

Для просмотра всех сетевых подключений используем ключ -i

Вы также можете использовать -i4 и i6 для вывода только подключений по IPv4 или IPv6 соответственно.

12. Список всех сетевых файлов используемых конкретным процессом

В первом случае мы задаем процесс по его id, во втором по имени (по первым символам).

13. Список процессов прослушивающих определенный порт

Для этого используется ключ -i и номер порта через ':'

14. Список всех UDP и TCP соединений

Для вывода такого списка используем -

15. Просмотр всех NFS (Network File System) файлов

Для просмотра всех NFS файлов используем ключ -N, например просмотр всех NFS файлов открытых от пользователя alex1812 -

Надеюсь информация данной статьи будет кому-либо полезна, особенно тем, кто не любит читать man'ы =)

date

19.11.2019

directory

Linux

comments

комментария 4

Очень часто при работе на высоконагруженных Linux серверах могут возникать ошибки “too many open files». Это означает, что программа открыла слишком много файлов (читай файловых дескрипторов) и не может открыть новые. В Linux ограничения “max open file limit“ установлены по умолчанию для каждого процесса и пользователя, и они не слишком высокие.

В данной статье мы рассмотрим, как проверить текущие ограничения по количеству открытых файлов, как его изменить эту настройку для всего сервера, для отдельных сервисов и для сеанса.

Ошибка: Too many open files и лимиты на количество открытых файлов в Linux

ошибка too many opne files в nginx

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

Ограничение на количество открытых файлов для текущего пользователя – 1024. Можно проверить так:

ulimit -n - ограничение на количество открытых файлов для пользователя

Есть два типа ограничений: Hard и Soft. Пользователь может изменить лимит для soft ограничения (но значение soft не может превышать hard). Hard ограничение можно изменить только от привилегированного пользователя.

Для вывода Soft -граничения выполните:

Для вывода Hard-ограничения:

Настройки лимитов ограничения на количество одновременно открытых файлов в Linux

Ели вы используете Ubuntu, нужно прописать строку:

Данный параметр добавляет возможность загрузки ограничений при авторизации пользователя.

После изменений, перезапустите терминал и проверьте значение лимита max_open_files:

Увеличить лимита открытых файловых дескрипторов для отдельного сервиса

nginx.conf настроить limitnofile

После изменения, нужно обновить конфигурацию сервиса и перезапустить его:

Чтобы проверить, изменились ли значения, нужно получить PID сервиса:

Например, вы определил PID сервиса 32724:

настройка max open filex для сервиса в linux centos

Так вы изменили значения Max open files для конкретного сервиса.

Увеличение максимального количества открытых файлов для Nginx и Apache

После чего выполнить рестарт Nginx.

Для apache, нужно создать директорию:

После этого создайте файл limit_nofile.conf:

httpd изменить LimitNOFILE

И добавьте в него:

Лимиты file-max для текущей сессии

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

При закрытии терминала и создания новой сессии, лимиты вернуться к начальным значениям, указанным в файле /etc/security/limits.conf.

Чтобы изменить общее значение в системе /proc/sys/fs/file-max, измените значение fs.file-max в /etc/sysctl.conf:

fs.file-max для текущей сесии

В данной статье мы разобрались, как решить проблему с недостаточным лимитом для открытых файловых дескрипторов в Linux и рассмотрели несколько вариантов изменения лимитов на сервере.

Читайте также: