Как обойти «Слишком много открытых файлов» в Debian


8

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

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Но поскольку сейчас это слишком много файлов, я бы хотел увеличить это ограничение.

Как я могу увеличить его за один сеанс SSH? И как я мог бы увеличить его во всем мире?

Я вижу ограничение на количество открытых файлов 1024 на моей машине:

ulimit -n
1024

Превышение лимита файла часто является признаком проблемы. Как уже отмечалось, у вас могут быть проблемы с ротацией логов. (Вращенный журнал может пропустить вашу команду.) За пределами / var / log / apache2 не должно быть много (любых) журналов, связанных с вашим сервером Apache. Исходя из вашего шаблона grep, вы, вероятно, захотите ограничить свой доступ к журналам доступа.
BillThor

спасибо за подсказку, но мой логротион работает нормально. У меня так много журналов, потому что все 1025 доменов на моем сервере имеют свой собственный файл журнала;)
rubo77

1
Ваши шаблоны выглядят так, как будто они также получают журналы ошибок и журналы доступа. Это должно быть незначительной проблемой, если у вас есть один журнал ошибок. Если вы оставите это запущенным в оболочке, вы можете использовать его -Fвместо того, -fчтобы журналы открывались заново при повороте.
BillThor

Ответы:


15

Важно знать, что существуют два вида ограничений:

  • Жесткий предел настраивается только корень. Это максимально возможное значение (предел) для мягкого ограничения.
  • Мягкий предел может быть установлен обычным пользователем. Это фактический предел в силе.

Решение для одного сеанса

В оболочке установлен мягкий предел:

ulimit -Sn 2048

В этом примере фактическое ограничение будет увеличено до 2048, но команда будет выполнена успешно, только если жесткий предел (check ulimit -Hn:) такой же или выше. Если вам нужны более высокие значения, увеличьте жесткий предел одним из следующих способов. Ограничения устанавливаются для каждого процесса, и они наследуются вновь порожденными процессами, поэтому все, что вы запускаете после этой команды в той же оболочке, будет иметь новые ограничения.

Изменение жесткого лимита за один сеанс

Это нелегко, потому что только root может изменить жесткое ограничение, и после переключения на root вы должны вернуться к первоначальному пользователю. Вот решение с sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Общесистемное решение

В Debian и многих других системах, которые pam_limitsвы используете, вы можете устанавливать системные ограничения /etc/security/limits.confв файлах и в файлах /etc/security/limits.d. Файл conf содержит описание. Пример строки:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Это установит жесткое ограничение и мягкое ограничение по умолчанию для пользователей в группе webadminsпосле входа в систему.

Другие ограничения

Значение жесткого предела ограничено глобальным пределом значения дескрипторов открытых файлов, /proc/sys/fs/file-maxкоторый по умолчанию довольно высок в современных дистрибутивах Linux. Это значение ограничено NR_OPENзначением, используемым во время компиляции ядра.

Нет ли лучшего решения?

Может быть, вы могли бы проверить , действительно ли все *logфайлы, которые вы передаете, tail -fявляются действительно активными файлами, которые необходимо отслеживать. Возможно, что некоторые из них уже закрыты для регистрации, и вы можете просто открыть меньшее количество файлов.


ulimit -Sn 4096 -bash: ulimit: открыть файлы: Kann die Grenze nicht ändern: Das Argument ist ungültig - означает, что аргумент недействителен
rubo77

@ rubo77: я добавил информацию о жестком лимите, который, скорее всего, является причиной проблемы.
Пабук

@ rubo77: Также можно установить жесткий предел в сеансе оболочки, но это сложно, так как вам нужно suполучить root- susu -c "ulimit -Hn 6000 ; su $USER"
права

Хорошо, поэтому для временного изменения лимита я буду использовать в ulimit -Hn 6000; ulimit -Sn 6000качестве пользователя root
rubo77

1
@amenthes Я думаю, вы имеете в виду файлы конфигурации в /etc/limits.*. Эти ограничения применяются всякий раз, когда pam_limits.soвызывается модуль PAM . Обычно это в начале сеанса. Например , в Ubuntu 14.04 именно в этих инструментах / командах: cron, login(текстовая консоль Логин), lightdm(графический интерфейс пользователя Логин), su. Вы можете установить, где pam_limitsиспользуется в /etc/pam.*. См. Например: faqs.org/docs/securing/chap5sec44.html
Пабук

0

У меня было предупреждение PHP в моем Apache error.log:

failed to open stream: Too many open files in ...

Итак, я обнаружил, что apache устанавливает это значение индивидуально при запуске (на моем Ubuntu 14.04). Это настроено в /etc/apache2/envvars. Это говорит:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

поэтому мне пришлось настроить третью строку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.