memcached в systemd: почему не запускается
memcached — простая служба, и её отказы почти всегда сводятся к трём вещам: занятый порт, недопустимые параметры запуска и нехватка памяти под заданный размер кеша.
О службе
Параметры memcached задаются не в отдельном файле настроек, а ключами командной строки. В дистрибутивах их выносят в файл окружения (/etc/memcached.conf или /etc/sysconfig/memcached), который unit-файл подключает. Поэтому правки идут именно туда, а не в unit.
Вторая особенность — память. Размер кеша задаётся ключом и выделяется по мере заполнения. Если он больше доступной памяти, служба работает до первого заполнения, а потом её убивает ядро. На небольших машинах это выглядит как случайные падения под нагрузкой.
Как устроена
| Порт по умолчанию | 11211; в дистрибутивах часто ограничен адресом 127.0.0.1 |
|---|---|
| Где параметры | ключи командной строки, вынесенные в /etc/memcached.conf |
| Размер кеша | ключ -m в мегабайтах; выделяется по мере заполнения |
| Проверка | echo stats | nc 127.0.0.1 11211 | head — отвечает ли служба |
Частые ошибки
5 записей базы отмечены за этой службой.
Сообщения журнала
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Cannot assign requested address при привязкеОшибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
Состояния результата
- Failed with result 'oom-kill'Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
Коды выхода
- status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
Ошибки служб
- memcached: соединение отклоняется с других машинКеш доступен локально, но не по сети: привязка к петлевому интерфейсу или брандмауэр.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
Диагностика
Состояние и код завершения.
systemctl status memcached --no-pager -lКто занимает порт кеша.
sudo ss -tlnp | grep 11211Действующие ключи запуска.
grep -vE "^#|^$" /etc/memcached.confОтвечает ли служба и её счётчики.
echo stats | timeout 3 nc 127.0.0.1 11211 | head -12Параметры unit, которые тут важны
- MemoryMax=предел памяти должен быть выше размера кеша с запасом
- User=служба работает от отдельного пользователя memcache
- EnvironmentFile=ключи запуска подключаются файлом окружения
Источники
- Документация memcached
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)