Плагин Memcached

Мониторинг распределённой системы кэширования в памяти Memcached с подробными метриками, охватывающими частоту попаданий в кэш, использование памяти, соединения и статистику элементов.

Обзор

Плагин Memcached собирает детальные метрики с серверов Memcached, включая:

  • Производительность кэша - Hit rate, miss rate, эффективность кэша
  • Статистика памяти - Использование памяти, вытеснения, лимиты памяти
  • Статистика элементов - Текущие элементы, всего элементов, вытеснения элементов
  • Метрики соединений - Текущие соединения, скорость соединений, отклонённые соединения
  • Счётчики операций - Get, set, delete, increment, decrement, touch
  • Сетевая статистика - Прочитанные/записанные байты, уступки соединений

Требования

Версия Memcached

  • Минимум: Memcached 1.4
  • Рекомендуется: Memcached 1.6 или новее
  • Протестировано с: Memcached 1.4, 1.5, 1.6

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

pip install python-memcached>=1.59

Устанавливается автоматически при использовании PLUGINS=memcached во время установки агента.

Доступ к Memcached

Агенту нужен сетевой доступ к серверу Memcached (порт по умолчанию 11211).

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

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

plugins:
  memcached:
    enabled: true
    host: localhost
    port: 11211

С аутентификацией SASL

plugins:
  memcached:
    enabled: true
    host: localhost
    port: 11211
    username: memcache_user
    password: your-password

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

plugins:
  memcached:
    enabled: true                # Enable/disable plugin
    host: localhost              # Memcached host
    port: 11211                  # Memcached port (default: 11211)
    username: user               # SASL username (optional)
    password: password           # SASL password (optional)
    timeout: 10                  # Connection timeout (seconds)

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

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

export MEMCACHED_HOST="localhost"
export MEMCACHED_PORT="11211"
export MEMCACHED_USERNAME="user"
export MEMCACHED_PASSWORD="password"

Настройка Memcached

Установка

Ubuntu/Debian:

sudo apt-get update
sudo apt-get install memcached

CentOS/RHEL:

sudo yum install memcached

Запуск сервиса:

sudo systemctl start memcached
sudo systemctl enable memcached

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

Отредактируйте конфиг Memcached:

Ubuntu/Debian:

sudo nano /etc/memcached.conf

CentOS/RHEL:

sudo nano /etc/sysconfig/memcached

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

# Memory limit (MB)
-m 64

# Listen on localhost only (security)
-l 127.0.0.1

# Port
-p 11211

# Max connections
-c 1024

# Username to run as
-u memcache

Перезапустите после изменений:

sudo systemctl restart memcached

Включение аутентификации SASL (опционально)

Установите SASL:

# Ubuntu/Debian
sudo apt-get install libsasl2-2 sasl2-bin

# CentOS/RHEL
sudo yum install cyrus-sasl-plain

Настройте Memcached с SASL:

# Start Memcached with SASL
-S

Создайте пользователя SASL:

echo "mech_list: plain" | sudo tee /etc/sasl2/memcached.conf
echo "memcache_user:your-password" | sudo tee /etc/sasl2/memcached-sasldb
sudo saslpasswd2 -a memcached -c memcache_user

Конфигурация безопасности

Привязка только к localhost:

-l 127.0.0.1

Правила файрвола (если слушает на 0.0.0.0):

# Ubuntu/Debian
sudo ufw allow from 192.168.1.0/24 to any port 11211
sudo ufw deny 11211

# CentOS/RHEL
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=11211 protocol=tcp accept'
sudo firewall-cmd --reload

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

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

Метрика Описание Единица Тип
cmd_get Всего команд get Количество Counter
cmd_set Всего команд set Количество Counter
get_hits Запросы get с попаданиями Количество Counter
get_misses Запросы get с промахами Количество Counter
hit_rate_percent Процент попаданий в кэш Проценты Gauge

Расчёт hit rate:

hit_rate_percent = (get_hits / (get_hits + get_misses)) × 100

Метрики памяти

Метрика Описание Единица Тип
bytes Текущая используемая память Байты Gauge
limit_maxbytes Лимит памяти Байты Gauge
memory_used_percent Процент утилизации памяти Проценты Gauge
evictions Элементы, вытесненные из кэша Количество Counter
reclaimed Освобождённые слоты памяти Количество Counter

Расчёт использования памяти:

memory_used_percent = (bytes / limit_maxbytes) × 100

Метрики элементов

Метрика Описание Единица Тип
curr_items Текущее число элементов Количество Gauge
total_items Всего сохранённых элементов (за всё время) Количество Counter

Метрики соединений

Метрика Описание Единица Тип
curr_connections Текущее число открытых соединений Количество Gauge
total_connections Всего соединений (за всё время) Количество Counter

Сетевые метрики

Метрика Описание Единица Тип
bytes_read Прочитано байт из сети Байты Counter
bytes_written Записано байт в сеть Байты Counter

Метрики сервера

Метрика Описание Единица Тип
uptime_seconds Время работы сервера Секунды Gauge
version Версия Memcached Строка Info

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

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

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

  • Hit Rate - Процент эффективности кэша
  • Memory Usage - Текущее против лимита
  • Items - Текущее число элементов
  • Connections - Активные соединения

График Hit Rate

  • Hit rate кэша во времени
  • Miss rate
  • Тренды соотношения hit/miss

График использования памяти

  • Использование памяти против лимита
  • Процент утилизации памяти
  • Скорость вытеснения

График элементов

  • Текущее число элементов
  • Скорость роста элементов
  • Истёкшие/вытесненные элементы

График соединений

  • Активные соединения
  • Скорость соединений
  • Отклонённые соединения

График операций

  • Get/set в секунду
  • Операции delete/incr/decr
  • Распределение команд

Установка

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

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

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

  1. Установите зависимость Python:

    cd /opt/statusradar
    source venv/bin/activate  # If using venv
    pip install python-memcached
  2. Включите плагин в конфигурации:

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

    Добавьте:

    plugins:
      memcached:
        enabled: true
        host: localhost
        port: 11211
  3. Перезапустите агент:

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

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

    Ожидаемо:

    INFO: Plugin memcached: Metrics collected successfully
    INFO: Plugin memcached: 1234 items, 95.5% hit rate

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

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

cd /opt/statusradar
python3 plugins/memcached_plugin.py

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

Plugin: memcached
Enabled: True
Available: True

Collecting metrics...
{
  "cmd_get": 123456,
  "cmd_set": 45678,
  "get_hits": 117890,
  "get_misses": 5566,
  "hit_rate": 95.5,
  "bytes": 45678912,
  "limit_maxbytes": 67108864,
  "mem_usage_percent": 68.1,
  "curr_items": 1234,
  "evictions": 56,
  "curr_connections": 12,
  "total_connections": 5678,
  "uptime": 86400
}

Тест подключения к Memcached

# Using telnet
telnet localhost 11211

# Commands:
stats
quit

# Using memcached-tool
memcached-tool localhost:11211 stats

# Using netcat
echo "stats" | nc localhost 11211

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

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

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

sudo systemctl status memcached

Проверка 2: Может ли агент подключиться к Memcached?

telnet localhost 11211
# Type: stats
# Should show statistics

Проверка 3: Установлен ли Python-пакет?

python3 -c "import memcache; print(memcache.__version__)"

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

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

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

"No module named 'memcache'"

Ошибка:

ERROR: No module named 'memcache'

Решение:

pip install python-memcached
# Or if using venv:
cd /opt/statusradar && source venv/bin/activate && pip install python-memcached

"Connection refused"

Ошибка:

ERROR: Plugin memcached: Connection refused

Причины:

  1. Memcached не запущен
  2. Неверный host/port
  3. Файрвол блокирует соединение

Решение:

# Check Memcached is running
sudo systemctl status memcached

# Check port
sudo netstat -tlnp | grep 11211

# Test connection
telnet localhost 11211

"Connection timeout"

Ошибка:

ERROR: Plugin memcached: Connection timeout

Причины:

  1. Memcached перегружен
  2. Сетевые проблемы
  3. Memcached не отвечает

Решение:

# Check Memcached load
echo "stats" | nc localhost 11211 | grep curr_connections

# Restart if needed
sudo systemctl restart memcached

"SASL authentication failed"

Ошибка:

ERROR: Plugin memcached: SASL authentication failed

Причина: Неверные имя пользователя/пароль

Решение:

# Verify SASL user
sudo sasldblistusers2 -f /etc/sasl2/memcached-sasldb

# Reset password
sudo saslpasswd2 -a memcached -c memcache_user

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

На Memcached

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

  • Команда stats возвращает предварительно рассчитанную статистику
  • Без инвалидации кэша и вытеснений
  • Время ответа: < 1 мс

Бенчмарк:

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

На агент

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

  • Память: +5 MB
  • CPU: +1% во время сбора
  • Сеть: +0.5 KB за сбор

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

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

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

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

  • Процент попаданий
  • Тренды miss rate
  • Соотношение hit/miss во времени

Настройте оповещения на:

  • Hit rate < 90% (неэффективное кэширование)
  • Внезапное падение hit rate
  • Скачок miss rate

2. Управление памятью

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

  • Использование памяти против лимита
  • Скорость вытеснения
  • Процент утилизации памяти

Настройте оповещения на:

  • Использование памяти > 90%
  • Высокую скорость вытеснения (памяти слишком мало)
  • Вытеснение неизвлечённых элементов (потраченная впустую память)

3. Мониторинг соединений

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

  • Текущие соединения
  • Отклонённые соединения
  • Достижение лимита соединений

Настройте оповещения на:

  • Соединения > 90% от максимума
  • Отклонённые соединения > 0
  • Частое достижение лимита соединений

4. Жизненный цикл элементов

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

  • Рост числа элементов
  • Истёкшие элементы
  • Вытесненные элементы

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

  • Настройки TTL
  • Выделение памяти
  • Стратегии прогрева кэша

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

1. Установите подходящий лимит памяти

Рассчитайте потребность в памяти:

Memory = (Average item size) × (Number of items) × 1.2 (overhead)

Example:
Item size: 1KB
Items: 100,000
Memory = 1KB × 100,000 × 1.2 = 120MB

Настройте в Memcached:

-m 128  # Set to 128MB

2. Следите за hit rate

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

Если hit rate < 90%:

  • Увеличьте память (параметр -m)
  • Пересмотрите стратегию кэширования
  • Проверьте значения TTL
  • Исследуйте паттерны инвалидации кэша

3. Избегайте вытеснений

Вытеснения указывают на:

  • Слишком низкий лимит памяти
  • Элементы не читаются до истечения срока
  • Перегрузку кэша (cache churn)

Решения:

  • Увеличьте лимит памяти
  • Оптимизируйте значения TTL
  • Реализуйте прогрев кэша

4. Установите лимиты соединений

-c 1024  # Max simultaneous connections

Формула:

Max connections = (Application pool size × App instances) + 50 (overhead)

5. Используйте привязку к localhost для безопасности

-l 127.0.0.1  # Bind to localhost only

Привязывайтесь к 0.0.0.0 только если:

  • Memcached на отдельном сервере
  • Настроены правила файрвола
  • Включена аутентификация SASL

6. Включите оповещения о лимите соединений

Следите за метрикой listen_disabled_num:

  • 0 указывает на достижение лимита соединений

  • Увеличьте параметр -c, если это происходит часто

Тюнинг производительности Memcached

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

1. Выберите подходящий размер slab:

# Growth factor (default: 1.25)
-f 1.25

# Smaller factor = less wasted memory, more slabs
# Larger factor = less overhead, more waste

2. Следите за статистикой slab:

echo "stats slabs" | nc localhost 11211

Оптимизация соединений

1. Увеличьте максимальное число соединений:

-c 2048

2. Следите за использованием соединений:

echo "stats" | nc localhost 11211 | grep curr_connections

Конфигурация потоков

Многопоточный Memcached:

-t 4  # 4 threads

Рекомендуется:

threads = Number of CPU cores

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

Кластер Memcached

Мониторинг нескольких экземпляров Memcached:

plugins:
  memcached_1:
    enabled: true
    host: cache1.internal
    port: 11211

  memcached_2:
    enabled: true
    host: cache2.internal
    port: 11211

Unix-сокет

Memcached на Unix-сокете:

# Memcached config
-s /var/run/memcached/memcached.sock

Конфигурация плагина:

plugins:
  memcached:
    enabled: true
    socket: /var/run/memcached/memcached.sock

Docker-контейнер

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

plugins:
  memcached:
    enabled: true
    host: memcached-container
    port: 11211

Docker run:

docker run -d --name memcached \
  -p 11211:11211 \
  memcached -m 64

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

Базовый продакшен

plugins:
  memcached:
    enabled: true
    host: localhost
    port: 11211

С аутентификацией SASL

plugins:
  memcached:
    enabled: true
    host: cache.internal
    port: 11211
    username: memcache_user
    password: ${MEMCACHED_PASSWORD}

Конфигурация высокой доступности

plugins:
  memcached_primary:
    enabled: true
    host: cache-primary.internal
    port: 11211

  memcached_secondary:
    enabled: true
    host: cache-secondary.internal
    port: 11211

Ограничения

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

  1. Нет метрик по отдельным slab - Только общесерверная статистика
  2. Нет метрик по отдельным ключам - Невозможно мониторить отдельные ключи кэша
  3. Нет информации о ребалансировке slab - Нет статистики slab automove

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

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

  • Один экземпляр: до 10M элементов
  • Память: до 64 ГБ
  • Пропускная способность: 100,000+ ops/sec

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

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

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

Стратегия кэширования

1. Установите подходящий TTL:

# Short-lived data
cache.set('session_123', data, time=300)  # 5 minutes

# Long-lived data
cache.set('user_profile', data, time=3600)  # 1 hour

2. Реализуйте прогрев кэша:

# Pre-populate cache on startup
def warm_cache():
    for item in get_popular_items():
        cache.set(item.key, item.data, time=3600)

3. Корректно обрабатывайте промахи кэша:

def get_user(user_id):
    # Try cache first
    user = cache.get(f'user_{user_id}')
    if user is None:
        # Cache miss - fetch from database
        user = database.get_user(user_id)
        cache.set(f'user_{user_id}', user, time=3600)
    return user

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

Ежедневно:

  • Процент hit rate
  • Использование памяти
  • Скорость вытеснения

Еженедельно:

  • Паттерны соединений
  • Тренды числа элементов
  • Рост памяти

Ежемесячно:

  • Планирование ёмкости
  • Тренды производительности
  • Анализ эффективности кэша

Дальнейшие шаги

On this page