linux系统-CPU占用率过高排查思路-mysql篇

  •  查看进程状态

    • service mysqld status
      
  • 打印信息
    • 打印信息中的 Main PID 就是进程ID
  • 查看进程对应线程状态

    • #top命令
      top -Hp PID
      #htop命令
      htop -p PID
    • 使用上面命令根据PID查询该进程对应的线程
    • 从打印信息中就可以清晰的看到每个线程的占用情况,这个时候只需要找到占用率最高的那个线程的PID记在小本本上
  • 查找线程执行的sql语句

    • select
      	a.user,
      	a.host,
      	a.db,
      	b.thread_os_id,
      	b.thread_id,
      	a.id processlist_id,
      	a.command,
      	a.time,
      	a.state,
      	a.info
      from
      	information_schema.processlist a,
      	performance_schema.threads b
      where
      	a.id = b.processlist_id
      	and (b.thread_os_id = 记在小本本上的PID
      		or b.thread_os_id = 可以写多个);
      

      通过上述sql语句就可以实现根据记在小本本上的PID查询出对应执行的sql信息,结果如下

    •  参数解析:

user 用户
host 地址+端口号
db 数据库
thread_os_id 系统内部分配的线程ID,当然,OS不会为每一个会话创建os_id
thread_id 仅在perforamance_schema中使用,是其内部自动增长的计数器,前台和后台线程均有这个id,且thread_id和thread_os_id相关联
processlist_id 一般在mysql层使用,跟前台登录会话相关联,是真正的线程ID。
processlistid和前台用户直接相关,每创建一个登录会话,就会新增一个processlistid。
在performance_schema.threads表中,后台线程没有processlistID的值,这个值是NULL,这是因为后台线程不是登录用户所创建的,但是前后台线程都会有thread_os_id和thread_id的值,因为所有线程最终都要依赖OS线程执行,thread_id和thread_os_id有一定的对应关系
command 当前执行sql的类型,查询,修改,删除,新增
time 时间
state 状态
info 具体执行的sql语句
  •  优化建议

根据info中的sql信息,用于定位我们代码中的调用的位置,然后根据实际情况进行进一步优化

猜你喜欢

转载自blog.csdn.net/zjb1697922408/article/details/131896602