Redis — алерт при высоком mem-fragmentation-ratio
Redis работает, но `mem_fragmentation_ratio > 1.5` — реальное использование памяти намного больше отчёта `used_memory_human`. OOM придёт внезапно.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/redis-frag
# */5 * * * * root /opt/redis-frag.sh
HOST=${REDIS_HOST:-127.0.0.1}
PORT=${REDIS_PORT:-6379}
THRESH=${THRESH:-1.5} # alert above 1.5
INFO=$(redis-cli -h "$HOST" -p "$PORT" INFO memory)
RATIO=$(echo "$INFO" | awk -F: '/mem_fragmentation_ratio/{gsub(/\r/,"",$2); print $2}')
USED=$(echo "$INFO" | awk -F: '/used_memory_human/{gsub(/\r/,"",$2); print $2}')
# Bash floats: use bc
if (( $(echo "$RATIO > $THRESH" | bc -l) )); then
echo "redis-frag: ratio=$RATIO used=$USED (threshold $THRESH)"
curl -fsS "$HEARTBEAT_URL" --data "ratio=$RATIO,used=$USED"
exit 2
fi
echo "OK (ratio=$RATIO used=$USED)"
То же самое в Enterno.io
Заверните в Enterno heartbeat — увидите тренд fragmentation за 30 дней и сможете планировать MEMORY PURGE или рестарт за неделю до OOM.
Похожие рецепты
Slave-Redis отстаёт от master — read-after-write возвращает старые данные. Стандартного алерта нет, нужен внешний.
long_query_time = 1, slow_query_log включён. Нужно понимать, когда количество медленных запросов в минуту резко вырастает (deploy сломал индекс, ORM начал N+1).
Memcached переполнился и начал выбрасывать ключи под нагрузкой — приложение получает cache-miss и долбит БД. Нужен порог evictions/мин.