Рейтинг:0

MySQL «Не удается выделить память для пула буферов» при использовании памяти 73%?

флаг in

Я размещаю веб-сайт WordPress на дроплете DigitalOcean (1 ГБ ОЗУ). База данных MySQL веб-сайта время от времени дает сбой, в результате чего на веб-сайте отображается сообщение «Ошибка установления соединения с базой данных». Использование памяти упало примерно в 2:40, что указывает на то, что именно в этот момент произошел сбой базы данных. Я проверил файл журнала MySQL за этот день, и самая ранняя запись была сделана в 10:47. Вот начало лог-файла:

2021-12-06T10:47:14.800977Z 0 [Предупреждение] TIMESTAMP с неявным значением DEFAULT устарело. Пожалуйста, используйте --explicit_defaults_for_timest$
2021-12-06T10:47:14.806192Z 0 [Примечание] /usr/sbin/mysqld (mysqld 5.7.36-0ubuntu0.18.04.1), начиная с процесса 2810 ...
2021-12-06T10:47:14.819674Z 0 [Примечание] InnoDB: доступна поддержка PUNCH HOLE
2021-12-06T10:47:14.819711Z 0 [Примечание] InnoDB: мьютексы и rw_locks используют атомарные встроенные функции GCC
2021-12-06T10:47:14.819716Z 0 [Примечание] InnoDB: использует мьютексы событий
2021-12-06T10:47:14.819720Z 0 [Примечание] InnoDB: встроенная функция GCC __atomic_thread_fence() используется для барьера памяти
2021-12-06T10:47:14.819723Z 0 [Примечание] InnoDB: сжатые таблицы используют zlib 1.2.11
2021-12-06T10:47:14.819727Z 0 [Примечание] InnoDB: использование родного AIO для Linux
2021-12-06T10:47:14.820551Z 0 [Примечание] InnoDB: Количество пулов: 1
2021-12-06T10:47:14.823342Z 0 [Примечание] InnoDB: использование инструкций CPU crc32
2021-12-06T10:47:14.825847Z 0 [Примечание] InnoDB: Инициализация пула буферов, общий размер = 128 МБ, количество экземпляров = 1, размер фрагмента = 128 МБ
2021-12-06T10:47:14.826246Z 0 [ОШИБКА] InnoDB: сбой mmap (137428992 байт); ошибка 12
2021-12-06T10:47:14.826258Z 0 [ОШИБКА] InnoDB: не удается выделить память для пула буферов
2021-12-06T10:47:14.826262Z 0 [ОШИБКА] InnoDB: инициализация плагина прервана из-за ошибки Общая ошибка
2021-12-06T10:47:14.826270Z 0 [ОШИБКА] Функция инициализации плагина InnoDB вернула ошибку.
2021-12-06T10:47:14.826274Z 0 [ОШИБКА] Ошибка регистрации плагина InnoDB в качестве STORAGE ENGINE.
2021-12-06T10:47:14.826278Z 0 [ОШИБКА] Не удалось инициализировать встроенные плагины.
2021-12-06T10:47:14.826282Z 0 [ОШИБКА] Прерывание

2021-12-06T10:47:14.832237Z 0 [Примечание] Конец бинлога
2021-12-06T10:47:14.832297Z 0 [Примечание] Выключение плагина CSV
2021-12-06T10:47:14.832572Z 0 [Примечание] /usr/sbin/mysqld: завершение работы

Судя по файлу журнала, MySQL не хватает памяти. Однако использование памяти для дроплета оставалось стабильным на уровне 73 % до тех пор, пока не произошел сбой базы данных около 2:40 утра, когда оно упало до 32 %. Кажется, у него много доступной памяти, так почему же он падает?

РЕДАКТИРОВАТЬ В соответствии с запросом, вот содержимое моих конфигурационных файлов MySQL:

/etc/mysql/conf.d/mysql.cnf

[mysql]

/etc/mysql/conf.d/mysqldump.cnf

[mysqldump]
быстрый
кавычки
max_allowed_packet = 16M

/etc/mysql/mysql.conf.d/mysqld.cnf

#
# Файл конфигурации сервера базы данных MySQL.
#
# Вы можете скопировать это в один из:
# - "/etc/mysql/my.cnf" для установки глобальных параметров,
# - "~/.my.cnf" для установки пользовательских параметров.
#
# Можно использовать все длинные опции, поддерживаемые программой.
# Запустите программу с --help, чтобы получить список доступных опций и с помощью
# --print-defaults, чтобы увидеть, что он на самом деле понимает и использует.
#
# Пояснения см.
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# Это будет передано всем клиентам mysql
# Сообщалось, что пароли должны заключаться в галочки/кавычки
# особенно если они содержат символы "#"...
# Не забудьте отредактировать файл /etc/mysql/debian.cnf при изменении местоположения сокета.

# Здесь записи для некоторых конкретных программ
# Следующие значения предполагают, что у вас есть как минимум 32 МБ оперативной памяти

[mysqld_safe]
сокет = /var/run/mysqld/mysqld.sock
хорошо = 0

[mysqld]
#
# * Основные настройки
#
пользователь = mysql
pid-файл = /var/run/mysqld/mysqld.pid
сокет = /var/run/mysqld/mysqld.sock
порт = 3306
базисир = /usr
каталог данных = /var/lib/mysql
временная_папка = /tmp
lc-сообщения-каталог = /usr/доля/mysql
пропустить внешнюю блокировку
#
# Вместо пропуска сети теперь по умолчанию прослушивается только
# localhost, который более совместим и не менее безопасен.
адрес привязки = 127.0.0.1
#
# * Тонкая настройка
#
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192 КБ
thread_cache_size = 8
# Это заменяет сценарий запуска и проверяет таблицы MyISAM, если это необходимо
# когда к ним прикасаются в первый раз
myisam-recover-options = РЕЗЕРВНАЯ КОПИЯ
#max_connections = 100
#table_open_cache = 64
#thread_concurrency = 10
#
# * Конфигурация кэша запросов
#
query_cache_limit = 1M
query_cache_size = 16M
#
# * Ведение журнала и репликация
#
# Обе локации чередуются с помощью cronjob.
# Имейте в виду, что этот тип журнала снижает производительность.
# Начиная с версии 5.1 вы можете включить журнал во время выполнения!
#general_log_file = /var/log/mysql/mysql.log
#общий_журнал = 1
#
# Журнал ошибок - должно быть очень мало записей.
#
log_error = /var/log/mysql/error.log
#
# Здесь вы можете увидеть запросы с особенно большой продолжительностью
#slow_query_log = 1
#slow_query_log_file = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes
#
# Следующее можно использовать для простого воспроизведения журналов резервного копирования или для репликации.
# примечание: если вы настраиваете ведомое устройство репликации, см. README.Debian о
# другие настройки, которые вам, возможно, придется изменить.
#идентификатор_сервера = 1
#log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * ИнноБД
#
# InnoDB включен по умолчанию с файлом данных размером 10 МБ в /var/lib/mysql/.
# Прочтите руководство, чтобы узнать больше о параметрах, связанных с InnoDB. Здесь очень много!
#
# * Функции безопасности
#
# Прочтите также руководство, если вам нужен chroot!
# chroot = /var/lib/mysql/
#
# Для создания SSL-сертификатов я рекомендую OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

/etc/mysql/mysql.conf.d/mysqld_safe_syslog.cnf

[mysqld_safe]
системный журнал
dominix avatar
флаг gf
у вас должны быть некоторые настройки переменных в /etc/my.cnf.d/server.cnf, связанные с памятью и/или innodb, которые не соответствуют размеру вашей базы данных или памяти. Можете ли вы показать нам эти переменные и размер вашей базы данных?
bumbleshoot avatar
флаг in
@dominix Нет каталога или файла /etc/my.cnf.d/server.cnf. Самое близкое, что я могу найти, это /etc/mysql/mysql.conf.d/mysqld.cnf. На сервере работает Ubuntu 18.04, если это поможет.
флаг us
Можете ли вы добавить к вопросу более длинный фрагмент файла журнала? Этот файл журнала выглядит так, как будто сервер MySQL только запускается, что не соответствует вашему описанию.
bumbleshoot avatar
флаг in
@dominix Размер базы данных составляет 43,5 МБ.
bumbleshoot avatar
флаг in
@TeroKilkanen Согласно истории использования памяти, похоже, что база данных дала сбой около 2:40 ночи. Однако в файле журнала за этот день нет записей до 10:47. Это самое близкое к моменту сбоя базы данных, которое я смог подобрать. Я расширю свой вопрос, включив в него все записи с начала файла журнала.
флаг us
Вы проверяли повернутые файлы журналов?
bumbleshoot avatar
флаг in
@TeroKilkanen Я обновил формулировку в своем вопросе, надеюсь, теперь она понятнее.
bumbleshoot avatar
флаг in
@TeroKilkanen Вы имеете в виду сжатые файлы журналов в /var/log/mysql? Да, я их распаковал и прочитал.
флаг us
Есть ли в `/var/log/kern.log` что-нибудь во время сбоя?
bumbleshoot avatar
флаг in
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/132261/discussion-between-bumbleshoot-and-tero-kilkanen).
Рейтинг:2
флаг us

После просмотра журнала ядра в чате причиной сбоя MySQL была нехватка памяти.

6 декабря 02:47:13 ядро: [341799.228400] Недостаточно памяти: убить процесс 23566 (mysqld), набрать 197 баллов или пожертвовать дочерним элементом
6 декабря 02:47:13 ядро: [341799.229866] Убитый процесс 23566 (mysqld) total-vm: 1168576kB, anon-rss: 198536kB, file-rss: 0kB, shmem-rss: 0kB

В это время было много активных процессов Apache2. Это означает, что увеличение трафика приводит к увеличению потребления памяти. В результате ядро ​​решило убить MySQL, чтобы освободить память.

можно бежать mysqltuner для анализа конфигурации MySQL. Он дает рекомендации, которые могут помочь уменьшить потребление памяти MySQL.

Однако увеличение трафика может по-прежнему вызывать те же проблемы. Поэтому более рациональным решением является увеличение памяти, доступной для дроплета.

bumbleshoot avatar
флаг in
В очередной раз благодарим за помощь!
bumbleshoot avatar
флаг in
Я только что проверил Google Analytics для этого веб-сайта, и 6 декабря был только один просмотр страницы (веб-сайт отключился 6 декабря с 2:40 до 2:50). Это не похоже на то, что вы видели в журнале ядра. Есть идеи, почему?
флаг us
Google Analytics показывает трафик только из веб-браузеров, которые выполняют JS-код Google Analytics. Кроме того, в Интернете много бот-трафика. Вы можете увидеть этот трафик в access.log вашего веб-сервера.
bumbleshoot avatar
флаг in
Хорошо, имеет смысл. Должно быть, было много бот-трафика одновременно, чтобы перегрузить сервер, который постоянно использовал только 73% памяти? Как вы думаете, это была DDoS-атака? Есть ли способ заблокировать этот бот-трафик в будущем?
Рейтинг:1
флаг ua

1 ГБ оперативной памяти очень крошечный В эти дни. Сервер мощь выжить, если вы установите innodb_buffer_pool_size = 50M. Рекомендации по некоторому проценту ОЗУ не применимы к такому маленькому размеру ОЗУ.

Есть риск, что 50M будет слишком мало. Пожалуйста, укажите ваш мой.cnf поэтому мы можем искать другие параметры для сжатия. Некоторые вероятные:

макс_подключения = 10
key_buffer_size = 10M
temp_table_size = 10M
max_heap_table_size = 10M
table_open_cache = 100

query_cache_size = 0
max_allowed_packet = 8M
key_buffer_size = 10M
макс_подключения = 10

Да, MySQL/MariaDB будет работать на крошечной машине, но необходима настройка.

Если Apache работает на том же сервере, уменьшите его MaxRequestWorkers до 10. И проверьте конфигурацию всего, что работает на том же [виртуальном] сервере.

bumbleshoot avatar
флаг in
Спасибо за ответ.`my.cnf` содержит только `!includedir /etc/mysql/conf.d/` и `!includedir /etc/mysql/mysql.conf.d/`. `/etc/mysql/conf.d/` содержит `mysql.cnf` и `mysqldump.cnf`. `/etc/mysql/mysql.conf.d/` содержит `mysqld.cnf` и `mysqld_safe_syslog.cnf`. Вам нужно увидеть содержимое любого из этих файлов?
флаг ua
@bumbleshoot - Да, пожалуйста, покажи им.
bumbleshoot avatar
флаг in
Хорошо, я добавил их в свой первоначальный вопрос.
флаг ua
@bumbleshoot - я добавил еще несколько настроек для изменения.
bumbleshoot avatar
флаг in
Большое спасибо! Попробую эти настройки.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.