Мониторинг Memcached с помощью Proto Observability

Сбор метрик и логов сервера кеширования Memcached: попадания/промахи, команды, память, эвикции и per-slab статистика.

На этой странице:

Сбор метрик Memcached

Интеграция mcache собирает метрики, разговаривая с сервером по текстовому протоколу memcached — она открывает соединение на порт memcached (по умолчанию 11211) и выполняет команды stats, stats items, stats slabs. JMX или HTTP-эндпоинт не используются, поэтому специальный образ агента не нужен — подойдёт обычный protoobp-agent:7.40.3.

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

Со стороны самого memcached ничего настраивать не требуется — достаточно, чтобы его порт был доступен с хоста (или из контейнера), где работает агент. Если memcached слушает только Unix-сокет, путь к сокету указывается в конфиге проверки (параметр socket, см. ниже) — он имеет приоритет над url/port.

Конфигурация ProtoOBP агента

Если агент запускается в виде службы на хосте

  1. Создайте файл /etc/protoobp-agent/conf.d/mcache.d/conf.yaml:

    init_config:
    
    instances:
      - url: localhost
        port: 11211
        # socket: /var/run/memcached/memcached.sock   # вместо url/port, если только сокет
        # username: protoobp     # только если на memcached включён SASL
        # password: protoobp
        options:
          items: true            # per-slab метрики memcache_items_* (лейбл `slab`)
          slabs: true            # метрики slab-аллокатора memcache_slabs_*
        # tags:
        #   - cache_role:session-store
    

    options.items и options.slabs по умолчанию выключены — без них собираются только серверные метрики из stats. Включайте их, если нужна детализация по slab-классам (распределение размеров значений, эвикции и реклейм в разрезе классов).

  2. Перезапустите агента: systemctl restart protoobp-agent.

Если агент запускается в виде Docker контейнера

Добавьте autodiscovery-лейблы к контейнеру memcached. В docker-compose.yaml:

services:
  memcached:
    image: memcached:1.6-alpine
    labels:
      com.protoobp.ad.check_names: '["mcache"]'
      com.protoobp.ad.init_configs: '[{}]'
      com.protoobp.ad.instances: '[{"url": "%%host%%", "port": 11211, "options": {"items": true, "slabs": true}}]'

%%host%% — autodiscovery-плейсхолдер, агент подставляет IP контейнера в docker network. Если на memcached включён SASL, добавьте в instance "username": "...", "password": "...".

В Dockerfile:

LABEL "com.protoobp.ad.check_names"='["mcache"]'
LABEL "com.protoobp.ad.init_configs"='[{}]'
LABEL "com.protoobp.ad.instances"='[{"url": "%%host%%", "port": 11211, "options": {"items": true, "slabs": true}}]'

Проверка

Убедитесь, что проверка запустилась и собирает метрики:

docker exec protoobp-agent agent status | grep -A 6 "^    mcache$"

Ожидаемый вывод — [OK] у instance и ненулевое число Metric Samples:

    mcache (3.3.0)
    --------------
      Instance ID: mcache:ef3d7ec1a2f712ab [OK]
      Configuration Source: container:docker://d9e7c7084d...
      Total Runs: 23
      Metric Samples: Last Run: 398, Total: 8,093
      Service Checks: Last Run: 1, Total: 23
      Average Execution Time : 26ms

Список конкретных серий — через agent check. Метрики _rate появляются только со второго запуска проверки (нужны два соседних значения кумулятивного счётчика), поэтому удобнее использовать --check-rate:

docker exec protoobp-agent agent check mcache --check-rate

В выводе должны присутствовать серии memcache_curr_items, memcache_bytes, memcache_get_hits_rate, memcache_get_misses_rate, memcache_get_hit_percent, memcache_cmd_set_rate, memcache_cmd_get_rate, memcache_curr_connections, memcache_total_connections_rate, а при options.items/options.slabs — ещё и memcache_items_* / memcache_slabs_* (по одной серии на slab-класс, с лейблом slab). На рабочем сервере под нагрузкой это даёт около 67 различных имён метрик.

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

Источник всех метрик — команды stats (серверные счётчики и gauge’ы), stats items и stats slabs (per-slab). Все метрики имеют тип gauge — содержат мгновенное значение на момент сбора. Метрики, имена которых заканчиваются на _rate, — это rate в секунду: интеграция берёт кумулятивный счётчик memcached (get_hits, cmd_set, evictions, …) и конвертирует его в скорость на стороне агента.

Лейблы

Добавляются агентом и ProtoOBP backend’ом:

ЛейблЗначение
hostХост, на котором работает агент
serviceТег service (через com.protoobp.tags.service или POBP_TAGS)
envТег env
slabНомер slab-класса — только на метриках memcache_items_* и memcache_slabs_*
docker_imageПолный ref образа контейнера (например, memcached:1.6-alpine)
image_nameИмя образа без тега
image_tagТег образа
short_imageКороткое имя образа

Плюс любые теги, заданные в tags: instance’а или в com.protoobp.tags.*.

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

Соединения и потоки
Имя метрикиЕдиницаОписание
memcache_curr_connectionsconnectionТекущее число открытых соединений с сервером
memcache_total_connections_rateconnection/secСкорость открытия новых соединений
memcache_max_connectionsconnectionСконфигурированный лимит соединений (-c)
memcache_connection_structuresЧисло выделенных сервером connection-структур
memcache_listen_disabled_num_rateevent/secСкорость событий «достигнут лимит соединений» (приём приостановлен)
memcache_threadsthreadЧисло рабочих потоков сервера (-t)
Хранилище и память
Имя метрикиЕдиницаОписание
memcache_curr_itemsitemТекущее число элементов в кеше
memcache_total_itemsitemСуммарно сохранено элементов с момента старта
memcache_bytesbyteОбъём памяти, занятый элементами сейчас
memcache_limit_maxbytesbyteЛимит памяти под хранилище (-m, в байтах)
memcache_fill_percentpercentbytes / limit_maxbytes — насколько кеш заполнен
memcache_avg_item_sizebyteСредний размер элемента
Команды и попадания/промахи
Имя метрикиЕдиницаОписание
memcache_cmd_get_ratecommand/secСкорость команд get
memcache_cmd_set_ratecommand/secСкорость команд set
memcache_cmd_flush_ratecommand/secСкорость команд flush_all
memcache_get_hits_ratehit/secСкорость get, для которых ключ найден
memcache_get_misses_ratemiss/secСкорость get, для которых ключа нет
memcache_get_hit_percentpercentДоля попаданий get с момента старта (get_hits / cmd_get * 100)
memcache_delete_hits_ratehit/secСкорость delete, удаливших элемент
memcache_delete_misses_ratemiss/secСкорость delete по несуществующему ключу
memcache_cas_hits_ratehit/secСкорость CAS-операций, нашедших ключ
memcache_cas_misses_ratemiss/secСкорость CAS-операций по несуществующему ключу
memcache_cas_badval_ratekey/secСкорость CAS-операций, у которых не совпал переданный CAS-токен

Счётчики incr / decr в stats (incr_hits/incr_misses/decr_hits/decr_misses) отдаются интеграцией в составе общего потока команд memcache_cmd_*, а попадания incr/decr в разрезе slab-классов видны в per-slab memcache_slabs_incr_hits_rate / memcache_slabs_decr_hits_rate.

Эвикции и реклейм
Имя метрикиЕдиницаОписание
memcache_evictions_rateeviction/secСкорость вытеснения валидных элементов ради места под новые — главный сигнал нехватки памяти
Прочее
Имя метрикиЕдиницаОписание
memcache_uptimesecondСколько секунд работает сервер
memcache_bytes_read_ratebyte/secСкорость чтения из сети сервером
memcache_bytes_written_ratebyte/secСкорость записи в сеть сервером
memcache_rusage_user_ratefractionДоля пользовательского CPU-времени, потраченного процессом сервера
memcache_rusage_system_ratefractionДоля системного CPU-времени, потраченного процессом сервера
memcache_pointer_sizebitРазрядность указателей на ОС хоста (обычно 32 или 64)

Метрики LRU по slab-классам (options.items)

Появляются при options.items: true. Источник — stats items. Несут лейбл slab (номер класса). Метрики _rate — это rate в секунду от соответствующих кумулятивных счётчиков.

Имя метрикиЕдиницаОписание
memcache_items_numberitemСколько элементов сейчас хранится в этом slab-классе
memcache_items_number_hotitemЭлементов в HOT-сегменте LRU
memcache_items_number_warmitemЭлементов в WARM-сегменте LRU
memcache_items_number_colditemЭлементов в COLD-сегменте LRU
memcache_items_number_noexpitemЭлементов без срока жизни (класс NOEXP)
memcache_items_agesecondВозраст самого старого элемента в LRU
memcache_items_evicted_rateeviction/secСкорость вытеснения элементов из LRU до истечения их срока
memcache_items_evicted_nonzero_rateeviction/secТо же, но только для элементов с явно заданным TTL
memcache_items_evicted_unfetched_rateeviction/secСкорость вытеснения валидных элементов, которые ни разу не читали после set
memcache_items_evicted_timesecondСколько секунд назад в последний раз читали недавно вытесненный элемент
memcache_items_expired_unfetched_rateeviction/secСкорость реклейма просроченных элементов, которые ни разу не читали
memcache_items_reclaimed_rateoperation/secСкорость переиспользования памяти просроченных элементов под новые set
memcache_items_direct_reclaims_rateoperation/secСкорость случаев, когда рабочему потоку пришлось напрямую тянуть хвост LRU
memcache_items_crawler_reclaimed_rateoperation/secСкорость освобождения элементов LRU-краулером
memcache_items_tailrepairs_rateoperation/secСкорость самовосстановлений slab’а с утечкой refcount
memcache_items_lrutail_reflocked_rateitem/secСкорость случаев, когда хвост LRU оказался заблокирован по refcount
memcache_items_moves_to_cold_rateitem/secСкорость перемещений элементов из HOT/WARM в COLD
memcache_items_moves_to_warm_rateitem/secСкорость перемещений элементов из COLD в WARM
memcache_items_moves_within_lru_rateitem/secСкорость «подвижек» активных элементов внутри HOT/WARM
memcache_items_outofmemory_rateerror/secСкорость случаев, когда slab-класс не смог сохранить новый элемент

Метрики slab-аллокатора (options.slabs)

Появляются при options.slabs: true. Источник — stats slabs. Несут лейбл slab (номер класса), кроме memcache_slabs_active_slabs. Метрики _rate — rate в секунду.

Имя метрикиЕдиницаОписание
memcache_slabs_active_slabsoccurrenceВсего выделено slab-классов (без лейбла slab)
memcache_slabs_chunk_sizebyteРазмер одного чанка в классе
memcache_slabs_chunks_per_pagebufferСколько чанков помещается в одну страницу
memcache_slabs_total_pagespageВсего страниц, выделенных классу
memcache_slabs_total_chunksbufferВсего чанков, выделенных классу
memcache_slabs_used_chunksbufferСколько чанков отдано под элементы
memcache_slabs_used_chunks_ratebuffer/secСкорость выделения чанков под элементы
memcache_slabs_free_chunksbufferЧанки, ещё не отданные под элементы (или освобождённые через delete)
memcache_slabs_free_chunks_endbufferСвободные чанки в конце последней выделенной страницы
memcache_slabs_mem_requestedbyteСколько байт запрошено на хранение в этом slab’е
memcache_slabs_total_mallocedbyteВсего памяти выделено под страницы slab’ов
memcache_slabs_get_hits_ratehit/secСкорость get, обслуженных этим slab-классом
memcache_slabs_cmd_set_ratecommand/secСкорость set, сохранивших данные в этом классе
memcache_slabs_delete_hits_rateoperation/secСкорость успешных delete в этом классе
memcache_slabs_incr_hits_rateoperation/secСкорость incr, изменивших значение в этом классе
memcache_slabs_decr_hits_rateoperation/secСкорость decr, изменивших значение в этом классе
memcache_slabs_cas_hits_rateoperation/secСкорость CAS-операций, изменивших значение в этом классе
memcache_slabs_cas_badval_ratekey/secСкорость CAS-операций в этом классе с несовпавшим CAS-токеном
memcache_slabs_touch_hits_rateoperation/secСкорость touch, обслуженных этим классом

Ключевые метрики для дашбордов и алертов

Доступность memcached

  • Отсутствие свежих серий по host/service — memcached недоступен или агент не может подключиться к его порту. Дополнительно — service check интеграции (mcache_can_connect).
  • memcache_uptime резко упал до маленького значения = сервер недавно перезапускался (кеш «холодный»).

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

  • memcache_get_hit_percent — главный SLI. Падение hit-rate → больше нагрузки уходит на backend (БД). Алерт по порогу (например, < 90 %).
  • Соотношение memcache_get_hits_rate / memcache_get_misses_rate в динамике — деградация заметна раньше, чем интегральный get_hit_percent.

Память и эвикции

  • memcache_fill_percent приближается к 100 и memcache_evictions_rate > 0 = памяти не хватает, кеш вытесняет ещё живые элементы. Это основной алерт по ёмкости.
  • memcache_evictions_rate устойчиво ненулевой при невысоком fill_percent — перекос распределения по slab-классам: смотрите memcache_items_evicted_rate / memcache_items_outofmemory_rate per slab, может помочь slab automove или пересмотр размеров значений.
  • memcache_curr_items / memcache_bytes / memcache_limit_maxbytes — базовые графики ёмкости.

Соединения

  • memcache_curr_connections приближается к memcache_max_connections, или memcache_listen_disabled_num_rate > 0 = упёрлись в лимит соединений (-c), новые клиенты получают отказ.
  • memcache_total_connections_rate аномально высокий = клиент не переиспользует соединения (нет пула).

Slab-уровень (при options.items / options.slabs)

  • memcache_items_age per slab — возраст «хвоста» LRU; маленький возраст при активных эвикциях = класс под давлением.
  • memcache_items_outofmemory_rate > 0 per slab — конкретный slab-класс не может разместить новый элемент.
  • memcache_items_reclaimed_rate vs memcache_items_evicted_rate — реклейм просроченных (норма) против вытеснения живых (нехватка памяти).

Сбор логов Memcached

Логи memcached собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP. Здесь — только специфичные для memcached настройки. Включение логов на стороне агента (logs_enabled, logs_pobp_url) описано в Получение данных логов.

Конфигурация ProtoOBP агента

Если агент запускается в виде службы на хосте

Дополните уже существующий /etc/protoobp-agent/conf.d/mcache.d/conf.yaml (тот же файл, в котором лежит instances: для метрик) блоком logs:.

Если memcached запущен через systemd, его stdout/stderr обычно уходит в journald — читайте его как journald-источник:

logs:
  - type: journald
    source: memcached
    service: memcached
    include_units:
      - memcached.service

Если memcached сконфигурирован писать в файл (-vv плюс редирект в /var/log/memcached.log, либо опция logfile в systemd unit / sysconfig):

logs:
  - type: file
    path: /var/log/memcached.log
    source: memcached
    service: memcached

Перезапустите агента: systemctl restart protoobp-agent.

Если агент запускается в виде Docker контейнера

Шаг 1 — включите сбор логов в самом агенте через переменные окружения и смонтируйте директорию JSON-логов docker-демона:

services:
  protoobp-agent:
    environment:
      POBP_LOGS_ENABLED: "true"
      POBP_LOGS_CONFIG_USE_HTTP: "true"
      POBP_LOGS_CONFIG_LOGS_POBP_URL: <protoobp-backend>:<port>
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Прямое чтение JSON-лог файлов docker-демона быстрее,
      # чем тянуть их через Docker socket API.
      - /var/lib/docker/containers:/var/lib/docker/containers:ro

Шаг 2 — запустите memcached в very-verbose режиме и добавьте лейбл com.protoobp.ad.logs к его контейнеру. Агент подхватит stdout контейнера и пометит записи указанными source и service. Правило log_processing_rules здесь не задаём — записи одностроковые:

services:
  memcached:
    image: memcached:1.6-alpine
    command: ["memcached", "-vv"]
    labels:
      com.protoobp.ad.logs: '[{"source": "memcached", "service": "memcached"}]'

Проверка

В выводе agent status должен быть раздел Logs Agent со статусом running и источник memcached с ненулевым BytesRead:

docker exec protoobp-agent agent status \
  | sed -n '/^==== Logs Agent ====/,/^====/p'

Пример:

Logs Agent
==========
    Reliable: Sending compressed logs in HTTPS to demo.proto.group on port 443
    LogsProcessed: 19720
    LogsSent: 19525

  docker
  ------
    - Type: file
      Identifier: d9e7c7084d...
      Path: /var/lib/docker/containers/d9e7c7084d.../d9e7c7084d...-json.log
      Service: memcached
      Source: memcached
      Status: OK
      BytesRead: 2080158
      Average Latency (ms): 0

Lines Combined / MultiLine matches в блоке memcached будут нулевыми — правило multi_line мы не задавали, записи одностроковые.