admin管理员组

文章数量:1487745

MySQL CPU高如何找到相关的会话

可以使用下面的这个shell脚本:

代码语言:bash复制
#!/bin/bash
# 获取 TOP CPU使用率的会话详情

# (适用于单机单实例的MySQL)
top_cpu_pid=$(top -b -n 1  -H -p $(pidof mysqld) -o '%CPU'| head -10 | grep PID -A 1 | tail -1  | awk '{print $1}')

echo "CPU占用最高的线程ID: " $top_cpu_pid

echo "----------------------------------------------------------"
# 获取对应PID的SQL明细
mysql -uroot -p'xxxx -e "SELECT
    a.thd_id,
    a.user,
    a.conn_id,
    a.source,
    a.program_name,
    b.*
FROM
    sys.processlist a,
    performance_schema.threads b
WHERE b.thread_id = a.thd_id and  b.THREAD_OS_ID= ${top_cpu_pid} \G"

抓取到的内容类似如下:

代码语言:txt复制
    CPU占用最高的线程ID:  17779
    ----------------------------------------------------------
    mysql: [Warning] Using a password on the command line interface can be insecure.
    *************************** 1. row ***************************
                thd_id: 246677239
                user: dts@192.168.31.181
                conn_id: 242711474
                source: NULL
        program_name: NULL
            THREAD_ID: 246677239
                NAME: thread/sql/one_connection
                TYPE: FOREGROUND
        PROCESSLIST_ID: 242711474
    PROCESSLIST_USER: dts
    PROCESSLIST_HOST: 192.168.31.181
        PROCESSLIST_DB: NULL
    PROCESSLIST_COMMAND: Query
    PROCESSLIST_TIME: 2
    PROCESSLIST_STATE: executing
    PROCESSLIST_INFO: select aaa_no, aaa_status,count(0) from sbtest.aaa_info where aaa_code = 'abcd' group by aaa_no, aaa_status limit 300
    PARENT_THREAD_ID: NULL
                ROLE: NULL
        INSTRUMENTED: YES
                HISTORY: YES
        CONNECTION_TYPE: TCP/IP
        THREAD_OS_ID: 17779
        RESOURCE_GROUP: USR_default

TIPS:可以使用python或golang封装下上面的这个脚本,集成到db-agent中,便于在数据库运维平台中调用和结果展示。

本文标签: MySQL CPU高如何找到相关的会话