Mysql поставляется с неплохими встроенными средствами диагностики, но когда ваша база данных начинает работать медленнее под нагрузкой, вам понадобятся инструменты командной строки, которые точно покажут, что происходит: какие запросы выполняются, сколько времени они занимают и где находятся узкие места. В этом руководстве рассмотрены 6 инструментов командной строки с открытым исходным кодом для мониторинга времени работы MySQL, нагрузки, медленных запросов и общей производительности в Linux. Инструменты тестировались на Ubuntu и RHEL, но они работают на любом современном дистрибутиве Linux с MySQL 8.0 или Mariadb 10.6.
Раньше для получения статистики времени работы и запросов с действующего сервера MySQL приходилось вручную просматривать вывод команды SHOW STATUS, но эти инструменты преобразуют эти данные в удобные для чтения представления в режиме реального времени, которые помогут вам обнаружить проблемы с производительностью, прежде чем они приведут к сбою вашего сайта.
1. Mytop
Mytop — это консольный инструмент мониторинга MySQL, похожий на команду top в Linux, который предоставляет в терминале в режиме реального времени информацию о потоках, запросах в секунду, медленных запросах и времени работы сервера.
Первоначальный проект Mytop был закрыт в 2009 году, и старые пакеты дистрибутивов больше не работают должным образом с MySQL 8. В Ubuntu apt install mytop полностью не работает, поэтому вам следует использовать активно поддерживаемый форк сообщества, выпущенный в 2026 году с поддержкой MySQL 8.0 и MariaDB 10.3.
В Ubuntu/Debian:
sudo apt install libdbi-perl libdbd-mysql-perl libterm-readkey-perl cd ~/ git clone https://github.com/fevangelou/mytop.git cd mytop chmod +x mytop sudo cp mytop /usr/local/sbin/
В RHEL/Rocky Linux:
sudo dnf install perl-DBI perl-DBD-MySQL perl-TermReadKey cd ~/ git clone https://github.com/fevangelou/mytop.git cd mytop chmod +x mytop sudo cp mytop /usr/local/sbin/
Затем запустите mytop и подключитесь к вашему серверу MySQL:
mytop -u root -p или mytop -u root -p'YourPassword'
Вывод:
MySQL on localhost (8.0.36) up 5+12:03:44 [12:45:01]
Queries: 2.5M qps: 87 Slow: 14 Se/In/Up/De(%): 62/18/14/06
qps now: 92 Slow qps: 0.3 Threads: 9 ( 8/ 1)
Key Efficiency: 98.6% Bps in/out: 1.2k/140k Now in/out: 1.4k/168k
Id User Host/IP DB Time Cmd Query or State
-- ---- ------- -- ---- --- ----------
112 app_user 192.168.1.45 mydb 0 Query SELECT * FROM orders WHERE...
113 root localhost mysql 0 Sleep
Верхняя часть — это то, что вам нужно наблюдать.
Slow: 14показывает, что с момента запуска сервера было выполнено 14 медленных запросов.qps now: 92— это частота запросов в реальном времени. Если это число резко возрастает, а ваше приложение одновременно замедляется, у вас есть проблема с нагрузкой, которую стоит изучить.- Нажмите
?в mytop, чтобы увидеть все сочетания клавиш. - Нажмите
k, чтобы завершить конкретный поток по ID.
2. Innotop
Innotop — это более подробный монитор в реальном времени для серверов MySQL, работающих с механизмом хранения InnoDB, который является механизмом по умолчанию в каждой установке MySQL 8.
Если mytop показывает список потоков, то innotop отображает статистику буферного пула InnoDB, ожидания блокировок, состояния транзакций и статистику ввода-вывода. Именно такие данные вам нужны, когда запросы выполняются медленно, но количество потоков выглядит нормально.
Чтобы установить Innotop в Linux, используйте следующую команду, соответствующую вашему дистрибутиву Linux.
sudo apt install innotop [On Debian, Ubuntu and Mint] sudo dnf install innotop [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo apk add innotop [On Alpine Linux] sudo pacman -S innotop [On Arch Linux] sudo zypper install innotop [On OpenSUSE] sudo pkg install innotop [On FreeBSD]
Если его нет в вашем репозитории, клонируйте с github и запустите:
git clone https://github.com/innotop/innotop.git cd innotop innotop -u root -p
Вывод:
[RO] InnoDB Txns, InnoDB 8.0.36, up 5+12:04:11, 9 threads, 92.0 QPS CXN Timeouts Deadlocks Txns MaxSQL RollSegments History Queries local 0 0 3 0% 128 42 1234567 ID User Host DB Time Undo Query 42 app_user local mydb 3 18 UPDATE inventory SET qty=qty-1 WHERE...
3. mysqladmin
mysqladmin поставляется с каждой установкой MySQL и является самым быстрым способом проверить время работы, состояние подключения и текущую частоту запросов с помощью одной команды, не открывая интерактивную сессию.
Проверка версии сервера и времени работы:
mysqladmin -u root -p version
Вывод:
mysqladmin Ver 10.0 Distrib 10.11.15-MariaDB, for Linux on x86_64 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Server version 10.11.15-MariaDB Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/run/mysqld/mysqld.sock Uptime: 5 days 12 hours 3 min 44 sec Threads: 9 Questions: 2491823 Slow queries: 14 Opens: 412 Flush tables: 3 Open tables: 405 Queries per second avg: 5.287
Здесь нужно обратить внимание на строку Slow queries: 14. Это число только растет, никогда не сбрасывается, пока сервер работает. Если вы проверите его сейчас и оно равняется 14, а через час проверите снова и оно равняется 140, значит, за последний час произошло что-то, что стоит изучить.
Чтобы наблюдать за обновлениями статуса в реальном времени каждые 2 секунды:
mysqladmin -u root -p -i 2 status
Вывод:
Uptime: 475424 Threads: 9 Questions: 2491823 Slow queries: 14 Opens: 412 ... Uptime: 475426 Threads: 11 Questions: 2491985 Slow queries: 14 Opens: 412 ...
Прыжки числа Threads показывают вам всплески подключений в реальном времени. Если оно поднимается до вашего предела max_connections, новые подключения начинают отклоняться.
4. Percona Toolkit
Percona Toolkit — это набор инструментов с открытым исходным кодом для командной строки, созданный компанией Percona для администрирования MySQL в производственной среде. Два инструмента из этого набора непосредственно полезны для мониторинга производительности: pt-query-digest для анализа медленных запросов и pt-mysql-summary для получения полной моментальной картины состояния сервера.
Percona Toolkit отсутствует в стандартных репозиториях Ubuntu или RHEL, поэтому сначала необходимо добавить репозиторий Percona, а затем выполнить установку.
В Ubuntu/Debian:
sudo apt update && sudo apt install curl curl -O https://repo.percona.com/apt/percona-release_latest.generic_all.deb sudo apt install gnupg2 lsb-release ./percona-release_latest.generic_all.deb sudo apt update sudo percona-release enable pt release sudo apt install percona-toolkit
В RHEL/Rocky Linux:
sudo yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm sudo percona-release enable pt release sudo yum install percona-toolkit
pt-mysql-summary
Начните с этого, когда вы впервые входите на сервер или устраняете проблему, контекст которой вам неизвестен. Он выводит удобную для чтения сводку всего: версию MySQL, конфигурацию, размеры таблиц, статус репликации, использование буфера ключей:
pt-mysql-summary -- -u root -p
Вывод:
Percona Toolkit MySQL Summary Report #######################
System time | 2025-05-14 12:45:01 UTC
Instances ##################################################
Port Data Directory Nice OOM Socket
= ====================== = ====
3306 /var/lib/mysql 0 0 /var/run/mysqld/mysqld.sock
MySQL Executable ############################################
Path to executable | /usr/sbin/mysqld
Has symbols | Yes
Processlist ################################################
Command COUNT(*) Working SUM(Time) MAX(Time)
------------------------------ -------- ------- --------- ---------
Query 3 3 4 3
Sleep 6 0 840 420
Этот показатель Sleep с высокими значениями SUM(Time) означает, что соединения, находящиеся в состоянии длительного простоя, остаются открытыми. Это проблема настройки пула соединений, а не проблема запроса. pt-mysql-summary выявляет именно такой сигнал, и вам не нужно знать, на какую SHOW STATUS переменную обратить внимание.
pt-query-digest
Это самый полезный инструмент для анализа медленных запросов, доступный для MySQL. Сначала включите журнал медленных запросов, если он не включен:
mysql -u root -p -e "SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1;"
Затем запустите pt-query-digest на журнале медленных запросов:
pt-query-digest /var/log/mysql/mysql-slow.log
Вывод:
450ms user time, 30ms system time, 28.00M rss, 220.15M vsz Current date: 2025-05-14 12:45:01 Hostname: web01 Files: /var/log/mysql/mysql-slow.log Overall: 184 total, 8 unique, 0.02 QPS, 0.14x concurrency Attribute total min max avg 95% stddev median ======== === === === === === == == Exec time 512s 1s 143s 3s 9s 14s 1s Rows examine 1.02G 0 180M 5.7M 30M 18M 800k Profile Rank Query ID Response time Calls R/Call Item ============= ========= = == 1 0x813031B8BBC3B329 341s 66.6% 42 8.12s SELECT orders items 2 0xA0CA1BBEDCD1B80D 108s 21.1% 89 1.21s SELECT users sessions
Этот Rank 1 запрос ответственен за 66% всего времени медленных запросов. Он выполняется 42 раза, и каждый раз занимает в среднем 8 секунд. Это ваша цель. Исправьте этот один запрос, добавьте недостающий индекс или перепишите JOIN, и вы одним махом снимете 66% нагрузки с вашей проблемы с медленными запросами.
Путь к журналу медленных запросов в Ubuntu обычно /var/log/mysql/mysql-slow.log. В RHEL это обычно /var/lib/mysql/hostname-slow.log. Если вы видите Permission denied, запустите с sudo.
5. MySQLTuner
MySQLTuner — это отдельный скрипт на Perl, который подключается к вашему серверу MySQL, считывает широкий набор переменных состояния и конфигурации и выводит приоритезированный список рекомендаций по настройке.
Это подходящий инструмент для запуска на только что настроенном сервере MySQL или после значительного всплеска трафика, когда вы подозреваете, что проблема в вашей конфигурации.
Скачайте и запустите его:
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl chmod +x mysqltuner.pl perl mysqltuner.pl --user root --pass your-mysql-root-password
Замените your-mysql-root-password на ваш фактический пароль root MySQL. Флаг --pass передает его напрямую; без него MySQLTuner запросит его у вас.
>> MySQLTuner 2.2.12 - Major Hayden
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
[--] Skipping version check for MySQLTuner script
[OK] Logged in as root@localhost
-------- General Statistics --------------------------------------------------
[--] Performing tests on MySQL 8.0.36
[OK] Currently running supported MySQL version 8.0.36
[OK] Operating on 64-bit architecture
-------- Performance Metrics -------------------------------------------------
[OK] Query cache is disabled by default due to its known issues.
[!!] InnoDB buffer pool / data size: 128M / 2G
[!!] InnoDB buffer pool instances: 1 (recommended 2)
[!!] Slow queries: 14 (0% of 2491823 total queries)
-------- Recommendations -----------------------------------------------------
General recommendations:
Increase innodb_buffer_pool_size to 1.5G or more
Add innodb_buffer_pool_instances = 2 to my.cnf
Enable slow_query_log and set long_query_time = 2
Эта строка [!!] InnoDB buffer pool / data size: 128M / 2G означает, что ваш буферный пул установлен на значение по умолчанию 128 МБ, но ваш фактический объем данных составляет 2 ГБ. MySQL считывает с диска гораздо больше, чем необходимо. Установка innodb_buffer_pool_size на значение около 70% от доступной оперативной памяти и перезапуск MySQL часто являются единственным самым значительным улучшением производительности, которое вы можете добиться на новом сервере.
Если вы видите сообщение Cant connect to local MySQL server through socket, это означает, что MySQLTuner не может найти ваш файл сокета MySQL. Попробуйте добавить --socket /var/run/mysqld/mysqld.sock в команду.
Если ваш друг только что настроил свой первый сервер MySQL и не имеет представления, с чего начать его настройку, [share]отправьте ему эту статью[/share]. Один только MySQLTuner сэкономит ему часы работы.
6. mysqlslap
mysqlslap поставляется вместе с MySQL, так же как mysqladmin. Это инструмент для нагрузочного тестирования и бенчмаркинга, который имитирует одновременные подключения клиентов к вашему серверу и измеряет, как он справляется с нагрузкой. Его следует использовать для тестирования производительности до пика трафика, а не во время него.
Запустите базовый тест с 50 одновременными подключениями и 200 запросами:
mysqlslap -u root -p --concurrency=50 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --number-of-queries=200
Вывод:
Benchmark
Average number of seconds to run all queries: 3.847 seconds
Minimum number of seconds to run all queries: 3.847 seconds
Maximum number of seconds to run all queries: 3.847 seconds
Number of clients running queries: 50
Average number of queries per client: 4
Это 3.847 seconds для 200 запросов от 50 клиентов — ваш базовый показатель. Запустите тест снова после того, как вы increase innodb_buffer_pool_size или добавите индекс, и сравните результаты. Если число значительно снизится, это означает, что внесенное изменение действительно дало результат.
Чтобы протестировать конкретную базу данных с реальным запросом:
mysqlslap -u root -p --concurrency=25 --iterations=3 --query="SELECT * FROM mydb.orders WHERE status='pending'" --create-schema=mydb
Вывод:
Benchmark
Average number of seconds to run all queries: 1.243 seconds
Minimum number of seconds to run all queries: 1.198 seconds
Maximum number of seconds to run all queries: 1.301 seconds
Number of clients running queries: 25
Average number of queries per client: 1
Три итерации с диапазоном от 1,198 с до 1,301 с. Это стабильный результат. Теперь добавьте индекс в столбец status и запустите тест снова. Если время сократится до 0,2 секунды, вы только что доказали, что индекс стоит добавить в производственную среду.
Заключение
С помощью этих 6 инструментов вы получаете Мониторинг потоков в реальном времени с помощью mytop, видимость транзакций InnoDB с помощью innotop, быструю проверку времени работы с помощью mysqladmin, анализ медленных запросов с помощью pt-query-digest, рекомендации по настройке конфигурации с помощью MySQLTuner и тестирование нагрузки с помощью mysqlslap.
Начните с mysqladmin версии, чтобы проверить базовое время работы и количество медленных запросов. Затем запустите pt-query-digest на вашем журнале медленных запросов. Один только этот шаг покажет вам, какие запросы на самом деле вредят вашему серверу. После этого используйте MySQLTuner, чтобы проверить, не мешает ли ваша конфигурация работе этих оптимизированных запросов.
Комментарии (2)