Плагин Varnish

Мониторинг HTTP-кеша-акселератора Varnish с подробными метриками по производительности кеша, состоянию бэкендов, клиентским соединениям и использованию ресурсов.

Обзор

Плагин Varnish собирает подробные метрики из Varnish с помощью varnishstat, в том числе:

  • Производительность кеша — hit rate, miss rate, hit-for-pass, hit-for-miss
  • Объекты кеша — кешированные объекты, истёкшие объекты, вытесненные по LRU объекты
  • Состояние бэкендов — соединения с бэкендами, сбои, число занятых
  • Клиентские метрики — клиентские соединения, запросы, сброшенные соединения
  • Статистика потоков — число потоков, длина очереди, неудачные создания
  • Использование памяти — выделенное хранилище, доступное хранилище

Требования

Версия Varnish

  • Минимум: Varnish 6.0
  • Рекомендуется: Varnish 7.0 или новее
  • Протестировано с: Varnish 6.0, 6.6, 7.0, 7.3

Инструменты Varnish

Обязательно: утилита командной строки varnishstat (входит в состав Varnish)

Зависимости Python

Дополнительные пакеты Python не требуются — используется стандартная библиотека.

Системный доступ

Агенту нужны права на выполнение команды varnishstat.

Конфигурация

Базовая конфигурация

plugins:
  varnish:
    enabled: true

С пользовательским именем экземпляра

plugins:
  varnish:
    enabled: true
    instance_name: my_varnish

Все параметры конфигурации

plugins:
  varnish:
    enabled: true                # Enable/disable plugin
    instance_name: ""            # Varnish instance name (empty = default)
    varnishstat_path: /usr/bin/varnishstat  # Path to varnishstat
    timeout: 10                  # Command timeout (seconds)

Переменные окружения

Конфигурацию можно переопределить с помощью переменных окружения:

export VARNISH_INSTANCE_NAME="cache1"

Настройка Varnish

Установка

Ubuntu/Debian:

# Install Varnish
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish70/script.deb.sh | sudo bash
sudo apt-get install varnish

# Start service
sudo systemctl start varnish
sudo systemctl enable varnish

CentOS/RHEL:

# Install Varnish
curl -s https://packagecloud.io/install/repositories/varnishcache/varnish70/script.rpm.sh | sudo bash
sudo yum install varnish

# Start service
sudo systemctl start varnish
sudo systemctl enable varnish

Базовая конфигурация

Отредактируйте конфигурацию Varnish:

sudo nano /etc/varnish/default.vcl

Простой бэкенд:

vcl 4.0;

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

Перезапустите Varnish:

sudo systemctl restart varnish

Предоставление доступа к varnishstat

По умолчанию агент работает от root — имеет доступ к varnishstat.

Для агента без root:

# Add user to varnish group
sudo usermod -aG varnish statusradar

Собираемые метрики

Системные метрики

Метрика Описание Единица Тип
uptime_seconds Uptime Varnish Секунды Gauge

Метрики производительности кеша

Метрика Описание Единица Тип
cache_hit Попадания в кеш Количество Counter
cache_miss Промахи кеша Количество Counter
cache_hitpass Hit for pass (некешируемые) Количество Counter
cache_hit_grace Hit for grace Количество Counter
cache_hitmiss Hit for miss Количество Counter
cache_hit_rate_percent Процент попаданий в кеш Процент Gauge

Расчёт hit rate:

cache_hit_rate_percent = (cache_hit / (cache_hit + cache_miss)) × 100

Метрики объектов кеша

Метрика Описание Единица Тип
n_object Кешированные объекты Количество Gauge
n_objectcore Object cores Количество Gauge
n_objecthead Object heads Количество Gauge
n_expired Истёкшие объекты Количество Counter
n_lru_nuked Вытесненные по LRU объекты Количество Counter
n_lru_moved Перемещённые по LRU объекты Количество Counter

Метрики бэкендов

Метрика Описание Единица Тип
n_backend Число бэкендов Количество Gauge
backend_conn Соединения с бэкендами Количество Counter
backend_fail Сбои соединений с бэкендами Количество Counter
backend_busy Число занятых бэкендов Количество Counter
backend_unhealthy Число нездоровых бэкендов Количество Counter
backend_reuse Переиспользования соединений с бэкендами Количество Counter
backend_recycle Повторное использование соединений с бэкендами Количество Counter
backend_retry Повторы к бэкендам Количество Counter
backend_req Запросы к бэкендам Количество Counter

Клиентские метрики

Метрика Описание Единица Тип
client_req Клиентские запросы Количество Counter
client_req_400 Клиентские ошибки 400 Количество Counter
client_req_417 Клиентские ошибки 417 Количество Counter
sess_conn Соединения сессий Количество Counter
sess_fail Сбои сессий Количество Counter
sess_dropped Сброшенные сессии Количество Counter

Метрики потоков

Метрика Описание Единица Тип
threads Всего потоков Количество Gauge
threads_created Создано потоков Количество Counter
threads_destroyed Уничтожено потоков Количество Counter
threads_failed Сбои создания потоков Количество Counter
threads_limited Ограничено созданий потоков Количество Counter
thread_queue_len Длина очереди потоков Количество Gauge

Метрики трафика

Метрика Описание Единица Тип
req_hdrbytes Байты заголовков запросов Байты Counter
req_bodybytes Байты тела запросов Байты Counter
resp_hdrbytes Байты заголовков ответов Байты Counter
resp_bodybytes Байты тела ответов Байты Counter
req_total_mb Всего байт запросов МБ Counter
resp_total_mb Всего байт ответов МБ Counter

Метрики fetch

Метрика Описание Единица Тип
s_fetch Всего операций fetch Количество Counter
fetch_failed Неудачные операции fetch Количество Counter

Метрики VCL

Метрика Описание Единица Тип
n_vcl Число конфигураций VCL Количество Gauge
vcl_fail Сбои VCL Количество Counter

Метрики на дашборде

Дашборд StatusRadar отображает:

Карточка обзора

  • Hit Rate — процент эффективности кеша
  • Cached Objects — текущее число объектов
  • Backend Health — частота успешных соединений
  • Client Connections — активные клиенты

График производительности кеша

  • Hit rate во времени
  • Miss rate
  • Доля hit-for-pass

График объектов кеша

  • Число кешированных объектов
  • Истёкшие объекты
  • Вытесненные по LRU объекты

График состояния бэкендов

  • Соединения с бэкендами
  • Сбои бэкендов
  • Число занятых бэкендов

График клиентского трафика

  • Клиентские соединения
  • Клиентские запросы
  • Сброшенные соединения

График пула потоков

  • Активные потоки
  • Длина очереди потоков
  • Сбои создания потоков

Установка

Быстрая установка

PLUGINS='varnish' \
TOKEN='your-agent-token' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"

Установка на существующий агент

  1. Убедитесь, что Varnish установлен:

    varnishstat -V
  2. Включите плагин в конфигурации:

    sudo nano /opt/statusradar/config/agent.yaml

    Добавьте:

    plugins:
      varnish:
        enabled: true
  3. Перезапустите агент:

    sudo systemctl restart statusradar-agent
  4. Проверьте:

    sudo journalctl -u statusradar-agent -n 50 --no-pager | grep varnish

    Ожидается:

    INFO: Plugin varnish: Metrics collected successfully
    INFO: Plugin varnish: Hit rate 95.5%, 1234 cached objects

Тестирование

Ручной тест плагина

cd /opt/statusradar
python3 plugins/varnish_plugin.py

Ожидаемый вывод:

Plugin: varnish
Enabled: True
Available: True

Collecting metrics...
{
  "cache_hit": 123456,
  "cache_miss": 5678,
  "cache_hitrate": 95.6,
  "n_object": 1234,
  "n_expired": 567,
  "n_lru_nuked": 12,
  "backend_conn": 89012,
  "backend_fail": 23,
  "client_conn": 123456,
  "client_req": 234567,
  "threads": 200
}

Проверка статистики Varnish

# View live stats
varnishstat

# View specific counters
varnishstat -1 -f MAIN.cache_hit -f MAIN.cache_miss

# JSON output
varnishstat -1 -j

Устранение неполадок

Плагин не собирает метрики

Проверка 1: Запущен ли Varnish?

sudo systemctl status varnish

Проверка 2: Можно ли выполнить varnishstat?

varnishstat -1

Проверка 3: Проверьте логи агента

sudo journalctl -u statusradar-agent -n 100 --no-pager | grep varnish

Распространённые ошибки

"varnishstat command not found"

Ошибка:

ERROR: Plugin varnish: varnishstat command not found

Решение:

# Install Varnish
sudo apt-get install varnish

# Or specify full path in config:
varnishstat_path: /usr/bin/varnishstat

"Cannot connect to varnishd"

Ошибка:

ERROR: Plugin varnish: Cannot connect to varnishd

Причины:

  1. Varnish не запущен
  2. Неверное имя экземпляра
  3. Проблемы с правами доступа

Решение:

# Check Varnish is running
sudo systemctl status varnish

# Test varnishstat
sudo varnishstat -1

# Check instance name
sudo varnishadm status

"Permission denied"

Ошибка:

ERROR: Plugin varnish: Permission denied accessing varnish stats

Решение:

Агент должен работать от root или быть добавлен в группу varnish:

sudo usermod -aG varnish statusradar
sudo systemctl restart statusradar-agent

Влияние на производительность

На Varnish

Минимальное влияние:

  • varnishstat читает из разделяемой памяти
  • Нет инвалидации кеша
  • Нет влияния на обработку запросов

Бенчмарк:

  • Накладные расходы: < 0.01% CPU
  • Нет измеримой деградации производительности

На агент

Использование ресурсов:

  • Память: +10 МБ
  • CPU: +2% во время сбора
  • Сеть: +1 КБ за сбор

Время сбора: < 0.2 секунды

Сценарии использования

1. Мониторинг hit rate кеша

Отслеживайте:

  • Процент попаданий
  • Тренды промахов
  • Долю hit-for-pass

Оповещение при:

  • Hit rate < 80% (плохое кеширование)
  • Резком падении hit rate
  • Высокой частоте hit-for-pass

2. Состояние бэкендов

Отслеживайте:

  • Частоту успешных соединений с бэкендами
  • Сбои бэкендов
  • Число занятых бэкендов

Оповещение при:

  • Частоте сбоев бэкендов > 1%
  • backend_busy > 0
  • Нездоровых бэкендах

3. Эффективность кеша

Отслеживайте:

  • Число кешированных объектов
  • Вытесненные по LRU объекты
  • Истёкшие объекты

Оптимизируйте:

  • Размер кеша (хранилище malloc)
  • Настройки TTL
  • Логику VCL

4. Клиентская нагрузка

Отслеживайте:

  • Клиентские соединения
  • Частоту запросов
  • Сброшенные соединения

Оповещение при:

  • Сброшенных соединениях > 0
  • Всплеске частоты соединений
  • Растущей очереди запросов

Лучшие практики

1. Настройте размер кеша

Установите подходящий размер кеша:

# /etc/varnish/varnish.params
VARNISH_STORAGE="malloc,4G"

Рассчитайте размер кеша:

Cache size = (Average object size) × (Number of objects) × 1.2

2. Отслеживайте hit rate

Здоровый hit rate: > 85%

Если hit rate < 80%:

  • Увеличьте размер кеша
  • Пересмотрите настройки TTL
  • Проверьте логику VCL
  • Проанализируйте заголовки, обходящие кеш

3. Избегайте вытеснения по LRU

Вытеснение по LRU указывает на:

  • Слишком малый размер кеша
  • Слишком долгий TTL
  • Высокую сменяемость объектов

Решение:

  • Увеличьте размер кеша
  • Уменьшите TTL для крупных объектов
  • Внедрите ограничения размера объектов

4. Настройте пулы потоков

# /etc/varnish/varnish.params
VARNISH_THREAD_POOLS=2
VARNISH_THREAD_POOL_MIN=100
VARNISH_THREAD_POOL_MAX=1000

Формула:

thread_pool_min = Number of CPUs × 50
thread_pool_max = Number of CPUs × 500

5. Включите логирование для отладки

# View real-time requests
varnishlog

# View specific backend
varnishlog -b

# View specific client
varnishlog -c

Тонкая настройка производительности Varnish

Конфигурация кеша

Хранилище malloc (рекомендуется):

VARNISH_STORAGE="malloc,8G"

Файловое хранилище:

VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,10G"

Оптимизация VCL

Установите заголовки кеширования:

sub vcl_backend_response {
    # Cache for 1 hour
    set beresp.ttl = 1h;

    # Remove cookies for static files
    if (bereq.url ~ "\.(jpg|jpeg|gif|png|css|js)$") {
        unset beresp.http.set-cookie;
    }
}

Нормализуйте заголовок Host:

sub vcl_recv {
    # Normalize host header
    set req.http.host = regsub(req.http.host, ":[0-9]+", "");
}

Проверки состояния бэкендов

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .probe = {
        .url = "/health";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

Расширенная конфигурация

Несколько экземпляров Varnish

plugins:
  varnish_cache1:
    enabled: true
    instance_name: cache1

  varnish_cache2:
    enabled: true
    instance_name: cache2

Docker-контейнер

Мониторинг Varnish в Docker:

plugins:
  varnish:
    enabled: true

Запуск Docker:

docker run -d --name varnish \
  -v /var/run:/var/run \
  varnish:latest

Примеры конфигураций

Базовая production-конфигурация

plugins:
  varnish:
    enabled: true

Несколько экземпляров

plugins:
  varnish_web:
    enabled: true
    instance_name: web_cache

  varnish_api:
    enabled: true
    instance_name: api_cache

Ограничения

Текущие ограничения

  1. Нет метрик по отдельным URL — только агрегированная статистика
  2. Нет метрик списка банов — статистика ban/purge не детализирована
  3. Нет метрик ESI — статистика Edge Side Includes не собирается

Масштабируемость

Протестировано с:

  • 10 000+ req/sec
  • 100 000+ кешированных объектов
  • Кешем размером в несколько ГБ

Производительность:

  • Накладные расходы varnishstat постоянны независимо от размера кеша

Чек-лист мониторинга

Критично:

  1. Hit rate < 80%
  2. Сбои бэкендов > 0
  3. Сброшенные соединения > 0
  4. Частое вытеснение по LRU

Важно: 5. Сбои создания потоков 6. backend_busy > 0 7. Длина очереди потоков > 0

Пороги оповещений

cache_hitrate: < 85
backend_fail_rate: > 0.01
client_drop: > 0
n_lru_nuked_rate: > 100/min

Следующие шаги

On this page