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

«Слишком много открытых файлов в системе» на VPS с LSOF далеко от MAXFILES

Добрый день.

В последнее время мой VPS-сервер (на нем CentOS) начал давить с ошибкой «Слишком много открытых файлов в системе». Я много читал об ошибке и знаю, что лимит установлен моим хостинг-провайдером. Я получил список лимитов от хост-провайдера, и они говорят, что лимит 12000 файлы.

Я пытался найти проблему с помощью lsof утилита. Когда возникла проблема, мне удалось найти эти ответы lsof stat:

[root@XXXXXXXX]# lsof | wc -l 
3895

иногда это доходило до 4300 или около того, но я никогда не видел, чтобы он прыгал выше этого.

Вопрос сформулирован так: Может ли lsof утилита показывает неполные результаты, или это проблема хоста? Если это; s lsof than, то что я могу использовать в качестве альтернативы, чтобы получить максимальную точность числа.

Важно то, как ваш хост измеряет количество открытых файлов. Безусловно /proc/sys/fs/file-nr отличный кандидат, так что +1 за это.

lsof Однако включает «файлы», которые не учитываются в этом общем количестве. Я был бы удивлен, если file-nr сообщит, что открыто больше дескрипторов файлов, чем списков lsof.

Еще нужно помнить о размере таблиц файловых дескрипторов. У каждого процесса есть таблица FD, но есть также таблица системных файлов. Ваш хост мог бы принять (откровенно нелепое) решение вычислить открытые файлы по таблице FD для каждого процесса. Вы можете увидеть это как FDSize поле в /proc/<pid>/status для каждого процесса. Он должен быть кратен 2 по размеру и увеличен до наименьшего кратного 2, который будет содержать все открытые файлы. Мы можем просуммировать все записи FDSize. Опять же, это был бы необычный способ измерения открытых файлов, но кроме процесса быстрого открытия многих файлов, который быстро увеличивает ваше использование, я не могу иначе объяснить, почему их количество намного выше.

Я использовал сценарий, чтобы суммировать общий размер FDSize для всех открытых процессов, и попробовал все три подсчета на двух тестовых системах (как root):

$ cat /proc/sys/fs/file-nr
544     0   12640
$ lsof | wc -l
1377
$ find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi FDSize '{}'/status \; | cut -f 2 | awk '{total = total + $1}END{print total}'
5888

$ cat /proc/sys/fs/file-nr
8670    0   1587168
$ sudo /usr/sbin/lsof | wc -l
12309
$ find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi FDSize '{}'/status \; | cut -f 2 | awk '{total = total + $1}END{print total}'
33088

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

Вы можете контролировать /proc/sys/fs/file-nr с инструментом по вашему выбору, самый простой cat /proc/sys/fs/file-nr - первое число показывает выделенные дескрипторы файлов, второе - выделенные, но неиспользуемые дескрипторы файлов, а последнее число показывает максимальное количество дескрипторов файлов.

Эта информация предоставляется самим ядром.