前言:
最近在线上诊断QPS飙升的过程中深入进行了下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
看了上面的介绍,大家一定有很多疑问。例如,用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.968suser 0m1.235ssys 0m1.175sreal 0m6.003suser 0m1.195ssys 0m1.236sreal 0m6.155suser 0m1.225ssys 0m1.237s
Admin Ping:real 0m3.426suser 0m0.604ssys 0m1.115sreal 0m3.483suser 0m0.681ssys 0m1.081sreal 0m3.467suser 0m0.614ssys 0m1.136s
取平均值后,
SELECT 1十万次执行时间: 6.03 秒
Admin PING十万次执行时间:3.45秒
可见后者性能整整高出 74% ,对于链接池这种对响应时间要求极高的实现来说,资源的节省相当可观。
参考资料:
http://mysqlblog.fivefarmers.com/2010/08/25/connector-j-ping/