Отладка работающего сервера (в Linux)
Даже если у вас нет сервера, скомпилированного для отладки, есть способы получить больше информации, если что-то пойдёт не так.
В случае возникновения проблем лучше использовать не сжатый дамп mysqld.
shell> file /usr/sbin/mysqld
Если здесь не указано «сжатый», то всё в порядке. В противном случае вам необходимо либо скачать двоичный файл с информацией для отладки, либо скомпилировать его без сжатия двоичного файла.
Отладка потребления памяти с помощью tcmalloc
Если у вас есть проблема с процессом mysqld, который постоянно растёт, вы можете использовать tcmalloc, чтобы выяснить, что выделяет память:
В зависимости от вашей системы, необходимо установить пакет tcmalloc (OpenSuse) или google-perftools-lib (RedHat, Centos).
Следующая последовательность команд запускает mysqld с профилированием памяти, и если вы прервёте его с помощью SIGABRT, вы получите дамп ядра, который можно просмотреть:
HEAPPROFILE=/tmp/mysqld.prof /usr/sbin/mysqld_safe --malloc-lib=tcmalloc --core-file-size=unlimited --core-file
или, если вы предпочитаете вызывать mysqld напрямую:
ulimit -c unlimted LD_PRELOAD=/usr/lib64/libtcmalloc.so.4 HEAPPROFILE=/tmp/mysqld.prof /usr/sbin/mysqld --core-file
Конечно, вы можете добавить другие опции mysqld в конец этой строки.
Теперь запустите свой клиент/приложение, использующее MariaDB. Вы можете найти место выделения памяти в файле /tmp/mysqld.prof. Если вы обнаружите какие-либо проблемы с памятью, пожалуйста, сообщите об этом в системе отслеживания ошибок MariaDB!
Защита ptrace и привязка GDB к экземпляру mysqld
Новые версии Ubuntu не позволяют одному процессу просматривать память процесса произвольного пользователя. В результате при попытке привязать GDB к работающему экземпляру MariaDB (или любого другого процесса) в GDB появляется следующая ошибка:
ptrace: Operation not permitted
Дополнительные сведения доступны в вики Ubuntu.
Для разрешения подключения GDB необходимо изменить значение параметра /proc/sys/kernel/yama/ptrace_scope sysctl.
- Для временного изменения откройте оболочку root и выполните:
echo 0 > /proc/sys/kernel/yama/ptrace_scope
- Для постоянного изменения отредактируйте как root:
/etc/sysctl.d/10-ptrace.conf
и установите значение в0.
Отладка зависающего сервера
Если ваш сервер mysqld зависает, вы можете отладить его, чтобы понять, что произошло.
Предпочтительно, чтобы сервер был скомпилирован для отладки, но это не строго необходимо:
cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_VALGRIND=ON . make -j4
Чтобы узнать, что делает сервер:
- Определите номер процесса mysqld
ps -edalf | grep mysqld
- Присоединитесь к процессу и получите трассировку стека:
gdb -p 'pid of mysqld' path-to-mysqld set height 0 set logging file /tmp/mysqld.log set logging on thread apply all backtrace full
После этого у вас будет полная трассировка стека, включая все локальные переменные, в файле mysqld.log. Обратите внимание, что вы получите все переменные только если сервер не сжат.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/debugging-a-running-server-on-linux/