Мониторинг Memcached с помощью Proto Observability
На этой странице:
- Сбор метрик Memcached
- Сбор логов Memcached
Сбор метрик Memcached
Интеграция mcache собирает метрики, разговаривая с сервером по текстовому
протоколу memcached — она открывает соединение на порт memcached (по умолчанию
11211) и выполняет команды stats, stats items, stats slabs. JMX или
HTTP-эндпоинт не используются, поэтому специальный образ агента не нужен —
подойдёт обычный protoobp-agent:7.40.3.
Конфигурация Memcached
Со стороны самого memcached ничего настраивать не требуется — достаточно, чтобы
его порт был доступен с хоста (или из контейнера), где работает агент. Если
memcached слушает только Unix-сокет, путь к сокету указывается в конфиге проверки
(параметр socket, см. ниже) — он имеет приоритет над url/port.
SASL-аутентификация
Если на memcached включён SASL (-S), укажите в instance параметры username
и password — агент использует их для аутентификации перед stats. Без SASL
эти параметры не нужны.Очень скудный логгер
memcached — это сервер кеширования, и его основная ценность для наблюдаемости — метрики, а не логи: собственного «прикладного» лога у него по сути нет (см. раздел Сбор логов Memcached ниже). Поэтому начинать стоит именно с метрик.Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Создайте файл
/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-storeoptions.itemsиoptions.slabsпо умолчанию выключены — без них собираются только серверные метрики изstats. Включайте их, если нужна детализация по slab-классам (распределение размеров значений, эвикции и реклейм в разрезе классов).Перезапустите агента:
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 network, что и memcached, а агенту нужен смонтированный/var/run/docker.sock:/var/run/docker.sock:ro для
autodiscovery контейнеров.Проверка
Убедитесь, что проверка запустилась и собирает метрики:
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_connections | connection | Текущее число открытых соединений с сервером |
memcache_total_connections_rate | connection/sec | Скорость открытия новых соединений |
memcache_max_connections | connection | Сконфигурированный лимит соединений (-c) |
memcache_connection_structures | — | Число выделенных сервером connection-структур |
memcache_listen_disabled_num_rate | event/sec | Скорость событий «достигнут лимит соединений» (приём приостановлен) |
memcache_threads | thread | Число рабочих потоков сервера (-t) |
Хранилище и память
| Имя метрики | Единица | Описание |
|---|---|---|
memcache_curr_items | item | Текущее число элементов в кеше |
memcache_total_items | item | Суммарно сохранено элементов с момента старта |
memcache_bytes | byte | Объём памяти, занятый элементами сейчас |
memcache_limit_maxbytes | byte | Лимит памяти под хранилище (-m, в байтах) |
memcache_fill_percent | percent | bytes / limit_maxbytes — насколько кеш заполнен |
memcache_avg_item_size | byte | Средний размер элемента |
Команды и попадания/промахи
| Имя метрики | Единица | Описание |
|---|---|---|
memcache_cmd_get_rate | command/sec | Скорость команд get |
memcache_cmd_set_rate | command/sec | Скорость команд set |
memcache_cmd_flush_rate | command/sec | Скорость команд flush_all |
memcache_get_hits_rate | hit/sec | Скорость get, для которых ключ найден |
memcache_get_misses_rate | miss/sec | Скорость get, для которых ключа нет |
memcache_get_hit_percent | percent | Доля попаданий get с момента старта (get_hits / cmd_get * 100) |
memcache_delete_hits_rate | hit/sec | Скорость delete, удаливших элемент |
memcache_delete_misses_rate | miss/sec | Скорость delete по несуществующему ключу |
memcache_cas_hits_rate | hit/sec | Скорость CAS-операций, нашедших ключ |
memcache_cas_misses_rate | miss/sec | Скорость CAS-операций по несуществующему ключу |
memcache_cas_badval_rate | key/sec | Скорость CAS-операций, у которых не совпал переданный CAS-токен |
Счётчики
incr/decrвstats(incr_hits/incr_misses/decr_hits/decr_misses) отдаются интеграцией в составе общего потока командmemcache_cmd_*, а попаданияincr/decrв разрезе slab-классов видны в per-slabmemcache_slabs_incr_hits_rate/memcache_slabs_decr_hits_rate.
Эвикции и реклейм
| Имя метрики | Единица | Описание |
|---|---|---|
memcache_evictions_rate | eviction/sec | Скорость вытеснения валидных элементов ради места под новые — главный сигнал нехватки памяти |
Прочее
| Имя метрики | Единица | Описание |
|---|---|---|
memcache_uptime | second | Сколько секунд работает сервер |
memcache_bytes_read_rate | byte/sec | Скорость чтения из сети сервером |
memcache_bytes_written_rate | byte/sec | Скорость записи в сеть сервером |
memcache_rusage_user_rate | fraction | Доля пользовательского CPU-времени, потраченного процессом сервера |
memcache_rusage_system_rate | fraction | Доля системного CPU-времени, потраченного процессом сервера |
memcache_pointer_size | bit | Разрядность указателей на ОС хоста (обычно 32 или 64) |
Метрики LRU по slab-классам (options.items)
Появляются при options.items: true. Источник — stats items. Несут лейбл
slab (номер класса). Метрики _rate — это rate в секунду от соответствующих
кумулятивных счётчиков.
| Имя метрики | Единица | Описание |
|---|---|---|
memcache_items_number | item | Сколько элементов сейчас хранится в этом slab-классе |
memcache_items_number_hot | item | Элементов в HOT-сегменте LRU |
memcache_items_number_warm | item | Элементов в WARM-сегменте LRU |
memcache_items_number_cold | item | Элементов в COLD-сегменте LRU |
memcache_items_number_noexp | item | Элементов без срока жизни (класс NOEXP) |
memcache_items_age | second | Возраст самого старого элемента в LRU |
memcache_items_evicted_rate | eviction/sec | Скорость вытеснения элементов из LRU до истечения их срока |
memcache_items_evicted_nonzero_rate | eviction/sec | То же, но только для элементов с явно заданным TTL |
memcache_items_evicted_unfetched_rate | eviction/sec | Скорость вытеснения валидных элементов, которые ни разу не читали после set |
memcache_items_evicted_time | second | Сколько секунд назад в последний раз читали недавно вытесненный элемент |
memcache_items_expired_unfetched_rate | eviction/sec | Скорость реклейма просроченных элементов, которые ни разу не читали |
memcache_items_reclaimed_rate | operation/sec | Скорость переиспользования памяти просроченных элементов под новые set |
memcache_items_direct_reclaims_rate | operation/sec | Скорость случаев, когда рабочему потоку пришлось напрямую тянуть хвост LRU |
memcache_items_crawler_reclaimed_rate | operation/sec | Скорость освобождения элементов LRU-краулером |
memcache_items_tailrepairs_rate | operation/sec | Скорость самовосстановлений slab’а с утечкой refcount |
memcache_items_lrutail_reflocked_rate | item/sec | Скорость случаев, когда хвост LRU оказался заблокирован по refcount |
memcache_items_moves_to_cold_rate | item/sec | Скорость перемещений элементов из HOT/WARM в COLD |
memcache_items_moves_to_warm_rate | item/sec | Скорость перемещений элементов из COLD в WARM |
memcache_items_moves_within_lru_rate | item/sec | Скорость «подвижек» активных элементов внутри HOT/WARM |
memcache_items_outofmemory_rate | error/sec | Скорость случаев, когда slab-класс не смог сохранить новый элемент |
Метрики slab-аллокатора (options.slabs)
Появляются при options.slabs: true. Источник — stats slabs. Несут лейбл
slab (номер класса), кроме memcache_slabs_active_slabs. Метрики _rate —
rate в секунду.
| Имя метрики | Единица | Описание |
|---|---|---|
memcache_slabs_active_slabs | occurrence | Всего выделено slab-классов (без лейбла slab) |
memcache_slabs_chunk_size | byte | Размер одного чанка в классе |
memcache_slabs_chunks_per_page | buffer | Сколько чанков помещается в одну страницу |
memcache_slabs_total_pages | page | Всего страниц, выделенных классу |
memcache_slabs_total_chunks | buffer | Всего чанков, выделенных классу |
memcache_slabs_used_chunks | buffer | Сколько чанков отдано под элементы |
memcache_slabs_used_chunks_rate | buffer/sec | Скорость выделения чанков под элементы |
memcache_slabs_free_chunks | buffer | Чанки, ещё не отданные под элементы (или освобождённые через delete) |
memcache_slabs_free_chunks_end | buffer | Свободные чанки в конце последней выделенной страницы |
memcache_slabs_mem_requested | byte | Сколько байт запрошено на хранение в этом slab’е |
memcache_slabs_total_malloced | byte | Всего памяти выделено под страницы slab’ов |
memcache_slabs_get_hits_rate | hit/sec | Скорость get, обслуженных этим slab-классом |
memcache_slabs_cmd_set_rate | command/sec | Скорость set, сохранивших данные в этом классе |
memcache_slabs_delete_hits_rate | operation/sec | Скорость успешных delete в этом классе |
memcache_slabs_incr_hits_rate | operation/sec | Скорость incr, изменивших значение в этом классе |
memcache_slabs_decr_hits_rate | operation/sec | Скорость decr, изменивших значение в этом классе |
memcache_slabs_cas_hits_rate | operation/sec | Скорость CAS-операций, изменивших значение в этом классе |
memcache_slabs_cas_badval_rate | key/sec | Скорость CAS-операций в этом классе с несовпавшим CAS-токеном |
memcache_slabs_touch_hits_rate | operation/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_rateperslab, может помочь 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_ageperslab— возраст «хвоста» LRU; маленький возраст при активных эвикциях = класс под давлением.memcache_items_outofmemory_rate > 0perslab— конкретный slab-класс не может разместить новый элемент.memcache_items_reclaimed_ratevsmemcache_items_evicted_rate— реклейм просроченных (норма) против вытеснения живых (нехватка памяти).
Сбор логов Memcached
Логи memcached собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP.
Здесь — только специфичные для memcached настройки. Включение логов на стороне
агента (logs_enabled, logs_pobp_url) описано в
Получение данных логов.
У memcached почти нет логов
memcached — крайне скудный логгер. По умолчанию он пишет в stdout лишь несколько строк при старте (версия, slab page size, открытые сокеты), и больше — почти ничего. Чтобы лог-источник имел содержимое, запускайте memcached в very-verbose режиме (-vv): тогда на stdout идут одностроки по каждой команде —
<29 new auto-negotiating client connection, <29 set demo:item:1 0 0 480,
>29 STORED, <29 get demo:item:1, >29 END, … Это самостоятельные одностроковые
события (а не многострочные stack traces), поэтому правило multi_line для них
не нужно — каждая строка корректно уходит в proto-log-storage как
отдельная запись. Обратите внимание: -vv заметно увеличивает объём логов и сам
по себе нагружает сервер — на проде включайте его осознанно (диагностика); в
обычном режиме у memcached значимого «прикладного» лога просто нет.Конфигурация 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"}]'
Только нужные контейнеры
Если в агенте не задана переменнаяPOBP_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true,
агент собирает логи только тех контейнеров, на которых есть лейбл
com.protoobp.ad.logs.Проверка
В выводе 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мы не задавали, записи одностроковые.