Mytop是一个用于监控MySQL性能的开源命令行工具。它受到名为top的Linux系统监视工具的启发,在外观和感觉上类似于它。Mytop连接到MySQL服务器并定期运行show processlist
和show global status
命令。然后,它以有用的格式汇总信息。使用mytop,我们可以(实时)监控MySQL线程,查询和正常运行时间,以及查看哪个用户正在运行哪些数据库查询,哪些是慢查询等等。所有这些信息都可用于优化MySQL服务器性能。
在本教程中,我们将讨论如何安装,配置和使用mytop。
在开始学习本教程之前,您应该具备以下条件:
让我们安装mytop所需的软件包。
首先,我们需要在服务器上安装EPEL(Enterprise Linux的额外软件包)yum存储库。EPEL是一个Fedora特别兴趣小组,负责为Enterprise 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存储库:
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模块。
在使用mytop之前,请为mytop创建一个名为.mytop
的自定义配置文件。运行命令:
sudo nano /root/.mytop
并在文件中添加以下内容并保存并退出。
host=localhost
db=mysql
delay=5
port=3306
socket=
batchmode=0
color=1
idle=1
当您以root用户身份直接运行mytop时,以及使用前面的sudo
命令作为非root sudo用户运行mytop时,将使用此配置文件。
您可以根据需要对此配置文件进行更改。例如,该delay
选项指定显示刷新之间的时间量(以秒为单位)。如果您希望每3秒刷新一次mytop显示,则可以使用以下命令编辑该/root/.mytop
文件
sudo nano /root/.mytop
并更改以下内容:
delay=3
该idle
参数指定是否允许空闲(休眠)线程出现在mytop显示屏幕的列表中。默认是显示空闲线程。如果省略空闲线程,则会颠倒默认排序顺序,以便最长运行的查询显示在列表顶部。如果您希望这样做,请编辑该/root/.mytop
文件并更改以下内容:
idle=0
您可以参考mytop的手册页以获取有关配置文件中所有参数的信息 - 它包含每个参数的说明。要访问手册页,请使用以下命令:
man mytop
您可以键入q
以退出手册。
在本节中,我们将讨论如何连接到mytop并使用它来查看MySQL查询。
Mytop需要凭据才能访问数据库,可以通过提示,命令行提供,也可以存储在配置文件中。为了更好的安全性,我们将使用--prompt
选项至mytop,每次都要求输入密码。 让我们使用以下连接到mytop:
sudo mytop --prompt
并在提示符下输入MySQL root密码。您还可以在mytop
命令中使用多个命令行参数。请参阅手册页以获取完整列表。例如,如果要使用其他mysql用户(如sammy)连接到mytop,请运行以下命令:
sudo mytop -u sammy --prompt
要仅连接和监视特定数据库,可以使用以下命令:
sudo mytop -d databasename --prompt
要退出mytop并返回到shell提示符,请键入q
。
在本节中,我们将了解如何解释mytop显示以及该工具提供的不同功能。
一旦我们使用mytop --prompt
连接到mytop,然后我们将进入线程视图。它将显示类似于:
MySQL 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服务器的摘要信息。
qps now
数字将为20.第一个字段是每秒查询数(qps now: 2
)。第二个值是每秒慢查询的数量。该Threads: 6 ( 5/ 0)
段表示总共有6个连接线程,5个处于活动状态(一个处于休眠状态),并且线程缓存中有0个线程。第三行中的最后一个字段显示查询百分比,如上一行中所示,但自上次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,用户名,主机,用户连接的数据库,空闲时间的秒数,线程执行的命令(或线程的状态),以及查询的第一部分信息都显示在这里。如果线程处于Query状态(即Cmd
显示Query),则下一列Query or State
将显示正在运行的查询的第一部分。如果命令状态是睡眠或空闲,则Query or State
列通常是空白的。在上面的示例输出中,id为2的线程实际上是mytop运行show processlist
查询以收集信息。ID为16的线程正在休眠(不处理查询,但仍然连接)。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查询并优化它们的起点,从而提高了服务器的整体性能。
更多Linux教程请前往腾讯云+社区学习更多知识。
参考文献:《How To Use Mytop to Monitor MySQL Performance》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。