如何快速定位到影响mysql cpu飙升的原因——筑梦之路

news2024/10/6 20:37:43

  通常我们只需要执行show processlist 进行查看,一般执行时间最长的SQL八九不离十就是罪魁祸首,但当show processlist的输出有近千条,那么很难第一眼就发现有问题的SQL,那么如何快速找到呢?其实也非常简单。我们知道mysqld是单进程多线程。那么我们可以使用top获取mysqld进程的各个线程的cpu使用情况。

top -H -p mysqld_pid

测试sql:

select * from cpu_h order by rand() limit 1;

可以看到是线程22682占用cpu比较高,接着通过查看performance_schema.threads表,找到相关SQL

select * from performance_schema.threads where thread_os_id=22682

再通过show processlist看

 找到processlist id以后,就可以直接使用命令kill。

python脚本:

(统计活跃线程SQL执行的次数)

#!/usr/bin/python

# -*- coding:utf-8 -*-

import argparse

import MySQLdb

import argparse

import commands

import sys

import MySQLdb.cursors

from warnings import filterwarnings

from warnings import resetwarnings

filterwarnings('ignore', category = MySQLdb.Warning)

reload(sys)

sys.setdefaultencoding('utf8')



def init_parse():

    parser = argparse.ArgumentParser(

        epilog='by yayun @2022',

    )

    parser.add_argument('-n','--num',required=False,default=1,help='获取多少条最耗费cpu的记录,默认1条')

parser.add_argument('-a','--active',action='store_true',default=False,help='统计活跃线程各类SQL的条目数')

    return parser

def mysql_exec(sql):

    try:   conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='xx',port=3306,connect_timeout=15,charset='utf8')

        curs = conn.cursor()

        curs.execute(sql)

        conn.commit()

        curs.close()

        conn.close()

    except Exception,e:

       print "mysql execute: " + str(e)



def mysql_query(sql):

    conn=MySQLdb.connect(host='127.0.0.1',user='root',passwd='xx',port=3306,connect_timeout=15,charset='utf8',cursorclass = MySQLdb.cursors.DictCursor)

    cursor = conn.cursor()

    count=cursor.execute(sql)

    if count == 0 :

        result=0

    else:

        result=cursor.fetchall()

    return result

    cursor.close()

    conn.close()



if __name__ == '__main__':

    parser = init_parse()

    args = parser.parse_args()

    slow_sql_numbers=args.num

    active_thread_status=args.active

    mysqld_pid = commands.getoutput("cat /data/mysql/3306/pid_mysql.pid")

    get_mysql_thead_cmd="top -H -p %s  -n 1 | grep mysqld | head -n %s | awk '{print $1,$2}' | sed 's/mysql//g'" % (mysqld_pid,slow_sql_numbers)

    tmp_mysqld_thread=commands.getoutput(get_mysql_thead_cmd).split()

    mysqld_thread=[]

    for i in tmp_mysqld_thread:

        try:

             a=i.replace('\x1b[0;10m\x1b[0;10m','')

             a=i.replace('\x1b[0;10m','')

             mysqld_thread.append(int(a))

        except Exception,e:

            pass

    active_thread_sql="select  * from ( select max(user) as user,max(db) as db , max(info) as runningsql,count(*) as rungingsql_cnt from information_schema.processlist where db is not null  and info is not null and info like '%SELECT%' group by user, db, md5(info)   union all     select max(user) as user,max(db) as db ,max(info) as runningsql,count(*) as rungingsql_cnt from information_schema.processlist where db is not null  and info is not null and info like 'UPDATE%' group by user, db,md5(info)  ) a order by 4 desc limit 10"



    if active_thread_status:

        resut=mysql_query(active_thread_sql)

        if resut:

            for i in resut:

                print "运行条目统计: %s | 运行SQL: %s  | 运行用户:%s " % (i['rungingsql_cnt'],i['runningsql'],i['user'])

        print "============================================="    

    processlist_id=[]

    if len(mysqld_thread) >= 2:

        new_mysqld_thread=tuple(mysqld_thread)

        get_slow_sql="select PROCESSLIST_ID,PROCESSLIST_USER,PROCESSLIST_HOST,\

                      PROCESSLIST_DB,PROCESSLIST_TIME,PROCESSLIST_INFO from performance_schema.threads where thread_os_id in %s" % (new_mysqld_thread,)

    else:

        new_mysqld_thread=mysqld_thread

        get_slow_sql="select PROCESSLIST_ID,PROCESSLIST_USER,PROCESSLIST_HOST,\

                      PROCESSLIST_DB,PROCESSLIST_TIME,PROCESSLIST_INFO from performance_schema.threads where thread_os_id=%s" % (new_mysqld_thread[0])

    new_resut=mysql_query(get_slow_sql)

    for b in new_resut:

        if b['PROCESSLIST_ID']:

            processlist_id.append(b['PROCESSLIST_ID'])

        if b['PROCESSLIST_INFO'] != None:

            print "SQL已运行时间: %s秒|执行SQL用户: %s |执行SQL来源ip: %s |操作的库: %s |SQL详情: %s |PROCESSLIST ID: %s" % (b['PROCESSLIST_TIME'],b['PROCESSLIST_USER'],b['PROCESSLIST_HOST'],b['PROCESSLIST_DB'],b['PROCESSLIST_INFO'],b['PROCESSLIST_ID'])



    if processlist_id:

        print "============================================="

        print "以上耗费CPU资源的SQL是否需要杀掉? 请输入Y/N"

        while True:

            in_content = raw_input("请输入:")

            if in_content == "Y":

                for p in processlist_id:

                    sql="kill %s" % (p) 

                    mysql_exec(sql)

                exit(0)

            elif in_content == "N":

                print("退出程序!")

                exit(0)

            else:

                print("输入有误,请重输入!")

搜集来自:如何快速找到影响MySQL CPU升高的原因

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1788809.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么样的男士内裤比较好?按这个方法选男士内裤不会出错!

男士内裤作为日常穿着的重要服饰,其舒适度与卫生性对男士们的健康至关重要。随着时代的变迁,男士内裤的款式与材质也日益丰富多样,为男士们提供了更多选择。 目前市场上,男士内裤主要分为三角、平角和四角三大类别。其中&#xf…

直播商城源码-PC+APP+H5+小程序现成源码

随着电商行业的不断演进,直播商城已成为连接消费者和商品的新兴桥梁。直播商城源码提供了一个完整的解决方案,使得企业能够迅速搭建起一个覆盖PC、APP、H5和小程序的全渠道电商平台。本文将探讨直播商城源码的优势、关键功能以及如何选择适合的现成源码。…

ai对话虚拟人app有哪些?一起来看看这3款

ai对话虚拟人app有哪些?在当前的科技浪潮中,AI对话虚拟人app已经成为我们日常生活中的得力助手。它们不仅提供了更加智能、便捷的交流和信息服务,还让我们能随时随地与AI伙伴进行深度互动。这些app的广泛应用,不仅提升了我们的生活…

目标检测数据集 - 海洋垃圾检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍:海洋垃圾检测数据集,真实拍摄海洋海底场景高质量垃圾检测图片数据,涉及场景丰富,比如海底塑料垃圾数据、海底铁制品罐状垃圾数据、海底纸张垃圾数据、海洋生物和海底垃圾同框数据、海底探索仪器和海底垃圾同框数据、海…

期刊的分类与级别

在学术界,期刊的分类与级别构成了一个评价学术成果和学者贡献的重要标准,同时也是学术出版与学术交流的基础。然而,对于初涉学者来说,理解期刊的分类与级别可能并不直观。本文旨在提供一个系统性的解释,并阐述为何期刊…

LeetCode刷题之HOT100之跳跃游戏

2024/6/5 今天下起了绵密细雨,空气清新很多。昨晚做的梦较魔幻,可能也是导致我睡觉时业已破损的小米手环8的表腕断裂的因素之一。来到实验室,打扫一下卫生,听听歌,做道题。好不自在呀! 1、题目描述 2、逻辑…

SD NAND的垃圾回收机制:无人机数据管理的隐形守护者

随着科技的飞速发展,无人机在各个领域的应用越来越广泛,从航拍到物流配送,再到农业监测,无人机正逐渐成为我们生活中不可或缺的一部分。而SD NAND作为一种创新的存储芯片,可以直接贴片使用,具有小尺寸、高可…

基于SpringBoot+Vue旅游民宿信息管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

Qt报错:libvlc开发的程序,出现Direct3D output全屏窗口

问题描述: 在qt中开发重播模块时,第一次在窗口正常播放,点击重播按钮后会弹出新的Direct3D output窗口播放视频 分析: 因为libvlc_media_player_set_hwnd 这个函数 设置了不存在的窗口句柄,导致vlc视频播放窗口没有嵌…

python11 序列的相关操作

枚举遍历 序列的相关操作 text "hello,python" # in 判断字符是否在序列中,存在返回true,否则返回false print(p是否存在:,(p in text)) print(a是否存在:,(a in text)) # not in 判断字符不在序列中,不存在返回true,否则返回false print(p不…

数据仓库与数据挖掘总复习练习2-3(实验六 2024.6.5)

一、练习2 is_unique是否值唯一 range(范围,步长) head()、tail()默认显示5条 缺失值情况 计算(最少多少元素求和、元素相乘) pct_change() latax(工具:专用于写公式&a…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1,环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2,记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库,不会出现报错,界面也能正常显示操作,但是.NetCore的程序却总是报错。 2.1,.NetFrameWork的WPF应用程序 注:但是.…

深度学习——卷积神经网络(CNN)

深度学习 深度学习就是通过多层神经网络上运用各种机器学习算法学习样本数据的内在规律和表示层次,从而实现各种任务的算法集合。各种任务都是啥,有:数据挖掘,计算机视觉,语音识别,自然语言处理等。‘ 深…

会计电子档案系统方案

会计电子档案系统方案是指建立一个以电子方式存储和管理会计档案的系统。该方案具体包括以下几个方面: 1. 系统架构设计:确定系统的组成以及各个组件之间的关联和交互方式。包括数据库设计、系统服务器和客户端的部署等。 2. 电子档案管理:建…

处理无法拉取GitHub库的解决方案

提交和拉取github上的库总是失败,这里记录一下如何使用代理解决。 首先找到端口,记住它的端口 然后使用git命令 # HTTP/HTTPS 协议 git config ––global http.url.proxy http://127.0.0.1:port # 以 Github 为例 git config ––global http.https:/…

基于51单片机步进电机控制—9个等级

基于51单片机步进电机控制 (仿真+程序+设计报告) 功能介绍 具体功能: 1.使用L298驱动步进电机转动,可分为9个速度等级(1级最快,9级最慢); 2.使用74HC595驱…

vscode+latex设置跳转快捷键

安装参考 https://blog.csdn.net/Hacker_MAI/article/details/130334821 设置默认recipe ctrl P 打开设置,搜索recipe 也可以点这里看看有哪些配置 2 设置跳转快捷键

54.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(2)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:53.WEB渗透测试-信息收集-端口、目录扫描、源码泄露(1) 关于源码…

如何使用vsCode打开intel D435i深度相机

一、下载并安装相机SDK文件 1.SDK下载地址: Release Intel RealSense™ SDK 2.0 (v2.54.2) IntelRealSense/librealsense GitHub 2.下载后,双击即可安装 3.环境配置 1)window的开始菜单,搜索环境变量,选择编辑系…

【成品设计】基于STM32的智能防盗门控制系统的设计

《基于STM32的智能防盗门控制系统的设计》 所需器件: STM32最小系统板。角度传感器:做为地震检测模块。温度传感器:作为火灾检测模块。指纹传感器:作为指纹识别采集模块。舵机模块:0度代表关门。90度代表开门。报警模…