关于MySQL的Admin Ping Command

前言:

最近在线上诊断QPS飙升的过程中深入进行了下Admin Ping Command的测试。此外,再一些国外文章中最近也读到了一些相关知识,所以写成一篇博文做一下总结。

1. 关于Admin Ping Command?

由于查阅官方文档中没有关于Admin Ping Command的描述和介绍。因此,Google了很多页面,把大家的阐述做一个个人理解总结如下:

什么是Admin Ping Command(后文简称ping命令)? 

ping命令实际上是提供了一种轻度消耗命令接口,这种接口用于去判断一个持久连接是否存活,或者远端MySQL是否存活。

当远端MySQL Server接收到这种特殊形式的命令后,不做更多的语法解析和执行计划优化,直接返回结果。

Admin Ping Command有什么用?

在运用链接池方法连接MySQL的时候,这个命令就显得非常有用。因为链接池再把一个空闲链接句柄给到客户端的时候并不知道这个链接是否仍然存活(即没有超时或者被Server 主动kill)。链接池需要用一个命令去判断并触发重连。而这时Ping Command无疑是代价最小的。如果有同学自己用java代码去实现MySQL链接池的话,链接存活判断使用Admin Ping Command是最佳选择。

怎么调用Admin Ping Command?

每个MySQL client/connector 实现Ping Command的方式都不一样。Java的使用方法见:http://mysqlblog.fivefarmers.com/2010/08/25/connector-j-ping/

Perl的使用方法简单的说就是 $dbh->ping(); 详见:http://www.turbolift.com/mysql/DBD_3.21.X.php3#ping

2. Admin Ping Command的性能优势测试

看了上面的介绍,大家一定有很多疑问。例如,用ping比用select 1到底快多少?如何在Server端监控?下文将通过实际测试一一分析。

如何在MySQL Server端观察到Admin Ping Command?

实际上MySQL有一个专门的计数器来统计ping命令。通过show global status like 'Com_admin_commands' 即可看到从Server启动后累计接收到的ping命令次数

Admin Ping Command的性能优势有多大?

下面通过一个简单的perl测试脚本,来观察常用的 select 1 和 ping命令之间的性能差距。脚本分别重复执行十万次ping和select 1,通过time比较两者之间的总执行时间的差距。脚本如下:

use strict;
use warnings;
use utf8;
use DBI;
use IO::Socket;
use FileHandle;


my $CONFIG_SERVER_IP  ='192.168.26.167';
my $CONFIG_SERVER_DB='test';
my $CONFIG_SERVER_PORT='3310';
my $CONFIG_SERVER_USER='root';
my $CONFIG_SERVER_PASS='password';
my $dbh = DBI->connect("DBI:mysql:$CONFIG_SERVER_DB;host=$CONFIG_SERVER_IP;port=$CONFIG_SERVER_PORT", $CONFIG_SERVER_USER, $CONFIG_SERVER_PASS,{RaiseError => 1}) || die "Could not connect to database: $DBI::errstr";

for(my $i=0;$i<100000;$i++){ #my $result=$dbh->do('/* ping */select 1'); my $result=$dbh->ping; }

执行结果:

select 1:

real    0m5.968s
user    0m1.235s
sys    0m1.175s

real    0m6.003s
user    0m1.195s
sys    0m1.236s

real    0m6.155s
user    0m1.225s
sys    0m1.237s
Admin Ping:

real    0m3.426s
user    0m0.604s
sys    0m1.115s

real    0m3.483s
user    0m0.681s
sys    0m1.081s

real    0m3.467s
user    0m0.614s
sys    0m1.136s

取平均值后,

SELECT 1十万次执行时间: 6.03 秒

Admin PING十万次执行时间:3.45秒

可见后者性能整整高出 74% ,对于链接池这种对响应时间要求极高的实现来说,资源的节省相当可观。

 

参考资料:

http://mysqlblog.fivefarmers.com/2010/08/25/connector-j-ping/

原文地址:https://www.cnblogs.com/cenalulu/p/3425955.html