cpu进程占用过高检测工具

[TOC]

使用到的工具

  • htop
  • jstack
/opt/java8/bin/jstack

Usage:
    jstack [-l] <pid>
        (to connect to running process) 连接活动线程
    jstack -F [-m] [-l] <pid>
        (to connect to a hung process) 连接阻塞线程
    jstack [-m] [-l] <executable> <core>
        (to connect to a core file) 连接dump的文件
    jstack [-m] [-l] [server_id@]<remote server IP or hostname>
        (to connect to a remote debug server) 连接远程服务器

Options:
    -F  to force a thread dump. Use when jstack <pid> does not respond (process is hung)
    -m  to print both java and native frames (mixed mode)
    -l  long listing. Prints additional information about locks
    -h or -help to print this help message

1. 首先排查哪些进程cpu占用率高。 通过命令 htop


看的pid 为31147的进程和4375的进程

2. 查看对应java进程的每个线程的CPU占用率

ps -Lp 31147  cu

3. 通过jdk/bin 命令查找 每个环境jdk路径可以从/etc/profile查看

/usr/local/jdk1.8.0_201/bin/jstack -F 31147

4 转换线程ID

printf "%x\n" 41157

5 定位cpu占用线程

jstack 31147 |grep a0c5

4 判别和处理load高问题

一般根据cpu数量去判断,也就是Load平均要小于CPU的数量,负载的正常值在不同的系统中有着很大的差别。在单核处理器的工作站中,1或2都是可以接受的。多核处理器的服务器(比如24核)上,load 会到达20 ,甚至更高。

4.1 a) 数据库层面

  •  1 top -u mysql -c 检查当前占用cpu资源最多的进程命令。-c 是为了显示出进程对应的执行命令语句,方便查看是什么操作导致系统load飙高。
    
  •  2 根据不同的情况获取pid 或者MySQL的端口号
    
  •  3 如果是MySQL 数据库服务导致laod 飙高,则可以使用如下命令
        show processlist;
        SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND <> 'sleep' AND TIME>100;
       或
        orzdba 工具检查逻辑读/thread active的值。用法orzdba --help
        orztop 工具检查当前正在执行的慢sql,用法orztop -P $port
    
  •  4 获取异常的sql之后,剩下的比较好解决了。结合第一部分中的几条原因
    
  •     a 选择合适的索引
    
  •     b 调整sql 语句 比如对应order by 分页采用延迟关联
    
  •     c 业务层面增加缓存,减少对数据库的直接访问等
    

4.2 b) OS 系统层面 检查系统IO

使用iostat 命令查看r/s(读请求),w/s(写请求),avgrq-sz(平均请求大小),await(IO等待), svctm(IO响应时间)
r/s ,w/s是每秒读/写请求的次数。

util是设备的利用率。如果它接近100%,通常说明设备能力趋于饱和(并不绝对,比如设备有写缓存)。有时候可能会出现大于100%的情况,这多半是计算时四舍五入引起的。
svctm是平均每次请求的服务时间。这里有一个公式:(r/s+w/s)*(svctm/1000)=util。举例子:如果util达到100%,那么此时 svctm=1000/(r/s+w/s),假设IOPS是1000,则svctm大概在1毫秒左右,如果长时间大于这个数值,说明系统出了问题。
await是平均每次请求的等待时间。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
avgqu-sz是平均请求队列的长度。毫无疑问,队列长度越短越好