Вопрос или проблема
У меня есть база данных 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 не потребляет чрезмерное количество ресурса в какой-то момент времени.
Шаги для решения проблемы
-
Оптимизация конфигурации MariaDB:
- Используйте скрипт mysqltuner.pl для анализа и тюнинга конфигурации MariaDB.
- Проверьте параметры, влияющие на использование памяти, такие как
innodb_buffer_pool_size
,query_cache_size
иtmp_table_size
. Они должны быть настроены на разумные значения относительно доступной памяти.
-
Настройки системы:
- Добавьте Swap пространство. Это поможет в случаях временной нехватки оперативной памяти.
- Используйте команду
sysctl
для настройки параметров переизбытка памяти (но будьте осторожны с изменениями, как предупреждается выше).
sysctl vm.overcommit_memory=0 sysctl vm.overcommit_ratio=50
Это обеспечит баланс между производительностью и стабильностью.
-
Оптимизация веб-сервера:
- Убедитесь, что конфигурация веб-сервера настроена эффективно с учетом доступной памяти. Если используется Apache с префорком, отрегулируйте параметры
MaxRequestWorkers
иServerLimit
.
- Убедитесь, что конфигурация веб-сервера настроена эффективно с учетом доступной памяти. Если используется Apache с префорком, отрегулируйте параметры
-
Мониторинг и Предупреждение:
- Настройте мониторинг с уведомлениями для отслеживания использования памяти, чтобы заранее предпринимать действия до использования всех ресурсов.
- Рассмотрите возможность использования инструментов, таких как Zabbix или Prometheus, для автоматизации мониторинга.
-
Логирование и анализ:
- Убедитесь, что логи MariaDB правильно настраиваются и записываются. Если текущий лог пуст, проверьте настройки логирования.
- Регулярно анализируйте логи системы (например,
/var/log/syslog
или/var/log/messages
).
Заключение
Проблема с OOM для MariaDB обусловлена корректировкой конфигурации как на уровне базы данных, так и на уровне операционной системы. Проверьте и настройте использование ресурсов, чтобы избежать выхода системы из строя из-за нехватки памяти. Весь процесс требует регулярного мониторинга и корректировки параметров для обеспечения стабильной работы.