Включение дампов ядер
Включение в файле параметров
В MariaDB 10.4 и более поздних версиях дампы ядер включены по умолчанию в Windows, поэтому этот шаг можно пропустить в Windows в этих версиях. См. MDEV-18439 для получения дополнительной информации.
Для включения дампов ядер необходимо установить системную переменную core_file либо в командной строке, либо в соответствующей группе серверных параметров группа параметров в файле параметров. Например:
[mariadb] ... core_file
Вы можете проверить текущее значение, выполнив:
my_print_defaults --mysqld
В MariaDB 10.1.35, MariaDB 10.2.17, MariaDB 10.3.9 и более поздних версиях core_file также была преобразована в системную переменную. Ранее она была просто опцией. Ее значение можно проверить во время выполнения, выполнив следующее:
SHOW GLOBAL VARIABLES LIKE 'core_file';
Файлы ядра в Linux
Есть некоторые дополнительные детали, связанные с использованием файлов ядра в Linux.
Отключение ограничений размера файла ядра в Linux
На некоторых системах есть ограничение на размер файлов ядра, которые могут быть созданы. Вы можете проверить текущее системное ограничение, выполнив следующее:
ulimit -c
Вы можете проверить текущее ограничение для процесса mysqld конкретно, выполнив следующее:
sudo cat /proc/$(pidof mysqld)/limits | grep "core file"
Если вам нужно изменить ограничение размера ядра, используемый метод зависит от того, как вы запускаете mysqld. Подробности см. в разделах ниже.
В MariaDB 10.2.24, MariaDB 10.3.15 и MariaDB 10.4.5 и более поздних версиях лимиты ресурсов для процесса mysqld выводятся в файл журнала ошибок при сбое процесса mysqld. Таким образом, пользователи могут подтвердить, было ли процессу разрешено создавать дамп ядра. См. MDEV-15051 для получения дополнительной информации.
Запуск mysqld с помощью mysqld_safe
Если вы запускаете MariaDB, выполнив mysqld_safe, то настройка следующего параметра в группе параметров [mysqld_safe] в файле параметров должна позволить создавать файлы ядра неограниченного размера:
[mysqld_safe] ... core_file_size=unlimited
Вы можете проверить текущие значения, выполнив:
my_print_defaults mysqld_safe
См. mysqld_safe: Настройка размера файла ядра для получения дополнительной информации.
Примечание: Если вы используете mysqld_safe и запускаете mysqld как пользователя root, то на некоторых системах файл ядра не создается. Решением является запуск mysqld под другим пользователем.
Запуск mysqld вручную
Если вы запускаете mysqld вручную или в пользовательском скрипте, вы можете разрешить создание файлов ядра неограниченного размера, выполнив следующее в той же оболочке или скрипте, в которой выполняется mysqld:
ulimit -c unlimited
Запуск mysqld с помощью systemd
Если вы запускаете mysqld с помощью systemd, то вам может потребоваться настроить службу MariaDB для создания файлов ядра неограниченного размера. Например, вы можете выполнить следующее:
Используя sudo systemctl edit mariadb.service добавьте содержимое:
[Service] LimitCORE=infinity
См. systemd: Настройка размера файла ядра для получения дополнительной информации.
Изменение системного ограничения
Если вы хотите изменить системное ограничение, чтобы разрешить создание файлов ядра неограниченного размера для учетной записи пользователя mysql, вы можете сделать это, добавив следующие строки в файл в /etc/security/limits.d/. Например:
sudo tee /etc/security/limits.d/mariadb_core.conf <<EOF mysql soft core unlimited mysql hard core unlimited EOF
Для того чтобы это изменение вступило в силу, потребуется перезагрузка системы.
См. Настройка Linux для MariaDB: Настройка размера файла ядра для получения дополнительной информации.
Установка пути в Linux
Если вы используете Linux, то может быть полезно изменить несколько настроек, чтобы изменить местоположение файлов ядра и имя файла. Это делается путем настройки атрибутов kernel.core_pattern и kernel.core_uses_pid. Вы можете проверить текущие значения, выполнив следующее:
sysctl kernel.core_pattern sysctl kernel.core_uses_pid
Если вы используете mysql-test-run и хотите включить ядро в результаты теста, оптимальной настройкой, вероятно, будет следующее (хранить ядра в текущем каталоге в виде core.number-of-process-id)
sudo sysctl kernel.core_pattern=core.%p kernel.core_uses_pid=0
Если вы используете производственную систему, вероятно, вы хотите хранить файлы ядра в определенном каталоге, а не в каталоге данных. Временное изменение места хранения ядер может быть выполнено с помощью утилиты sysctl, но чаще всего это изменение производится в файловой системе /proc. См. следующий пример:
sudo mkdir /tmp/corefiles sudo chmod 777 /tmp/corefiles sudo echo /tmp/corefiles/core > /proc/sys/kernel/core_pattern sudo echo 1 > /proc/sys/kernel/core_uses_pid
Данные команды укажут системе помещать файлы ядра в /tmp/corefiles, а также добавить идентификатор процесса в имя файла.
Чтобы сделать эти изменения постоянными, вы можете добавить следующее в файл в /etc/sysctl.conf.d/. Например:
sudo tee /etc/sysctl.d/mariadb_core.conf <<EOF kernel.core_pattern=/tmp/corefiles/core kernel.core_uses_pid=1 EOF
В MariaDB 10.2.24, MariaDB 10.3.15 и MariaDB 10.4.5 и более поздних версиях значение kernel.core_pattern выводится в файл журнала ошибок при сбое процесса mysqld. Таким образом, пользователи могут определить, где процесс мог создать дамп ядра. См. MDEV-15051 для получения дополнительной информации.
В MariaDB 10.2.23, MariaDB 10.3.14 и MariaDB 10.4.4 и ранее, в файл журнала ошибок включается сообщение, указывающее, что файл ядра будет записан в datadir, когда процесс mysqld завершается с ошибкой, даже если это не соответствует действительности, потому что kernel.core_pattern фактически настроил процесс записи файла ядра в другой каталог.
Примечание: Убедитесь, что на диске достаточно свободного места в каталоге, указанном kernel.core_pattern.
Извлечение дампов ядер Linux с помощью systemd-coredump
Управление дампом ядра можно автоматизировать с помощью утилиты coredumpctl.
По умолчанию это включено в Red Hat Enterprise Linux 8 и CentOS 8, а также, возможно, в других современных дистрибутивах Linux. Это легко проверить, посмотрев на kernel.core_pattern setting. Если система выглядит так, что systemd-coredump включен:
# sysctl kernel.core_pattern kernel.core_pattern = |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e
В других дистрибутивах, таких как Ubuntu (по крайней мере, до версии 21.10), он не включен по умолчанию, но может быть настроен вручную.
Чтобы увидеть все последние дампы ядра на системе, можно просто выполнить
# coredumpctl list
Или вы можете проверить дампы ядра сервера MariaDB конкретно с помощью:
# coredumpctl list /usr/sbin/mariadbd
Если фактический файл ядра был сохранен, вы увидите present в столбце COREFILE вывода, и затем вы можете извлечь файл ядра с помощью:
# coredump dump -o mariadbd.core ...PID...
используя номер процесса из столбца PID или при желании получить последнюю запись, связанную с сервером MariaDB:
# coredump dump -o mariadb.core /usr/sbin/mariadbd
Начиная с версии systemd 248, также можно вызвать отладчик gdb непосредственно с помощью новой опции --debugger-arguments=..., например, сделав извлечение всех стеков потоков из последнего сбоя сервера MariaDB одной строкой, без предварительного извлечения файла ядра (требуется установка gdb)
# coredumpctl debug --debugger-arguments="-batch -ex 'thread apply all bt full'" /usr/sbin/mariadbd
Пока ни одна из долгосрочных версий Linux дистрибутивов не имеет достаточно новой версии systemd для этого, (по состоянию на момент написания) предстоящая версия Ubuntu 22.04 "Jammy Jellyfish" будет, вероятно, первой, которая поддержит это.
Дампы ядер и setuid в Linux
Поскольку mysqld выполняет setuid, вам может потребоваться установить fs.suid_dumpable=2 для разрешения дампов ядер в Linux. Вы можете проверить текущее значение fs.suid_dumpable с помощью утилиты sysctl. Например:
sysctl fs.suid_dumpable
Временно установить его в 2 можно с помощью утилиты sysctl. Например:
sudo sysctl -w fs.suid_dumpable=2
Или временно установить его в 2, записывая в файловую систему /proc. Например:
sudo echo 2 > /proc/sys/fs/suid_dumpable
Если вы хотите сделать его постоянным значением 2, вы можете добавить следующее в файл в /etc/sysctl.conf.d/. Например:
sudo tee /etc/sysctl.d/mariadb_fs_suid_dumpable.conf <<EOF fs.suid_dumpable=2 EOF
Примечание: Если вы не хотите изменять fs.suid_dumpable, то другим решением является запуск mysqld непосредственно как пользователя mysql, чтобы вызов setuid не был необходим.
Принудительное создание файла core на Linux
Чтобы принудительно создать файл core для mysqld можно отправить процессу сигнал sigabrt, у которого код сигнала 6. Это очень полезно для получения состояния неоткликаемого процесса mysqld. Однако это приведёт к падению mysqld, и при перезапуске будет выполнена процедура восстановления после сбоя.
Отправить сигнал можно с помощью команды kill. Например:
sudo kill -6 $(pidof mysqld)
В качестве альтернативы $(pidof mysqld), можно найти идентификатор процесса, используя утилиту ps или проверив переменную среды pid_file.
Файлы core в Windows
В MariaDB 10.4 и более поздних версиях дампы core по умолчанию включены в Windows. Дополнительную информацию см. в MDEV-18439.
Существуют дополнительные детали, связанные с использованием файлов core в Windows.
Файлы core в Kubernetes
См. проект IBM Обработчик дампов core.
Файлы minidump в Windows
В Windows файл core создается как файл minidump.
Подробную информацию о конфигурации и чтении файла minidump см. в Инструкции по чтению файла дампов памяти, создаваемого Windows в случае сбоя.
Файлы core и Address Sanitizer (ASAN)
Если ваш двоичный файл mysqld скомпилирован с Address Sanitizer (ASAN), то он не сможет сгенерировать файл core.
Что включено в файлы core
Файлы core обычно содержат дамп всей памяти в полном адресном пространстве процесса. Это означает, что если на сервере настроены некоторые большие буферы (например, большой InnoDB буферный пул), то файлы core сервера могут быть очень большими.
Однако, в MariaDB 10.3.7 и более поздних версиях некоторые большие буферы исключены из файлов core на некоторых системах, как способ уменьшения размера.
Исключаются следующие буферы:
- InnoDB буферный пул
- InnoDB журнал буфер
- InnoDB буфер журнала Redo (фиксировано 2М)
- Кэш запросов
Буферы исключаются только на Linux при использовании ядра версии 3.4 и выше и при использовании не-отладочной сборки mysqld. Некоторые версии Linux ядра имеют ошибку, которая приведет к печати следующего предупреждения в журнал:
Sep 25 10:41:19 srv1 mysqld: 2018-09-25 10:41:19 0 [Warning] InnoDB: Failed to set memory to DODUMP: Invalid argument ptr 0x2aaac3400000 size 33554432
В этих случаях дамп core может исключить некоторые дополнительные данные. Если это не вызывает беспокойства, то предупреждение можно проигнорировать. Проблема может быть решена обновлением до версии Linux ядра, в которой ошибка исправлена.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/enabling-core-dumps/