如何使用 Mytop 监控 MySQL 性能
介绍
Mytop 是一个开源的命令行工具,用于监控 MySQL 性能。它的灵感来自 Linux 系统监控工具 top,外观和感觉与之相似。Mytop 连接到 MySQL 服务器并定期运行show processlist
和show global status
命令。然后,它会以有用的格式汇总信息。使用 mytop,我们可以(实时)监控 MySQL 线程、查询和正常运行时间,以及查看哪个用户在哪个数据库上运行查询、哪些是慢速查询等等。所有这些信息都可用于优化 MySQL 服务器性能。
在本教程中,我们将讨论如何安装、配置和使用 mytop。
先决条件
在开始本教程之前,您应该具备以下条件:
- CentOS 7 64 位 Droplet(也适用于 CentOS 6)
- 具有 sudo 权限的非 root 用户。要设置此类型的用户,请按照CentOS 7 的初始服务器设置教程进行操作。所有命令都将以此用户身份运行。
- Droplet 上运行的 MySQL 服务器。要安装 MySQL,请按照如何在 CentOS 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈文章中的步骤 2 进行操作。
第 1 步 - 安装 Mytop
让我们安装 mytop 所需的软件包。
首先,我们需要在服务器上安装 EPEL(企业 Linux 的附加软件包)yum 存储库。EPEL 是一个 Fedora 特别兴趣小组,它为企业 Linux 创建、维护和管理一组高质量的开源附加软件包。运行以下命令在您的服务器上安装并启用 EPEL 存储库:
在 CentOS 7 上:
sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
在 CentOS 6 上:
sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
在继续之前,请使用以下命令验证 EPEL repo 是否已启用:
sudo yum repolist
如果启用,您将在输出中看到以下 repo 列表:
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64
接下来,让我们使用 yum 插件protectbase保护 EPEL 的基础包。
sudo yum install yum-plugin-protectbase.noarch -y
protectbase插件的目的是保护某些 yum 存储库免受其他存储库的更新。即使未受保护的存储库具有较新的版本,受保护存储库中的软件包也不会被未受保护的存储库中的软件包更新或覆盖。
现在我们准备安装 mytop 包。运行以下命令来安装它:
sudo yum install mytop -y
这将安装 mytop 包及其所有依赖项,主要是 perl 模块。
第2步 - 配置Mytop
在使用 mytop 之前,请先为 mytop 创建一个名为 的自定义配置文件.mytop
。运行以下命令:
sudo nano /root/.mytop
并在文件中添加以下内容并保存退出。
host=localhost
db=mysql
delay=5
port=3306
socket=
batchmode=0
color=1
idle=1
sudo
当您以 root 身份直接运行 mytop 时,以及以非 root sudo 用户身份使用其前面的命令运行它时,都将使用此配置文件。
您可以根据需要更改此配置文件。例如,该delay
选项指定显示刷新间隔的秒数。如果您希望每 3 秒刷新一次 mytop 显示,则可以 /root/.mytop
使用以下方式编辑文件
sudo nano /root/.mytop
并更改以下内容:
delay=3
该idle
参数指定是否允许空闲(休眠)线程出现在 mytop 显示屏的列表中。默认显示空闲线程。如果省略空闲线程,则默认排序顺序将反转,以便运行时间最长的查询出现在列表顶部。如果您希望这样做,请编辑文件/root/.mytop
并更改以下内容:
idle=0
您可以参考 mytop 的手册页以获取有关配置文件中所有参数的信息 — 它包含每个参数的描述。要访问手册页,请使用以下命令:
man mytop
您可以键入以下内容q
以退出手册。
第 3 步 - 连接到 Mytop
在本节中,我们将讨论如何连接到 mytop 并使用它来查看 MySQL 查询。
Mytop 需要凭据才能访问数据库,可以通过提示符、命令行提供凭据,也可以将其存储在配置文件中。为了提高安全性,我们将使用--prompt
mytop 选项,每次都会要求输入密码。让我们使用以下命令连接到 mytop:
sudo mytop --prompt
并在提示符下输入 MySQL 根密码。您还可以在命令中使用几个命令行参数mytop
。请参阅手册页以获取完整列表。例如,如果您想使用不同的 mysql 用户(如sammy)连接到 mytop,请运行以下命令:
sudo mytop -u sammy --prompt
要连接并仅监控特定数据库,可以使用以下命令:
sudo mytop -d databasename --prompt
要退出 mytop 并返回到 shell 提示符,请键入q
。
步骤 4 — 查看和解释 Mytop 显示屏
在本节中,我们将了解如何解释 mytop 显示以及该工具提供的不同功能。
一旦我们使用 mytop 连接,mytop --prompt
我们将进入线程视图。它将显示类似以下内容:
Output of mytopMySQL on localhost (5.5.41-MariaDB) up 0+00:05:52 [01:33:15]
Queries: 148 qps: 0 Slow: 0.0 Se/In/Up/De(%): 09/00/00/00
qps now: 2 Slow qps: 0.0 Threads: 6 ( 5/ 0) 67/00/00/00
Key Efficiency: 2.0% Bps in/out: 14.7/320.7k Now in/out: 192.5/731.8k
Id User Host/IP DB Time Cmd Query or State
-- ---- ------- -- ---- --- ----------
2 root localhost mysql 0 Query show full processlist
16 root localhost 0 Sleep
17 root localhost testdb 0 Query SELECT * FROM dept_emp
18 root localhost testdb 0 Query SELECT * FROM dept_emp
19 root localhost testdb 0 Query SELECT * FROM dept_emp
20 root localhost testdb 0 Query SELECT * FROM dept_emp
如果您处于另一个视图中,则可以通过键入 返回该视图t
。
上面的显示屏幕分为两部分。顶部四行包括标题,可以按SHIFT-H打开或关闭。标题包含有关 MySQL 服务器的摘要信息。
-
第一行标识服务器的主机名和正在运行的 MySQL 版本。右侧以天+小时:分钟:秒格式显示 MySQL 服务器进程的正常运行时间以及当前时间。
-
第二行显示服务器已处理的查询总数(在我们的例子中为 148 个)、每秒平均查询数、慢查询数以及 Select、Insert、Update 和 Delete 查询的百分比。
-
第三行显示自上次刷新 mytop 以来的实时值。mytop 的正常刷新(延迟)时间为 5 秒,因此如果刷新后最后 5 秒内运行了 100 个查询,则该
qps now
数字为 20。第一个字段是每秒查询数 (qps now: 2
)。第二个值是每秒慢查询数。该Threads: 6 ( 5/ 0)
段表示总共有 6 个连接线程,其中 5 个处于活动状态(一个处于休眠状态),线程缓存中有 0 个线程。第三行的最后一个字段显示查询百分比,与上一行类似,但显示自上次刷新 mytop 以来的查询百分比。 -
第四行显示键缓冲区效率(从缓冲区而不是磁盘读取键的频率)以及 MySQL 发送和接收的字节数,包括总体和最后一个 mytop 周期。
Key Efficiency: 2.0%
显示 2% 的键是从缓冲区读取的,而不是从磁盘读取的。Bps in/out: 14.7/320.7k
显示自启动以来,MySQL 的平均入站流量为 14.7kbps,出站流量为 320.7kbps。Now in/out
再次显示流量,但自上次 mytop 刷新以来。
显示的第二部分列出了当前的 MySQL 线程,并根据其空闲时间排序(空闲时间最少的排在第一位)。如果需要,可以按O键反转排序顺序。线程 ID、用户名、用户连接的主机、用户连接的数据库、空闲时间(秒数)、线程正在执行的命令(或线程的状态)以及查询信息的第一部分都显示在这里。如果线程处于查询状态(即Cmd
显示查询),则下一列Query or State
将显示正在运行的查询的第一部分。如果命令状态为睡眠或空闲,则该Query or State
列通常为空白。在上面的示例输出中,id 为2的线程实际上是 mytop,它运行查询以收集信息。id 为16 的show processlist
线程正在休眠(不处理查询,但仍处于连接状态)。id 为17 的线程正在对testdb数据库运行 SELECT 查询。
现在我们已经了解了 mytop 的基本显示,我们将了解如何使用它来收集有关 MySQL 线程和查询的更多信息。让我们看看以下 mytop 显示:
[secondary_output Output of mytop]
MySQL on localhost (5.5.41-MariaDB) up 0+00:13:10 [23:54:45]
Queries: 2.8k qps: 4 Slow: 51.0 Se/In/Up/De(%): 45/00/00/00
qps now: 17 Slow qps: 0.0 Threads: 52 ( 51/ 0) 96/00/00/00
Key Efficiency: 100.0% Bps in/out: 215.4/ 7.6M Now in/out: 2.0k/16.2M
Id User Host/IP DB Time Cmd Query or State
-- ---- ------- -- ---- --- ----------
34 root localhost testdb 0 Query show full processlist
1241 root localhost 1 Sleep
1242 root localhost testdb 1 Query SELECT * FROM dept_emp
1243 root localhost testdb 1 Query SELECT * FROM dept_emp
1244 root localhost testdb 1 Query SELECT * FROM dept_emp
1245 root localhost testdb 1 Query SELECT * FROM dept_emp
1246 root localhost testdb 1 Query SELECT * FROM dept_emp
1247 root localhost testdb 1 Query SELECT * FROM dept_emp
在上面显示的 mytop线程视图(默认视图)中,查询被截断。要查看整个查询,可以按F,它会询问:
Full query for which thread id:
输入要查看的查询的线程 ID。例如,输入1244
。然后它将显示以下内容:
Thread 1244 was executing following query:
SELECT * FROM dept_emp WHERE ...
-- paused. press any key to resume or (e) to explain --
我们可以输入e
来解释查询。这将解释正在运行的查询,以便我们了解查询是否已优化。EXPLAIN 是理解和优化麻烦的 MySQL 查询的最强大工具之一。例如:
EXPLAIN SELECT * FROM dept_emp:
*** row 1 ***
table: dept_emp
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 332289
Extra: NULL
-- paused. press any key to resume --
您可以按任意键退出此模式或键入t
以返回默认线程视图。
mytop 中另一个有用的视图是命令视图。要访问命令视图,请键入c
。它看起来类似于以下内容:
Command Total Pct | Last Pct
------- ----- --- | ---- ---
select 1782 55% | 100 8%
show status 723 22% | 533 45%
show processlist 708 22% | 532 45%
change db 2 0% | 0 0%
show variables 1 0% | 0 0%
Compression 0 0% | 0 0%
该Command
列显示正在运行的命令或查询的类型。该Total
列表示自服务器启动以来运行的该类型命令的总数,该Pct
列以百分比显示该类型命令的总数。在垂直线的另一侧,有一Last
列告诉我们自上次刷新 mytop 以来运行的该类型命令的次数。这些信息让我们了解 MySQL 服务器在短期和长期内正在做什么。
我们在本教程中讨论了 mytop 的一些重要且有用的功能。还有许多其他可用功能。要查看完整的选项列表,您可以在 mytop 运行时按?键。
结论
现在您应该已经很好地了解如何使用 mytop 来监控您的 MySQL 服务器。它也是查找问题 SQL 查询并对其进行优化的起点,从而提高服务器的整体性能。您可以在本教程中获得有关如何在您的服务器上优化 MySQL 查询和表的更多信息。