Linux 常见的 CPU 性能问题及解决方案梳理( 四 )

CPU 使用率除了系统负载、上下文切换信息,最直观的 CPU 问题指标就是 CPU 使用率信息 。Linux 通过/proc虚拟文件系统向用户控件提供系统内部状态信息,其中/proc/stat则是 CPU 和任务信息统计 。
$ cat /proc/stat | grep cpucpu6392076667 1160 3371352191 52468445328 3266914 37086 36028236 20721765 0 0cpu0 889532957 175 493755012 6424323330 2180394 37079 17095455 3852990 0 0...这里每一列的含义如下:

  1. user(通常缩写为 us),代表用户态 CPU 时间 。注意,它不包括下面的 nice 时间,但包括了 guest 时间 。
  2. nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间 。这里注意,nice 可取值范围是 -20 到 19,数值越大,优先级反而越低 。
  3. system(通常缩写为 sys),代表内核态 CPU 时间 。
  4. idle(通常缩写为 id),代表空闲时间 。注意,它不包括等待 I/O 的时间(iowait) 。
  5. iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间 。
  6. irq(通常缩写为 hi),代表处理硬中断的 CPU 时间 。
  7. softirq(通常缩写为 si),代表处理软中断的 CPU 时间 。
  8. steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间 。
  9. guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间 。
  10. guest_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间 。
这里我们可以使用top、ps、pidstat等工具方便的查询这些数据,可以很方便的看到 CPU 使用率很高的进程,这里我们可以通过这些工具初步定位,但是具体的问题原因还需要其他方法继续查找 。
这里我们可以使用perf top方便查看热点数据,也可以使用perf record可以将当前数据保存起来方便后续使用perf report查看 。
CPU 使用率问题排查这里总结一下 CPU 使用率问题及排查思路:
  1. 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题 。
  2. 系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题 。
  3. I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题 。
  4. 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断服务程序 。
CPU 问题排查套路CPU 使用率CPU 使用率主要包含以下几个方面:
  1. 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比 。用户 CPU 使用率高,通常说明有应用程序比较繁忙 。
  2. 系统 CPU 使用率,表示 CPU 在内核态运行的时间百分比(不包括中断) 。系统 CPU 使用率高,说明内核比较繁忙 。
  3. 等待 I/O 的 CPU 使用率,通常也称为 iowait,表示等待 I/O 的时间百分比 。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长 。
  4. 软中断和硬中断的 CPU 使用率,分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比 。它们的使用率高,通常说明系统发生了大量的中断 。
  5. 除在虚拟化环境中会用到的窃取 CPU 使用率(steal)和客户 CPU 使用率(guest),分别表示被其他虚拟机占用的 CPU 时间百分比,和运行客户虚拟机的 CPU 时间百分比 。
平均负载反映了系统的整体负载情况,可以查看过去 1 分钟、过去 5 分钟和过去 15 分钟的平均负载 。
上下文切换上下文切换主要关注 2 项指标:
  1. 无法获取资源而导致的自愿上下文切换 。
  2. 被系统强制调度导致的非自愿上下文切换 。
CPU 缓存命中率CPU 的访问速度远大于内存访问,这样在 CPU 访问内存时不可避免的要等待内存响应 。为了协调 2 者的速度差距出现了 CPU 缓存(多级缓存) 。如果 CPU 缓存命中率越高则性能会更好,我们可以使用以下工具查看 CPU 缓存命中率,工具地址、项目地址 perf-tools
# ./cachestat -tCounting cache functions... Output every 1 seconds.TIMEHITSMISSESDIRTIESRATIOBUFFERS_MBCACHE_MB08:28:5741500100.0%119108:28:5841100100.0%119108:28:5936297078.9%0808:29:0041100100.0%0908:29:017752048903.6%08908:29:0241100100.0%08908:29:03606900100.0%08908:29:041524900100.0%08908:29:0541100100.0%08908:29:0641100100.0%08908:29:0741103100.0%089[...]总结通过性能指标查工具(CPU 相关)


推荐阅读