Железо и софт • 06.06.2026
Memcached выдает ошибку Server reached connection limit как исправить лимиты сокетов
Развернул распределенный сервер кэширования Memcached на операционной системе Linux для разгрузки тяжелых SQL-запросов веб-приложения. Во время утреннего всплеска посещаемости бэкенд внезапно потерял связь с кэшем, а в логи консоли начал сыпаться критический код сбоя: «Memcached::set(): Server reached connection limit» или «connection refused». При этом сама служба кэширования отображается в процессах как активная, но утилиты мониторинга и новые сокеты от бэкенд-воркеров намертво отсекаются. Свободной оперативной памяти на сервере еще много. Подскажите, из-за каких скрытых системных лимитов дескрипторов и параметров конфигурации демон уходит в этот сетевой ступор и как разблокировать открытые порты без полной жесткой перезагрузки СУБД?
Ответы (5)
Артем Кэш
Чтобы принудительно расширить границы встроенного пула одновременных сетевых подключений к демону кэширования, вам необходимо скорректировать параметры его запуска по шагам:
1. Подключитесь к вашему Linux-серверу по SSH от имени суперпользователя.
2. Откройте главный конфигурационный файл утилиты через текстовый редактор nano: `sudo nano /etc/memcached.conf`.
3. Нажмите сочетание клавиш Ctrl + W и найдите строку, содержащую параметр максимального количества одновременных подключений `-c`. По умолчанию там обычно прописан лимит всего в 1024 слота.
4. Измените числовой параметр, выставив безопасное значение под высокие нагрузки, например: `-c 4096` (или больше, в зависимости от количества ваших бэкенд-воркеров).
5. Сохраните изменения в файле (Ctrl + O, Enter) и выйдите из редактора (Ctrl + X). Принудительно перезапустите службу для очистки сетевых сокетов командой: `sudo systemctl restart memcached`.
Марина Девопс
Здорово! Ошибка "Server reached connection limit" — это классический сетевой капкан при масштабировании бэкенда. По умолчанию Memcached имеет довольно скромные лимиты: ядро готово удерживать ровно 1024 активных сокета. Если твое приложение на Node.js или PHP использует постоянные соединения (persistent connections) и развернуто в кластере на десятках серверов, то при росте трафика каждый воркер открывает свой порт к кэшу. Как только суммарное количество открытых дескрипторов утыкается в 1024-й барьер, демон включает жесткую защиту памяти, прекращает процедуру сетевого рукопожатия (TCP handshake) для всех новых пакетов и молча сбрасывает сессии.
Дмитрий Сис
Ребята, помните критически важный нюанс: простое увеличение ключа `-c` в файле `memcached.conf` не сработает, если у вас зажаты лимиты открытых файлов (open files descriptors) на уровне самой операционной системы Linux. Каждый сетевой сокет с точки зрения ОС — это файл. Если системный лимит для пользователя `memcache` ограничен стандартными 1024 дескрипторами, то сколько бы тысяч подключений вы ни прописали в конфиге СУБД, ядро Linux просто запретит программе плодить новые сокеты, выплевывая ошибку "Too many open files". Обязательно проверяйте текущее ограничение в терминале с помощью системной команды `ulimit -n`.
Никита Облако
Чтобы принудительно расширить границы доступных файловых дескрипторов для процесса демона на уровне системного менеджера systemd, выполните перенастройку по инструкции:
1. Запустите консоль терминала и откройте редактор переопределения параметров службы: `sudo systemctl edit memcached`.
2. Системный менеджер откроет пустой файл. Пропишите туда блок жестких лимитов, снимающий ограничения на порты и файлы:
`[Service]`
`LimitNOFILE=65535`
3. Сохраните изменения (в nano: Ctrl+O, Enter) и закройте текстовый редактор (Ctrl+X).
4. Выполните принудительное обновление конфигурации диспетчера служб Linux, чтобы ядро пересчитало связи: `sudo systemctl daemon-reload`.
5. Перезапустите кэш-сервер: `sudo systemctl restart memcached`. Теперь ограничения операционной системы будут полностью сняты.
Роман Скрипт
Если раздувать системные лимиты ulimit в ОС не хочется, решите проблему оптимизацией логики пула соединений в коде самого приложения. По умолчанию воркеры бэкенда могут удерживать сокеты открытыми бесконечно (Keep-Alive), даже если запросов нет. Настройте на стороне клиента жесткий параметр `timeout` и `idle_timeout` для пула подключений Memcached, выставив там значение около 5–10 секунд. Это заставит ваше приложение вовремя закрывать неиспользуемые сетевые мосты и освобождать слоты для новых веб-запросов, исключая переполнение буфера.