鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

使用链路时延检测采集分析MySQL函数信息

简要示范两种使用方式对MySQL应用的函数信息进行采集,第一种是应用未启动时通过加载so库的方式启动MySQL服务端并采集指定函数信息,第二种是应用处于运行态时通过attach的方式对mysqld进程的热点函数信息进行采集。

启动时加载模式(Launch Mode)

图1 示例流程图
  1. 将工具包上传至服务器。
  2. 将tracelib-collector-aarch64.tar.gz解压到“/home/collector”目录。
    1
    tar -zxvf tracelib-collector-aarch64.tar.gz -C /home/collector
    
  3. 准备配置文件(自行创建或使用symbol工具)。
    • 自行创建配置文件。
      以采集名为“mysql_parse”和“do_command”的函数为例,首先通过nm mysqld | grep -e mysql_parse -e do_command命令确认mangling name:
      1
      2
      3
      4
      # nm 输出结果 
      ...(省略) 
      0000000000bafa04 T _Z10do_commandP3THD 
      0000000000bada20 T _Z11mysql_parseP3THDP12Parser_state
      

      在当前目录下创建配置文件。

      1
      vi /home/collector/config
      

      按“i”进行编辑,填入查找到的符号名:

      _Z10do_commandP3THD 
      _Z11mysql_parseP3THDP12Parser_state

      “Esc”键,输入:wq!,按“Enter”保存并退出编辑。

    • 使用symbol工具生成配置文件。

      以采集名为“JOIN::extract_func_dependent_tables”的函数为例

      1
      2
      cd /home/collector
      ./symbol mysqld -e 'JOIN&extract_func_dependent_tables' -o ./config
      

      将在/home/collector目录下自动生成名为config的配置文件。

  4. 配置环境变量并启动mysqld进程。
    1
    LD_LIBRARY_PATH=/home/collector:$LD_LIBRARY_PATH LD_PRELOAD=/home/collector/librecord.so RECORD_CONF=/home/collector/config mysqld -uroot
    
  5. 在另一终端通过sysbench模拟测试。
    1
    sysbench ./tests/include/oltp_legacy/select.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=10 --time=1 --report-interval=1 run
    
  6. 采集完成后通过Ctrl+Ckill命令终止mysqld进程。

    在目录“/home/collector/record.data”下已生成采集到的数据。

  7. 使用analyze工具分析采集到的数据并汇总结果至statistics目录下。
    1
    ./analyze ./record.data/ -m --demangle -o ./statistics
    

    返回信息如下:

    1
    [info] Report saved to ./statistics/merged_summary.txt
    
  8. 查看汇总数据。
    1
    cat ./statistics/merged_summary.txt
    

    文件内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
       JOIN::extract_func_dependent_tables()
         count: 144878.00
         avg: 10975.76
         max: 725110.00
         min: 3310.00
         P90: 13400.00
         P75: 10860.00
         P50: 8290.00
    

    汇总报告包含函数的平均耗时/最大耗时/P90等数据,可根据这些数据找到对应函数进行分析

运行时挂载模式(Attach Mode)

图2 示例流程图
  1. 将工具整包上传至服务器“/home”目录下。
  2. 解压并进入工具目录。
    1
    2
    tar -zxvf DevKit-CLI-x.x.x-Linux-Kunpeng.tar.gz
    cd DevKit-CLI-x.x.x-Linux-Kunpeng
    
  3. 在当前终端启动MySQL服务端。
    1
    mysqld -uroot &
    

    输入密码后启动。

  4. 查看mysqld进程号。
    1
    ps -ef | grep mysqld
    

    回显如下:

    1
    root     3899932 2429790  0 19:05 pts/8    00:00:00 /application/mysql/bin/mysqld -uroot
    

    进程号为3899932。

  5. 在当前终端通过进程号对mysqld进程的热点函数进行采集。
    1
    ./devkit advisor knet attach -p 3899932 -o ./record.data  --hotspot
    

    采集的数据将生成在“/home/DevKit-CLI-x.x.x-Linux-Kunpeng/record.data/”

  6. 在另一终端通过sysbench模拟测试10秒。
    1
    sysbench ./tests/include/oltp_legacy/select.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --oltp-tables-count=10 --oltp-table-size=100000 --threads=10 --time=10 --report-interval=1 run
    
  7. 采集完成后结束mysqld进程。
    1
    kill 3899932
    
  8. 使用单独工具包中analyze工具分析数据。
    1
    2
    3
    tar -zxvf tracelib-collector-aarch64.tar.gz -C /home/collector
    cd /home/collector
    ./analyze /home/DevKit-CLI-x.x.x-Linux-Kunpeng/record.data -m --demangle -o ./statistics -n 20
    

    回显如下:

    1
    [info] Report saved to ./statistics/merged_summary.txt
    
  9. 查看分析结果文件。
    1
    vim ./statistics/merged_summary.txt
    

    可见热点函数net_read_packet、vio_io_wait等的调用信息,函数的平均耗时/最大耗时/P99等数据

    文件内容如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    ...(省略)
        net_read_packet(st_net*, unsigned long*)
          count: 455322.00
          avg: 13024.40
          max: 608010.00
          min: 4310.00
          P90: 14830.00
          P75: 13690.00
          P50: 12550.00
        vio_io_wait
          count: 3177.00
          avg: 11934.38
          max: 579860.00
          min: 2080.00
          P90: 26030.00
          P75: 13030.00
          P50: 4870.00
        __poll
          count: 3154.00
          avg: 9714.93
          max: 575420.00
          min: 1500.00
          P90: 23477.00
          P75: 10760.00
          P50: 2700.00
        net_read_raw_loop(st_net*, unsigned long)
          count: 905188.00
          avg: 4441.90
          max: 593240.00
          min: 2570.00
          P90: 5330.00
          P75: 4810.00
          P50: 4230.00
        vio_read
          count: 908952.00
          avg: 2435.08
          max: 590750.00
          min: 1350.00
          P90: 3180.00
          P75: 2890.00
          P50: 2410.00