Главная
» Как сделать
»
Debian 12 на VPS с небольшим объемом оперативной памяти: как уменьшить количество сбоев MySQL из-за нехватки памяти.
Debian 12 на VPS с небольшим объемом оперативной памяти: как уменьшить количество сбоев MySQL из-за нехватки памяти.
Риск остановки MySQL из-за ошибки OOM killer на VPS с небольшим объемом оперативной памяти и Debian 12 можно снизить, подтвердив причину, распределив память между всеми службами, ограничив параллельное выполнение операций с базой данных и выделив файл подкачки там, где это позволяет VPS. Уменьшение размера буферного пула InnoDB само по себе не является полным решением. Ни файл подкачки, ни настройка защиты от ошибки OOM не гарантируют бесперебойной работы при чрезмерно большой нагрузке.
Данное руководство было составлено 9 октября 2026 года с использованием Debian 12 «bookworm», Linux 6.1 и документации Oracle MySQL 8.0/8.4. Приведенные ниже настройки являются иллюстративными отправными точками, а не результатами бенчмарков или универсальной конфигурацией. Перед внесением изменений создайте резервную копию базы данных и конфигурации и запланируйте перезапуск базы данных, когда время простоя будет приемлемым.
1. Перед копированием настроек MySQL определите сервер.
Подтверждено: пакет default-mysql-server в Debian 12 зависит от MariaDB. На VPS, где указано, что работает «MySQL», на самом деле может работать MariaDB, в то время как на другом может быть установлена Oracle MySQL из отдельного репозитория или контейнера.
mysql --version
systemctl status mysql mariadb
Первая команда идентифицирует клиент, но не позволяет однозначно определить работающий сервер. Подключитесь, используя свою учетную запись администратора базы данных, и выполните:
SELECT VERSION(), @@version_comment;
Используйте существующий метод аутентификации; в установках MariaDB под Debian может быть разрешено локальное администрирование с помощью команды sudo mysql`.`. Запишите версию сервера и реальное имя службы. В последующих командах службы используйте mysql.service`;`, если необходимо, замените ` mariadb.service.`. Не добавляйте переменные, доступные только для Oracle, в конфигурацию MariaDB.
Проверьте имена клиента и службы, затем запросите у работающего сервера информацию о продукте и его версии.
2. Подтвердите, что завершение работы произошло из-за нехватки памяти (OOM).
Распространенное заблуждение: любой необъяснимый перезапуск базы данных — это ошибка нехватки памяти (OOM kill). Ошибки аутентификации, исчерпание дискового пространства, некорректная конфигурация, сбои и перезапуск администратором также могут прервать работу сервиса.
Найдите сообщения ядра, указывающие на нехватку памяти и завершенный процесс, в период, близкий к инциденту, а затем сопоставьте эти сообщения с журналом службы. Также проверьте журнал ошибок базы данных, если ваш пакет записывает его в файл, а не в журнал. Если инцидент произошел до перезагрузки, проверьте предыдущую загрузку, journalctl -k -b -1если доступны сохраненные журналы. Отсутствие исторических журналов не позволяет подтвердить причину.
Менеджер пользовательского пространства также может завершать рабочие нагрузки. В руководстве по systemd-oomd в Debian описано вмешательство, основанное на нехватке памяти, перед событием OOM ядра. Проверьте, установлен ли и активен ли он, вместо того, чтобы предполагать, что каждый VPS на Debian его использует.
В системе cgroup v2 используйте указанный путь к ControlGroup для чтения memory.events, memory.max, и memory.swap.maxв /sys/fs/cgroup. Проверьте также родительские cgroup. Документация Linux cgroup v2 объясняет эти счетчики и ограничения. cgroup может исчерпать разрешенную память, даже если хост имеет достаточную емкость. Счетчик oom_killрегистрирует завершение процессов, но для установления причины необходимо учитывать ограничения и журналы.
Перед тем как связывать сбой в работе базы данных с ошибкой нехватки памяти (OOM), необходимо проверить журналы событий за определенный период времени.
3. Измерьте производительность всего VPS, а не только буферного пула.
free -h
ps -eo pid,comm,rss --sort=-rss
vmstat 1
Собирайте данные наблюдений во время обычной работы системы и задач, связанных со сбоями. В этом случае сосредоточьтесь на доступной памяти, а не только на столбце «свободная память». В руководствеfree Debian по свободной памяти доступная память описывается как оценка того, что можно использовать без подкачки. Значения RSS в списке процессов указаны в КиБ; их суммирование может привести к двойному учету общей памяти.
Подтверждено: MySQL выделяет память за пределами буферного пула InnoDB, включая память, связанную с соединениями и запросами. В справочнике по использованию памяти MySQL описаны эти компоненты. Формулу, основанную на настроенных буферах, следует рассматривать как предварительную оценку, а не как точную верхнюю границу.
Действие: Зарезервируйте ресурсы для ядра, веб-воркеров, мониторинга, резервного копирования и временной работы с базой данных. Распространенный совет выделять большую часть оперативной памяти для InnoDB неприменим без корректировки на общем VPS. Если PHP-воркеры или задача сборки потребляют доступный объем памяти, настройте или перенесите эту нагрузку вместо того, чтобы постоянно уменьшать размер MySQL.
Измерьте все конкурирующие процессы и нагрузку на память во время выполнения репрезентативной задачи.
4. Добавляйте файл подкачки в качестве буфера, а не в качестве замещающей оперативной памяти.
Зависит от контекста: файл подкачки может временно компенсировать нагрузку на анонимную память, но постоянное использование файла подкачки может замедлить выполнение запросов. VPS на основе контейнеров может ограничивать использование файла подкачки, а служба MemorySwapMaxможет запретить его использование, даже если хост имеет доступ к файлу подкачки.
Если файл подкачки отсутствует, провайдер это разрешает, и у вас достаточно свободного места на диске, следующая команда создаст файл подкачки размером 1 ГиБ на подходящей локальной файловой системе, например, ext4. Не запускайте её, если /swapfile уже существует. Сначала ознакомьтесь с требованиями, специфичными для файловой системы; Btrfs требует подходящей настройки файла подкачки без копирования при записи.
Только после успешной активации добавьте эту запись один раз в /etc/fstab:
/swapfile none swap sw 0 0
В руководстве Debian swapon описаны ограничения на использование файла подкачки. Если активация запрещена средой VPS, обратитесь к провайдеру за информацией о поддерживаемом файле подкачки или увеличьте объем памяти, выделенной в тарифном плане; не сохраняйте неудачную настройку.
Не копируйте настройку «установить swappiness равным нулю» в качестве защиты от нехватки памяти (OOM). В документации ядра виртуальная машина определяет swappiness как параметр, определяющий затраты на высвобождение памяти. Он не создает память и не устанавливает ограничение на использование памяти базы данных. Оставьте его без изменений на начальном этапе и измерьте поведение.
Перед тем как принимать решение о целесообразности использования файла подкачки, проверьте состояние файла подкачки и файловой системы.
5. Установите скромный базовый уровень базы данных.
Для наглядности рассмотрим VPS с объемом памяти 1 ГиБ, небольшой нагрузкой на InnoDB и несколькими рабочими процессами приложения. Приведенные ниже значения являются примерными для оценки, а не доказательством того, что данная нагрузка подходит:
Укажите параметры сервера в конфигурационном файле, который фактически входит в состав вашей установки. Пакет Oracle MySQL может включать в себя /etc/mysql/mysql.conf.d/; Debian MariaDB обычно использует /etc/mysql/mariadb.conf.d/. Проверьте существующие директивы включения и сохраните резервную копию. Документация MySQL по файлам параметров объясняет группы параметров сервера и обработку файлов.
Ограничение в 128 МиБ ограничивает размер кэша, а не общий объем памяти базы данных. Ограничение в 20 соединений может быть слишком строгим, если несколько экземпляров приложения используют свой пул. И наоборот, 20 одновременных ресурсоемких запросов могут перегрузить VPS. Держите общий объем пулов приложений ниже установленного сервером лимита, оставляя место для административного доступа, и отслеживайте отклоненные соединения.
Указанные выше общие переменные также присутствуют в справочнике системных переменных MariaDB , однако поведение временных таблиц различается в зависимости от продукта и версии. Избегайте увеличения глобальных буферов сортировки, объединения или чтения в качестве общего решения для повышения производительности на машинах с ограниченными ресурсами.
Эти настройки для небольшого сервера являются отправной точкой для оценки, а не ограничением общего объема памяти базы данных.
6. Совместное управление временными таблицами и параллельным доступом.
Распространенное заблуждение: установка параметра tmp_table_size=16Mограничивает объем памяти для всех запросов 16 МиБами. Это не так. Несколько сессий, несколько временных таблиц и другие выделения памяти для выполнения могут сосуществовать.
Для Oracle MySQL 8.4 дополнительной показательной отправной точкой может служить следующее:
temptable_max_ram=64M
temptable_max_mmap=0
Добавляйте эти параметры в существующую [mysqld]группу только после подтверждения поддержки продукта. Они регулируют пороговое значение общей оперативной памяти механизма TempTable и использование временных файлов, отображаемых в память. Они не ограничивают весь процесс mysqld или все локальные выделения памяти для потоков. Более низкие пороговые значения могут перенести больше работы на диск.
В документации MySQL 8.4 описаны эти ограничения для временных таблиц . В MySQL 8.0 поведение зависит от версии: ограничение temptable_max_mmapпоявилось в версии 8.0.23, а tmp_table_sizeв версии 8.0.28 стало отдельным ограничением для TempTable. Перед применением тех же настроек обратитесь к справочнику MySQL 8.0 . Не копируйте эти специфические для Oracle параметры в MariaDB.
Действие: Ограничьте количество дублирующихся запросов к отчетам, фоновых процессов и заданий резервного копирования или импорта. Проверяйте планы запросов и индексы, когда определенная операция вызывает перегрузку. Перемещение избыточных задач в зону пиковой нагрузки может помочь; если обычная одновременная нагрузка по-прежнему превышает возможности, следующим шагом будет увеличение объема оперативной памяти или разделение базы данных.
Применяйте эти настройки TempTable только к поддерживаемой версии Oracle MySQL, следуя инструкциям для конкретной версии.
7. Проверьте изменения и перезапустите программу обдуманно.
Для версий Oracle MySQL, поддерживающих эту опцию, проверьте конфигурацию перед перезапуском:
sudo mysqld --validate-config
Используйте тот же путь к файлу настроек по умолчанию и соответствующие аргументы запуска, что и для службы, если она не использует обнаружение конфигурации по умолчанию. В справочнике по проверке MySQL отмечается, что проверка не инициализирует каждую подсистему. Ее прохождение не является проверкой производительности рабочей нагрузки. Не следует предполагать, что MariaDB поддерживает эту опцию Oracle.
Перезапустите службу в запланированный период, затем проверьте ее запуск и запросите фактические значения:
SHOW GLOBAL VARIABLES WHERE Variable_name IN
('innodb_buffer_pool_size','max_connections','tmp_table_size',
'max_heap_table_size','temptable_max_ram','temptable_max_mmap');
SHOW GLOBAL STATUS WHERE Variable_name IN
('Threads_connected','Threads_running','Max_used_connections');
Неподдерживаемые переменные не будут отображаться в результатах. Проверьте правильность настроек, а не предполагайте, что новый файл имеет приоритет. Если запуск не удается из-за внесенных вами изменений, восстановите сохраненную конфигурацию или удалите только новое переопределение, а затем перезапустите систему. Сохраните подробности ошибки для диагностики.
Перед плановым перезапуском проверьте поддерживаемую конфигурацию Oracle MySQL; успешный запуск не означает наличие достаточного объема оперативной памяти.
8. Определите понятие успеха при репрезентативной нагрузке.
free -h
vmstat 1
cat /proc/pressure/memory
Сравните один и тот же трафик и запланированные задания до и после изменений. Отслеживайте новые события нехватки памяти (OOM), перезапуски баз данных, доступную память, отказы в соединении, активность подкачки и задержку запросов. В некоторых случаях vmstatследует исследовать устойчивые случаи включения/выключения подкачки. В руководстве по vmstat для Debian поясняется, что первый отчет усредняет активность с момента загрузки; для получения текущих показателей используйте последующие отчеты.
В справочнике ядра PSI описаны измерения задержки из-за перегрузки. Увеличение времени задержки памяти может выявить проблемы еще до следующего завершения процесса. Десять минут простоя системы не гарантируют безопасность следующего резервного копирования или всплеска трафика.
Отслеживайте активность и давление в памяти, файле подкачки, а также задержку запросов после внесения изменений.
Заблуждения, которые могут усугубить проблему.
Заявить
Что делать вместо этого?
Защитите mysqld от ошибки нехватки памяти (OOM), и проблема дефицита исчезнет.
Снизьте спрос или увеличьте мощности; изменение критериев отбора жертв может перенести сбой на другой процесс.
Установите небольшой параметр MemoryMax, чтобы MySQL поместился в память.
Сначала проверьте существующие ограничения и настройте рабочую нагрузку; жесткое ограничение может привести к ошибке нехватки памяти (OOM) внутри сервиса.
После автоматического перезапуска база данных стабилизируется.
Для восстановления используйте режим перезапуска, одновременно измеряя, сохраняется ли исходное давление.
Отключите настройки надежности, чтобы сэкономить оперативную память.
Требования к восстановлению и долговечности следует разделять с оптимизацией памяти.
В руководстве по управлению ресурсами systemd в Debian поясняется, что это MemoryMaxможет вызвать обработку ошибок нехватки памяти внутри модуля. Не следует слепо снимать ограничения поставщика или контейнера. Приложению необходим бюджет памяти, соответствующий этим ограничениям, или же для изменения емкости необходимо авторизованное изменение ограничений.
Не существует проверенного минимального размера VPS, гарантирующего работоспособность данной конкретной нагрузки. Если для обеспечения достаточной пропускной способности требуется постоянный обмен данными, если запланированные задания по-прежнему приводят к сбоям, или если меньший размер кэша делает задержку неприемлемой, перестаньте рассматривать конфигурацию как замену мощности. Увеличьте объем оперативной памяти, уменьшите параллелизм приложений или перенесите базу данных на отдельный сервис.