Linux CPU过高问题排查及jvm调优思路

导语

在衡量服务器指标时我们常常会关注load、cpu、mem、qps,很多时候线上指标出问题就伴随着这些指标的异常。本文主要介绍了一个非常重要的指标CPU过高怎么排查,聊聊如何排查和调优CPU!

正文

平均负载

平均负载等于逻辑 CPU 个数,表示每个 CPU 都恰好被充分利用。如果平均负载大于逻辑 CPU 个数,则负载比较重


进程上下文切换

  • 无法获取资源而导致的自愿上下文切换
  • 被系统强制调度导致的非自愿上下文切换


CPU 使用率

  • 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,通常说明有应用程序比较繁忙
  • 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断),系统 CPU 使用率高,说明内核比较繁忙
  • 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,说明系统与硬件设备的 I/O 交互时间比较长
  • 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,表明系统发生了大量的中断
    查看系统的平均负载
$ uptime
 10:54:52 up 1124 days, 16:31,  6 users,  load average: 3.67, 2.13, 1.79

  • 10:54:52 是当前时间;up 1124 days, 16:31 是系统运行时间;6 users 则是正在登录用户数。而最后三个数字依次是过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average)。平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数
  • 当平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能
  • 平均负载与 CPU 使用率关系
  • CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的
  • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高
  • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高

CPU 上下文切换

进程上下文切换:

  • 进程的运行空间可以分为内核空间和用户空间,当代码发生系统调用时(访问受限制的资源),CPU 会发生上下文切换,系统调用结束时,CPU 则再从内核空间换回用户空间。一次系统调用,两次 CPU 上下文切换
  • 系统平时会按一定的策略调用进程,会导致进程上下文切换
  • 进程在阻塞等到访问资源时,也会发生上下文切换
  • 进程通过睡眠函数挂起,会发生上下文切换
  • 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起

线程上下文切换:

  • 同一进程里的线程,它们共享相同的虚拟内存和全局变量资源,线程上下文切换时,这些资源不变
  • 线程自己的私有数据,比如栈和寄存器等,需要在上下文切换时保存切换

中断上下文切换:

  • 为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件

查看系统的上下文切换情况:

vmstat 和 pidstat。vmvmstat 可查看系统总体的指标,pidstat则详细到每一个进程服务的指标

$ vmstat 2 1 
procs --------memory--------- --swap-- --io--- -system-- ----cpu----- 
r b swpd free    buff   cache  si so  bi bo in cs us sy id wa st 
1 0    0 3498472 315836 3819540 0 0   0  1  2  0  3  1  96 0  0

--------
cs(context switch)是每秒上下文切换的次数
in(interrupt)则是每秒中断的次数
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数.当这个值超过了CPU数目,就会出现CPU瓶颈
b(Blocked)则是处于不可中断睡眠状态的进程数
# pidstat -w
Linux 3.10.0-862.el7.x86_64 (8f57ec39327b)      07/11/2021      _x86_64_        (6 CPU)

06:43:23 PM   UID       PID   cswch/s nvcswch/s  Command
06:43:23 PM     0         1      0.00      0.00  java
06:43:23 PM     0       102      0.00      0.00  bash
06:43:23 PM     0       150      0.00      0.00  pidstat

------各项指标解析---------------------------
PID       进程id
Cswch/s   每秒主动任务上下文切换数量
Nvcswch/s 每秒被动任务上下文切换数量。大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换
Command   进程执行命令


怎么排查 CPU 过高问题

先使用 top 命令,查看系统相关指标。如需要按某指标排序则 使用 top -o 字段名 如:top -o %CPU。 -o 可以指定排序字段,顺序从大到小

# top -o %MEM
top - 18:20:27 up 26 days,  8:30,  2 users,  load average: 0.04, 0.09, 0.13
Tasks: 168 total,   1 running, 167 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.5 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:  32762356 total, 14675196 used, 18087160 free,      884 buffers
KiB Swap:  2103292 total,        0 used,  2103292 free.  6580028 cached Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND         
2323 mysql     20   0 19.918g 4.538g   9404 S 0.333 14.52 352:51.44 mysqld   
1260 root      20   0 7933492 1.173g  14004 S 0.333 3.753  58:20.74 java   
1520 daemon    20   0  358140   3980    776 S 0.333 0.012   6:19.55 httpd    
1503 root      20   0   69172   2240   1412 S 0.333 0.007   0:48.05 httpd                       
                   
---------各项指标解析---------------------------------------------------
第一行统计信息区
    18:20:27                     当前时间
    up 25 days, 17:29             系统运行时间&#
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值