Вопрос или проблема
Вот моя конфигурация 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, приведенные в конфигурации, содержат некоторые параметры, которые могут значительно влиять на количество открытых файлов:
-
Пулы потоков: У вас установлен параметр
thread_pools=12
, что, учитывая значениеthread_pool_min=250
, позволяет Varnish создавать до 3000 потоков (12*250). Следует отметить, что стандартное значениеthread_pools
– 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 в работоспособном состоянии и избежать проблем с открытыми файлами.