- Идентификация открытых файлов и сетевых подключений в Linux — lsof (примеры)
- Лимиты на число одновременно открытых дескрипторов файлов
- Исправляем ошибку “Too many open files“ в Linux
- Ошибка: Too many open files и лимиты на количество открытых файлов в Linux
- Настройки лимитов ограничения на количество одновременно открытых файлов в Linux
- Увеличить лимита открытых файловых дескрипторов для отдельного сервиса
- Увеличение максимального количества открытых файлов для Nginx и Apache
- Лимиты file-max для текущей сессии
- Вики IT-KB
- Инструменты пользователя
- Инструменты сайта
- Боковая панель
- Содержание
- Как проверить все открытые файлы пользователем или процессом в Linux
- Лимит ядра Linux
- Методика подсчёта открытых файлов
- Примеры получения данных
Идентификация открытых файлов и сетевых подключений в Linux — lsof (примеры)
Lsof расшифровывает как List Open Files (список открытых файлов). Команда формирует список дескрипторов открытых файлов по процессам и именам файлов. В Линукс все является файлами (очереди, сокеты, директории, устройства и т.д. ). Таким образом, с помощью Lsof, вы можете получить информацию о любых открытых файлов.
1. Введение в lsof
Также работает рекурсивный просмотр:
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 будет продолжать вывод с заданным интервалом вне зависимости от наличия открытых файлов.
Каждый цикл вывода будет разделен с помощью «=======». Мы также можем указать время задержки для обоих ключей.
В данном примере мы выводим список процессов принадлежащих 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’ы =)
Источник
Лимиты на число одновременно открытых дескрипторов файлов
Приветствую уважаемых экспертов!
Задался вопросом, а сколько Linux (с ядром 3.2) может позволить мне держать открытыми файлов? Например, если я много дергаю текстовых файлов на чтение в PHP-скриптах.
Ограничения есть, но вот какие? И как их посмотреть, или даже поменять? Эти ограничения откносятся к одной ФС или действуют на систему в целом?
Например дома на Ubuntu:
Про ключ -n написано:
The maximum number of open file descriptors (most systems do not allow this value to be set)
А тут (эта же система):
Что это за показатели? И к чему они относятся?
Или может есть другие способы посмотреть?
Насколько я понял, ulimit показывает максимальное число открытых дескрипторов файлов на процесс, а
Допустим есть Apache + PHP (модулем). При обслуживании web-сайта какое ограничение будет действовать? В PHP-скриптах идет обращение к БД «на файлах». Неужели 1024 дескрипторов на весь Apache?
первое — лимит, устанавливаемый шеллом с пом. pam
второе — устанавливаемый ядром
ответы на твои вопросы есть, внезапно, в релевантных манах/доках
Дополнил вопрос в теме.
Файлы надо закрывать сразу после обращения в таком случае. Собственно для того всякие блоки типа with-open-file в общелиспе и придуманы. Ну или with . as . в питоне.
В коде вижу обращения к функции file_get_contents(). Они вычитывают из мелких файликов (в пределах килобайта) хранимые объекты. В процессе открытия одной страницы читается до 30 файлов (чаще до 10). Сам сайт дает около полумиллиона генераций страниц в сутки. Правда пока пиковые нагрузки никто не считал.
Так чтобы открыть fopen(), а потом что-то с ним долго делать пока не обнаружил.
Вообще именно чтобы с таким вот не геммороится, и придумали базы данных. И да, а нафига при открытии каждой страницы оно перечитывает, нельзя что ли кеш держать в памяти веб-приложения? Или php каждый раз заново перезапускается?
Вообще именно чтобы с таким вот не геммороится, и придумали базы данных.
БД вещь хорошая, но сайтов на маломощном сервачке несколько. И там где в основе БД, прослеживаются тормоза (звучит страшнее чем на самом деле). Вызывают нарекания всякие вложенности, джойны и прочие вкусности.
И да, а нафига при открытии каждой страницы оно перечитывает, нельзя что ли кеш держать в памяти веб-приложения?
Файлов много, и количество обращений (пофайловых) более-менее равномерно. Вот если бы какие-то чаще других читались. Да и памяти всего 600 Мб.
Или php каждый раз заново перезапускается?
Да. Приложения работающего постоянно нет.
там где в основе БД, прослеживаются тормоза
так ты фактически и реализуешь ту же БД, только с файлами и костылями. и при достижении того же уровня функционала тормоза будут те же.
Неужели 1024 дескрипторов на весь Apache?
Да. Но на каждый весь: ps ax|grep httpd
так ты фактически и реализуешь ту же БД
Согласен. Файлы и РБД не должны сильно отличаться по скоростям (мне так кажется). При условии проектирования структуры таблиц в РБД не по академическим правилам, а в привязке к предметной области и специфике их отображения.
А то обычно во всяких (да в любых) CMS генерация главной страницы характерна выполнением нескольких десятков SQL-запросов. И не все они простые линейные SELECT`ы.
Впрочем на сайтике ООП и данные запрашиваются через мапперы, не составит труда сменить слой хранения.
Да. Но на каждый весь: ps ax|grep httpd
Вот это уже радует.
man, в этом месте, не очень вразумительный. Не сразу понятно, точнее, вообще непонятно. Но оно так.
При условии проектирования структуры таблиц в РБД не по академическим правилам, а в привязке к предметной области и специфике их отображения.
Источник
Исправляем ошибку “Too many open files“ в Linux
Очень часто при работе на высоконагруженных Linux серверах могут возникать ошибки “too many open files». Это означает, что программа открыла слишком много файлов (читай файловых дескрипторов) и не может открыть новые. В Linux ограничения “max open file limit“ установлены по умолчанию для каждого процесса и пользователя, и они не слишком высокие.
В данной статье мы рассмотрим, как проверить текущие ограничения по количеству открытых файлов, как его изменить эту настройку для всего сервера, для отдельных сервисов и для сеанса.
Ошибка: Too many open files и лимиты на количество открытых файлов в Linux
Для начала разберемся, где мы можем наблюдать ошибку “too many open files“. Чаще всего эта ошибка встречается на серверах с установленным веб-серверов NGINX/httpd, сервером БД (MySQL/MariaDB/PostgreSQL), при чтении большого количества логов. Например, когда веб-серверу Nginx не хватает лимита для открытия файлов, вы получите ошибку:
Максимально количество файловых дескрипторов, которые могут быть открыты в вашей системе можно узнать так:
Ограничение на количество открытых файлов для текущего пользователя – 1024. Можно проверить так:
Есть два типа ограничений: Hard и Soft. Пользователь может изменить лимит для soft ограничения (но значение soft не может превышать hard). Hard ограничение можно изменить только от привилегированного пользователя.
Для вывода Soft -граничения выполните:
Для вывода Hard-ограничения:
Настройки лимитов ограничения на количество одновременно открытых файлов в Linux
Чтобы разрешить всем сервисам открывать большее количество файлов, можно изменить лимиты на уровне всей ОС Linux. Чтобы новые настройки работали постоянно и не сбрасывались при перезапуске сервера или сессии, нужно поправить файл /etc/security/limits.conf. Добавьте строки:
Ели вы используете Ubuntu, нужно прописать строку:
Данный параметр добавляет возможность загрузки ограничений при авторизации пользователя.
После изменений, перезапустите терминал и проверьте значение лимита max_open_files:
Увеличить лимита открытых файловых дескрипторов для отдельного сервиса
Вы можете изменить лимит на количество открытых файловых дескрипторов для конкретного сервиса, а не для всей системы. Рассмотрим на примере apache. Чтобы изменить значения, откройте настройки службы через systemctl: # systemctl edit httpd.service Добавьте необходимые лимиты, например:
После изменения, нужно обновить конфигурацию сервиса и перезапустить его:
# systemctl daemon-reload
# systemctl restart httpd.service
Чтобы проверить, изменились ли значения, нужно получить PID сервиса:
# systemctl status httpd.service
Например, вы определил PID сервиса 32724:
# cat /proc/32724/limits | grep «Max open files”
Так вы изменили значения Max open files для конкретного сервиса.
Увеличение максимального количества открытых файлов для Nginx и Apache
При изменении ограничения на количество открытых файлов для веб-сервера, нужно также поправить конфигурационный файл службы. Например, для Nginx в файле конфигурации /etc/nginx/nginx.conf, нужно прописать/изменить значение в директиве:
После чего выполнить рестарт Nginx.
Для apache, нужно создать директорию:
После этого создайте файл limit_nofile.conf:
И добавьте в него:
Не забудьте перезапустить сервис httpd.
Лимиты file-max для текущей сессии
Чтобы изменить лимиты на открытые файлы в рамках вашей сессии терминала, выполните команду:
При закрытии терминала и создания новой сессии, лимиты вернуться к начальным значениям, указанным в файле /etc/security/limits.conf.
Чтобы изменить общее значение в системе /proc/sys/fs/file-max, измените значение fs.file-max в /etc/sysctl.conf:
В данной статье мы разобрались, как решить проблему с недостаточным лимитом для открытых файловых дескрипторов в Linux и рассмотрели несколько вариантов изменения лимитов на сервере.
Источник
Вики IT-KB
Пошаговые руководства, шпаргалки, полезные ссылки.
Инструменты пользователя
Инструменты сайта
Боковая панель
Содержание
Как проверить все открытые файлы пользователем или процессом в Linux
В некоторых ситуациях на Linux могут возникать ошибки, связанные с превышением лимита использования файловых дескрипторов. Эти лимиты накладываются как самим ядром Linux, так и его программными модулями, например PAM.
Лимит ядра Linux
Узнать текущее значение максимального количества файловых дескрипторов, определяемое ядром Linux можно командой:
Этот лимит может быть изменён без перезагрузки системы (начинает действовать сразу и действует до перезагрузки):
Чтобы требуемое значение использовалось постоянно, то есть действовало и после перезагрузки, его необходимо определить в конфиг.файле /etc/sysclt.conf :
Методика подсчёта открытых файлов
Для получения информации о количестве всех открытых файлов всеми процессами в Linux некоторые «знатоки» предлагают использовать команду типа
Однако такая команда показывает гораздо большее значение, чем всего открыто файлов в системе на данный момент на самом деле. Это связано с тем, что по несколько раз в подсчёт попадают одни и теже открытые файлы, используемые разными процессами.
Поэтому проще для получения общего числа открытых файлов использовать данные ядра Linux
Первое число — общее количество занятых/используемых на данный момент времени файловых дескрипторов.
Второе число — количество выделенных процессам, но не используемых в данный момент дескрипторов.
Третье число — максимальное количество открытых дескрипторов
Примеры получения данных
Получить список TOP-20 процессов с самым большим количеством открытых файловых дескрипторов:
Подсчитать количество открытых файлов в разрезе процессов (в первой колонке будет выведен PID процесса, во второй количество открытых файлов этим процессом):
Посмотреть открытые файловые дескрипторы во всех процессах для отдельно взятого пользователя, например «apache»
Подсчитать количество открытых файлов в каждом процессе для отдельно взятого пользователя:
Тоже самое, только в реальном режиме времени:
Посмотреть открыте файловые дескриптры для отдельно взятого процесса (по PID процесса):
Подсчитать количество файловых дескриптров для отдельно взятого процесса:
Дополнительные источники информации:
Проверено на следующих конфигурациях:
Версия ОС |
---|
Debian GNU/Linux 8.10 (jessie) |
Автор первичной редакции:
Алексей Максимов
Время публикации: 09.06.2018 11:18
Источник