6 инструментов с открытым исходным кодом для мониторинга производительности MySQL в Linux

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, чтобы проверить, не мешает ли ваша конфигурация работе этих оптимизированных запросов.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Похожие статьи

Комментарии (2)

Автар по умолчанию