Вопрос или проблема
Недавно я мигрировал старый сервер с MySQL на новый VPS с MariaDB 5.5. У меня на сервере не так много запущено (только несколько PHP сайтов), и свободной памяти, кажется, достаточно, но база данных продолжает падать — иногда каждые несколько дней, иногда через несколько часов.
Я получаю следующие ошибки в логах:
131231 1:43:04 [ERROR] mysqld: Недостаточно памяти (Требуется 128917504 байт)
131231 1:43:04 [ERROR] mysqld: Недостаточно памяти (Требуется 96681984 байт)
131231 1:43:04 [ERROR] mysqld: Недостаточно памяти (Требуется 72499200 байт)
131231 1:43:04 [ERROR] mysqld: Недостаточно памяти (Требуется 54362112 байт)
131231 1:43:04 InnoDB: Куча памяти InnoDB отключена
131231 1:43:04 InnoDB: Мьютексы и rw_locks используют встроенные атомарные функции GCC
131231 1:43:04 InnoDB: Сжатые таблицы используют zlib 1.2.3.4
131231 1:43:04 InnoDB: Используется нативный AIO Linux
131231 1:43:04 InnoDB: Инициализация пула буферов, размер = 128.0M
InnoDB: mmap(137756672 байт) завершилась неудачей; errno 12
131231 1:43:04 InnoDB: Завершена инициализация пула буферов
131231 1:43:04 InnoDB: Фатальная ошибка: невозможно выделить память для пула буферов
131231 1:43:04 [ERROR] Функция инициализации плагина 'InnoDB' вернула ошибку.
131231 1:43:04 [ERROR] Регистрация плагина 'InnoDB' как ХРАНИЛИЩА ДАННЫХ завершилась неудачей.
131231 1:43:04 [Note] Плагин 'FEEDBACK' отключен.
131231 1:43:04 [ERROR] Неизвестный/неподдерживаемый движок хранения: InnoDB
131231 1:43:04 [ERROR] Прерывание
131231 1:43:04 [Note] /usr/sbin/mysqld: Отключение завершено
Я играл с настройками my.cnf для InnoDB Heap, что, похоже, не помогает. Вот соответствующая часть:
innodb_buffer_pool_size = 128M
innodb_log_buffer_size = 8M
innodb_file_per_table = 1
innodb_open_files = 400
innodb_io_capacity = 400
innodb_flush_method = O_DIRECT
Мне кажется, у меня “достаточно” свободной ОЗУ, и у меня также есть немного свопа:
root@phoenix:~# free -m
total used free shared buffers cached
Mem: 994 923 71 0 19 417
-/+ buffers/cache: 486 508
Swap: 1023 131 892
Как я могу решить / устранить эту проблему? Я искал подсказки в интернете, но ничто не помогло.
Попробуйте это в секции [mysqld]
вашего конфигурационного файла:
performance_schema = off
https://mariadb.com/resources/blog/starting-mysql-on-low-memory-virtual-machines/
Ответ или решение
Если MariaDB (или MySQL) на вашем VPS часто аварийно завершает работу, несмотря на наличие свободной памяти, существует несколько возможных причин и решений, которые стоит рассмотреть. Рассмотрим их подробно, исходя из описания вашей проблемы.
Основные проблемы
На основании предоставленных вами логов видно, что сервер базы данных не может выделить необходимую память, что приводит к сбоям. Сообщения об ошибках о нехватке памяти, такие как:
[ERROR] mysqld: Out of memory (Needed 128917504 bytes)
...
InnoDB: Fatal error: cannot allocate memory for the buffer pool
указывают на то, что InnoDB не может выделить память для буферного пула. Эта проблема может быть вызвана несколькими факторами:
-
Неправильная конфигурация my.cnf: Параметры создания буфера и использования памяти напрямую влияют на производительность. Убедитесь, что они адаптированы под вашу среду.
-
Общее использование памяти: Несмотря на отчёт, который показывает остающуюся память, стоит учесть, что системы могут зарезервировать часть RAM для своих нужд, что ограничивает доступную память для MariaDB.
-
Своп: Если физическая память заканчивается, может использоваться своп, что значительно замедляет работу сервера. Следует проверить, достаточно ли свопа, чтобы уверенно управлять пиковыми нагрузками.
Рекомендации по конфигурации
Чтобы устранить проблему, попробуйте адаптировать my.cnf следующим образом:
-
Отключите Performance Schema:
Это может существенно снизить использование памяти, так как этот компонент работает с огромным набором данных о производительности.performance_schema = off
-
Увеличьте размер буферного пула:
Увеличиваяinnodb_buffer_pool_size
, вы позволяете InnoDB выделить больше памяти для кэширования данных, что может помочь снизить нагрузку на память.innodb_buffer_pool_size = 256M
Если вы все равно сталкиваетесь с ошибками, попробуйте уменьшить значение, например до 128M и протестировать, как это повлияет на устойчивость.
-
Измените настройки для уменьшения использования памяти:
Например, уменьшитеinnodb_log_buffer_size
, если ваши транзакции не используют его полностью.innodb_log_buffer_size = 4M
Освобождение ресурсов
-
Проверка запущенных процессов: Убедитесь, что нет других процессов, использующих значительные ресурсы, которые могут мешать работе MariaDB. Необходимо проверить конфигурацию хостинга или VPS на предмет ограничений по ресурсам.
-
Мониторинг производительности: Рекомендуется использовать инструменты мониторинга, такие как
htop
илиtop
, для анализа использования памяти в реальном времени. -
Оптимизация PHP-инсталляций: Убедитесь, что ваши PHP-приложения хорошо оптимизированы и не создают чрезмерную нагрузку на базу данных.
Заключение
Проблема с аварийным завершением работы MariaDB может быть обусловлена недостатком выделенной памяти или высокой нагрузкой на сервер. Следуя приведённым выше рекомендациям по конфигурации и оптимизации, вы сможете уменьшить количество сбоев и улучшить общую производительность сервера. Помните, что важно тестировать изменения поэтапно, отслеживая их влияние на работу базы данных.
Если указанные шаги не дают результата, возможно, стоит рассмотреть увеличение объёма оперативной памяти на VPS или переход на более новый релиз MariaDB, который может предложить улучшения производительности. Вы можете также обратиться за помощью на форумы сообщества или профессиональные службы поддержки, предоставляющие экспертизу в вопросах администрирования баз данных.