Сбой MariaDB с перерывами

Вопрос или проблема

У меня есть база данных MariaDB 10.2, где служба MariaDB неожиданно останавливается.

Я регулярно записываю использование оперативной памяти тремя основными процессами каждую минуту с помощью cronjob, чтобы определить, потребляет ли MariaDB чрезмерную память перед сбоями. Я склонен считать, что чрезмерное использование оперативной памяти не является основной причиной проблемы.

Когда служба сбоивает, я просматриваю журналы MariaDB с помощью следующих команд:

  • sudo cat /var/log/mariadb/mariadb.log – не возвращает результатов.
  • sudo systemctl status mariadb -l – выводит
    следующий результат:

Результат команды

Информация о ОС:

[someuser ~]$ uname -a
Linux ec2.internal .amzn2.x86_64 #1 SMP Thu Dec 8 01:29:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
[someuser ~]$ hostnamectl
   Static hostname: <ip>.ec2.internal
         Icon name: computer-vm
           Chassis: vm
        Machine ID: -
           Boot ID: -
    Virtualization: xen
  Operating System: Amazon Linux 2
       CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2
            Kernel: Linux <ip>.amzn2.x86_64
      Architecture: x86-64

Я был бы признателен за вашу помощь в диагностике и решении этой проблемы со стабильностью сервера.


Ответы на комментарий от @NikitaKipriyanov:
Привет, @NikitaKipriyanov, спасибо за вопросы. Следуя вашему совету, я запустил dmesg -T | grep mysql и обнаружил следующее (вставляю только релевантные данные):

[Mon Sep 18 17:37:34 2023] [  26231]    27 26231    29965       52    61440        0             0 mysql-prepare-d
[Tue Sep 19 14:04:29 2023] [  26839]    27 26839   367222    19121   630784        0             0 mysqld
[Tue Sep 19 14:04:31 2023] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=mysqld,pid=26839,uid=27
[Tue Sep 19 14:04:31 2023] Out of memory: Killed process 26839 (mysqld) total-vm:1468888kB, anon-rss:76484kB, file-rss:0kB, shmem-rss:0kB, UID:27 pgtables:616kB oom_score_adj:0
[Tue Sep 19 14:05:41 2023] [  29800]    27 29800     2326       26    61440        0             0 mysql-check-soc
[Tue Sep 19 14:05:52 2023] [  29800]    27 29800     2326       26    61440        0             0 mysql-check-soc

Дата и время соответствуют времени, когда служба сбоила.

Когда я запускаю dmesg -T, я вижу, что веб-сервер httpd часто сбоивает:

[Tue Sep 19 14:13:00 2023] [  30195]     0 30195   143596     2011   839680        0             0 httpd
[Tue Sep 19 14:13:00 2023] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=httpd,pid=28937,uid=48
[Tue Sep 19 14:13:00 2023] Out of memory: Killed process 28937 (httpd) total-vm:628120kB, anon-rss:11732kB, file-rss:0kB, shmem-rss:96kB, UID:48 pgtables:860kB oom_score_adj:0
[Tue Sep 19 14:13:17 2023] systemd-journald[30073]: Received SIGTERM from PID 1 (systemd).

Однако веб-сервер никогда не сбоивает и не прерывает свою работу. Проблема касается только службы MariaDB. Проблема периодическая и возникает каждые три-пять дней.

Журналы из /var/log/mariadb:

[root@ip mariadb]# ls -la
total 28
drwxr-x---  2 mysql mysql  146 Sep 20 03:48 .
drwxr-xr-x 10 root  root  4096 Sep 26 03:23 ..
-rw-------  1 mysql mysql    0 Sep 20 03:48 mariadb.log
-rw-------  1 mysql mysql 8714 Sep  7 12:40 mariadb.log-20230908
-rw-------  1 mysql mysql 2005 Sep 15 18:02 mariadb.log-20230916.gz
-rw-------  1 mysql mysql 1917 Sep 18 17:39 mariadb.log-20230919.gz
-rw-------  1 mysql mysql 1909 Sep 19 14:16 mariadb.log-20230920.gz
[root@ip mariadb]# pwd
/var/log/mariadb

Вывод sysctl -A | grep panic:

[root@ip log]# sysctl -A | grep panic
fs.xfs.panic_mask = 0
kernel.hardlockup_panic = 0
kernel.hung_task_panic = 0
kernel.panic = 30
kernel.panic_on_io_nmi = 0
kernel.panic_on_oops = 0
kernel.panic_on_rcu_stall = 0
kernel.panic_on_unrecovered_nmi = 0
kernel.panic_on_warn = 0
kernel.panic_print = 0
kernel.softlockup_panic = 0
kernel.unknown_nmi_panic = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
vm.panic_on_oom = 0

Ответы на вопросы Уилсона Хаука:

Относительно оперативной памяти:

[ec2-user@ip ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           964M        333M        197M        724K        433M        451M
Swap:            0B          0B          0B

SELECT COUNT(*) FROM information_schema.tables; – 238

SHOW GLOBAL STATUS; – Возвращает слишком много строк, чтобы вставить их сюда, какие значения вас интересуют?

SHOW GLOBAL VARIABLES;– То же самое

Как мне отправить вывод всех запрошенных запросов?

Я получаю приз за правильное предположение?

Здесь и в других местах в интернете много ответов о том, как решить эту проблему. К сожалению, многие из них ошибочны. Если они упоминают oom_adj или oom_score_adj, то это НЕ способ решить вашу проблему.

Есть 2 вещи, которые вам нужно сделать.

Первое – это посмотреть на вашу конфигурацию веб-сервера и базы данных (и, предположительно, здесь тоже есть уровень приложения), чтобы убедиться, что они не пытаются использовать больше оперативной памяти, чем у вас доступно. Поскольку вы не рассказали нам об сервере приложений или веб-сервере, я не могу реально посоветовать (но вот подсказка для Apache pre-fork, опционально с PHP). Что касается Mariadb – скачайте копию mysqltuner.pl и запустите ее на вашей установке.

Это должно предотвратить нехватку памяти в большинстве случаев, но вы также должны уменьшить количество нестабильной памяти, которую ядро будет выдавать:

sysctl vm.overcommit_memory=2
sysctl vm.overcommit_ratio=20

…и попробуйте более низкие значения для соотношения, если вы все еще видите OOM процессор.

sysctl vm.overcommit_memory=2

sysctl vm.overcommit_ratio=20

опасно, так как возникают ошибки “cannot allocate memory” при каждой bash-команде, и ничего не работает, включая postfix и apache, пока я не перезагрузил свой Linux EC2 экземпляр в консоли aws.amazon.com, и первоначальные безопасные значения 0 и 50 соответственно были сброшены, чтобы я мог войти через ssh, и все службы были перезапущены нормально.

Если mysqld сбойнет из-за нехватки памяти oom-kill, просто перезапустите его – все то же самое:

service mysqld start

Не меняйте значения vm.overcommit_memory или vm.overcommit_ratio, чтобы не рисковать потерей всех данных на сервере, если они не были сохранены.

Ответ или решение

МарияДБ периодически падает: решения проблемы

Вы столкнулись с проблемой, когда ваш MariaDB 10.2 неожиданно прекращает свою работу. Чтобы решить эту проблему эффективно и предотвратить появления подобных сбоев в будущем, давайте рассмотрим все возможные варианты и шаги, которые вам потребуется предпринять.

Анализ проблемы

Основываясь на вашем описании, кажется, что причиной проблемы является нехватка памяти (Out of Memory, OOM), что подтверждается журналами dmesg. Это может вызвать принудительное завершение процесса mysqld. Хотя вы отслеживаете использование памяти, это не всегда гарантирует, что служба MariaDB не потребляет чрезмерное количество ресурса в какой-то момент времени.

Шаги для решения проблемы

  1. Оптимизация конфигурации MariaDB:

    • Используйте скрипт mysqltuner.pl для анализа и тюнинга конфигурации MariaDB.
    • Проверьте параметры, влияющие на использование памяти, такие как innodb_buffer_pool_size, query_cache_size и tmp_table_size. Они должны быть настроены на разумные значения относительно доступной памяти.
  2. Настройки системы:

    • Добавьте Swap пространство. Это поможет в случаях временной нехватки оперативной памяти.
    • Используйте команду sysctl для настройки параметров переизбытка памяти (но будьте осторожны с изменениями, как предупреждается выше).
    sysctl vm.overcommit_memory=0
    sysctl vm.overcommit_ratio=50

    Это обеспечит баланс между производительностью и стабильностью.

  3. Оптимизация веб-сервера:

    • Убедитесь, что конфигурация веб-сервера настроена эффективно с учетом доступной памяти. Если используется Apache с префорком, отрегулируйте параметры MaxRequestWorkers и ServerLimit.
  4. Мониторинг и Предупреждение:

    • Настройте мониторинг с уведомлениями для отслеживания использования памяти, чтобы заранее предпринимать действия до использования всех ресурсов.
    • Рассмотрите возможность использования инструментов, таких как Zabbix или Prometheus, для автоматизации мониторинга.
  5. Логирование и анализ:

    • Убедитесь, что логи MariaDB правильно настраиваются и записываются. Если текущий лог пуст, проверьте настройки логирования.
    • Регулярно анализируйте логи системы (например, /var/log/syslog или /var/log/messages).

Заключение

Проблема с OOM для MariaDB обусловлена корректировкой конфигурации как на уровне базы данных, так и на уровне операционной системы. Проверьте и настройте использование ресурсов, чтобы избежать выхода системы из строя из-за нехватки памяти. Весь процесс требует регулярного мониторинга и корректировки параметров для обеспечения стабильной работы.

Оцените материал
Добавить комментарий

Капча загружается...