Лак очень большое количество открытых файлов

Вопрос или проблема

Вот моя конфигурация Varnish:

/usr/sbin/varnishd \
      -a 127.0.0.1:6081 \
      -T 127.0.0.1:6082 \
      -f /varnish/default.vcl \
      -P %t/%N/varnishd.pid \
      -s malloc,4G \
      -p thread_pools=12 -p thread_pool_min=250 -p default_ttl=1 -p default_grace=0 -p timeout_idle=1800

Итак, 12 * 250 = 3000 потоков. С этой настройкой у меня открыто более 400к файлов.

Снижение количества потоков до минимума действительно значительно уменьшает число открытых файлов.

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

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

Потоки

Начнем с thread_pools=12. Значение по умолчанию – 2, и мы не советуем вам его изменять. В то время как thread_pool_min установлено на 250 в вашем случае, значение по умолчанию для thread_pool_max составляет 5000.

Вопрос: “Вы видите 400k открытых файлов в часы пик или даже когда у вас намного меньше 1000 активных потоков?”

Для справки: счетчик MAIN.threads в varnishstat может помочь вам определить, сколько активных потоков существует.

Предположим гипотетически, что это происходит во время абсолютного пикового трафика, когда у вас 5000 потоков на пул, но 12 пулов потоков приводят к 60000 активным потокам.

Это означало бы, что на каждый поток приходится около 7 файловых дескрипторов, что не является неразумным.

Влияние timeout_idle

Существует, конечно, параметр timeout_idle, который вы увеличили с 5 до 1800. Это означает, что соединение будет бездействовать в течение 1800 секунд, прежде чем будет закрыто, если установлен keepalive.

Это долго.

Файловые дескрипторы для бездействующих соединений перемещаются от потоков и управляются потоком ожидания. Это означает, что файловые дескрипторы сохраняются, в то время как потоки могут принимать новые соединения и создавать больше файловых дескрипторов.

Для справки: вы можете запустить varnishstat -f "WAITER.*.conns" -f "MAIN.sess_conn" -f "MAIN.backend_conn", чтобы отслеживать соединения, обрабатываемые потоком ожидания, обычные входящие соединения и соединения с бекендом.

Требуется дополнительная отладка

На протяжении моего ответа я предполагал, что 400k открытых файлов наблюдается в часы пик. Если это не так, требуется больше отладки, чтобы выяснить, какие файлы (или файловые дескрипторы) используются.

Один из способов сделать это – выполнить следующую команду:

lsof -p $(pgrep cache-main)

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

И, конечно, выполните следующую команду с объединенными параметрами, чтобы перечислить все потоки и соединения:

varnishstat -f "MAIN.threads" -f "WAITER.*.conns" -f "MAIN.sess_conn" -f "MAIN.backend_conn"

Ответ или решение

Вопрос о большом количестве открытых файлов в Varnish требует внимательного анализа настроек и архитектуры как Varnish, так и вашего окружения. Давайте разберем, что может быть причиной этой ситуации, и как можно оптимизировать количество открытых файлов.

Анализ конфигурации Varnish

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

  1. Пулы потоков: У вас установлен параметр thread_pools=12, что, учитывая значение thread_pool_min=250, позволяет Varnish создавать до 3000 потоков (12*250). Следует отметить, что стандартное значение thread_pools – 2, и увеличение этого параметра может привести к ненужному использованию ресурсов.

  2. Удержание файловых дескрипторов: Параметр timeout_idle установлен на 1800 секунд. Это время, в течение которого неактивные соединения остаются открытыми, если используется keepalive. В результате, даже если поток не занят, файловые дескрипторы все еще занимают место, что приводит к увеличению общего числа открытых файлов.

Оптимизация настроек

Для уменьшения числа открытых файлов вы можете:

  • Снизить количество потоков: Если ваши нагрузки не требуют такого количества потоков, стоит вернуться к более консервативным настройкам, например, thread_pools=2 и thread_pool_min=10. Это может значительно сократить количество линий выполнения и, соответственно, открываемых файловых дескрипторов.

  • Сокращение времени timeout_idle: Установите значение timeout_idle на более разумное время. Например, 5 минут вместо 30. Это позволит быстрее закрывать неактивные соединения и освобождать файловые дескрипторы.

Мониторинг и диагностика

Для более детального анализа, полезно запустить следующие команды:

  • Для мониторинга активных соединений и потоков:

    varnishstat -f "MAIN.threads" -f "WAITER.*.conns" -f "MAIN.sess_conn" -f "MAIN.backend_conn"
  • Для просмотра открытых файлов:

    lsof -p $(pgrep varnishd)

Эти команды помогут вам увидеть текущую ситуацию с потоками и открытыми дескрипторами, и соответственно настроить параметры Varnish более эффективно.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...