zoukankan      html  css  js  c++  java
  • 关于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/

  • 相关阅读:
    洛谷P2886 [USACO07NOV]Cow Relays G
    CF1344F Piet's Palette
    CF1344E Train Tracks
    CF1342F Make It Ascending
    LOJ6049 拍苍蝇
    test20200430 最长路径
    LG1742 最小圆覆盖 和 LOJ6360 复燃「恋之埋火」
    LOJ6358 前夕
    LOJ6485 LJJ学二项式定理
    LOJ2882 两个人的星座
  • 原文地址:https://www.cnblogs.com/cenalulu/p/3425955.html
Copyright © 2011-2022 走看看