李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • AI工具集
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • 网站地图
    • 网站统计
    • 另一个网站
    • 赞助
  • 🚇开往
!Destiny
惟坚韧者始能遂其志
  1. 首页
  2. 转载
  3. 技术
  4. 正文

CPU飙高,系统性能问题如何排查?

2020年10月9日 约 2,259 字8 分钟 149 0 0
本文最后更新于 2020年10月23日,距今已 2164 天,其中的信息可能已经发生变化,请注意甄别。

一 背景知识

LINUX进程状态

LINUX 2.6以后的内核中,进程一般存在7种基础状态:D-不可中断睡眠、R-可执行、S-可中断睡眠、T-暂停态、t-跟踪态、X-死亡态、Z-僵尸态,这几种状态在PS命令中有对应解释。

  • D (TASK_UNINTERRUPTIBLE),不可中断睡眠态。顾名思义,位于这种状态的进程处于睡眠中,并且不允许被其他进程或中断(异步信号)打断。因此这种状态的进程,是无法使用kill -9杀死的(kill也是一种信号),除非重启系统(没错,就是这么头硬)。不过这种状态一般由I/O等待(比如磁盘I/O、网络I/O、外设I/O等)引起,出现时间非常短暂,大多很难被PS或者TOP命令捕获(除非I/O HANG死)。SLEEP态进程不会占用任何CPU资源。

  • R (TASK_RUNNING),可执行态。这种状态的进程都位于CPU的可执行队列中,正在运行或者正在等待运行,即不是在上班就是在上班的路上。

  • S (TASK_INTERRUPTIBLE),可中断睡眠态。不同于D,这种状态的进程虽然也处于睡眠中,但是是允许被中断的。这种进程一般在等待某事件的发生(比如socket连接、信号量等),而被挂起。一旦这些时间完成,进程将被唤醒转为R态。如果不在高负载时期,系统中大部分进程都处于S态。SLEEP态进程不会占用任何CPU资源。

  • T&t (__TASK_STOPPED & __TASK_TRACED),暂停or跟踪态。这种两种状态的进程都处于运行停止的状态。不同之处是暂停态一般由于收到SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOUT四种信号被停止,而跟踪态是由于进程被另一个进程跟踪引起(比如gdb断点)。暂停态进程会释放所有占用资源。

  • Z (EXIT_ZOMBIE), 僵尸态。这种状态的进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID等)。僵尸态进程会释放除进程入口之外的所有资源。

  • X (EXIT_DEAD), 死亡态。进程的真正结束态,这种状态一般在正常系统中捕获不到。

Load Average & CPU使用率

谈到系统性能,Load和CPU使用率是最直观的两个指标,那么这两个指标是怎么被计算出来的呢?是否能互相等价呢?

Load Average

不少人都认为,Load代表正在CPU上运行&等待运行的进程数,即

staticunsignedlongcount_active_tasks(void)
 {
structtask_struct*p;
unsignedlongnr=0;

read_lock(&tasklist_lock);
for_each_task(p) {
if ((p->state==TASK_RUNNING
 (p->state&TASK_UNINTERRUPTIBLE)))
nr+=FIXED_1;
 }
read_unlock(&tasklist_lock);
returnnr;
 }
......
staticinlinevoidcalc_load(unsignedlongticks)
 {
unsignedlongactive_tasks; /* fixed-point */
staticintcount=LOAD_FREQ;

count-=ticks;
if (count<0) {
count+=LOAD_FREQ;
active_tasks=count_active_tasks();
CALC_LOAD(avenrun[0], EXP_1, active_tasks);
CALC_LOAD(avenrun[1], EXP_5, active_tasks);
CALC_LOAD(avenrun[2], EXP_15, active_tasks);
 }
 }

在前文 Linux进程状态 中有提到过,不可中断睡眠态的进程(TASK_UNINTERRUTED)一般都在进行I/O等待,比如磁盘、网络或者其他外设等待。由此我们可以看出,Load Average在Linux中体现的是整体系统负载,即CPU负载 + Disk负载 + 网络负载 + 其余外设负载,并不能完全等同于CPU使用率(这种情况只出现在Linux中,其余系统比如Unix,Load还是只代表CPU负载)。

CPU使用率

CPU的时间分片一般可分为4大类:用户进程运行时间 - User Time, 系统内核运行时间 - System Time, 空闲时间 - Idle Time, 被抢占时间 - Steal Time。除了Idle Time外,其余时间CPU都处于工作运行状态。

通常而言,我们泛指的整体CPU使用率为User Time 和 Systime占比之和(例如tsar中CPU util),即:

为了便于定位问题,大多数性能统计工具都将这4类时间片进一步细化成了8类,如下为TOP对CPU时间片的分类。

  • us:用户进程空间中未改变过优先级的进程占用CPU百分比

  • sy:内核空间占用CPU百分比

  • ni:用户进程空间内改变过优先级的进程占用CPU百分比

  • id:空闲时间百分比

  • wa:空闲&等待I/O的时间百分比

  • hi:硬中断时间百分比

  • si:软中断时间百分比

  • st:虚拟化时被其余VM窃取时间百分比

这8类分片中,除wa和id外,其余分片CPU都处于工作态。

二 资源&瓶颈分析

从上文我们了解到,Load Average和CPU使用率可被细分为不同的子域指标,指向不同的资源瓶颈。总体来说,指标与资源瓶颈的对应关系基本如下图所示。

Load高 & CPU高

这是我们最常遇到的一类情况,即load上涨是CPU负载上升导致。根据CPU具体资源分配表现,可分为以下几类:

CPU sys高

这种情况CPU主要开销在于系统内核,可进一步查看上下文切换情况。

  • 如果非自愿上下文切换较多,说明CPU抢占较为激烈,大量进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。

  • 如果自愿上下文切换较多,说明可能存在I/O、内存等系统资源瓶颈,大量进程无法获取所需资源,导致的上下文切换。

CPU si高

这种情况CPU大量消耗在软中断,可进一步查看软中断类型。一般而言,网络I/O或者线程调度引起软中断最为常见:

  • NET_TX & NET_RX。NET_TX是发送网络数据包的软中断,NET_RX是接收网络数据包的软中断,这两种类型的软中断较高时,系统存在网络I/O瓶颈可能性较大。
  • SCHED。SCHED为进程调度以及负载均衡引起的中断,这种中断出现较多时,系统存在较多进程切换,一般与非自愿上下文切换高同时出现,可能存在CPU瓶颈。

CPU us高

这种情况说明资源主要消耗在应用进程,可能引发的原因有以下几类:

  • 死循环或代码中存在CPU密集计算。这种情况多核CPU us会同时上涨。
  • 内存问题,导致大量FULLGC,阻塞线程。这种情况一般只有一核CPU us上涨。
  • 资源等待造成线程池满,连带引发CPU上涨。这种情况下,线程池满等异常会同时出现。

Load高 & CPU低

这种情况出现的根本原因在于不可中断睡眠态(TASK_UNINTERRUPTIBLE)进程数较多,即CPU负载不高,但I/O负载较高。可进一步定位是磁盘I/O还是网络I/O导致。

三 排查策略

利用现有常用的工具,我们常用的排查策略基本如下图所示:

从问题发现到最终定位,基本可分为四个阶段:

资源瓶颈定位

这一阶段通过全局性能检测工具,初步定位资源消耗异常位点。

常用的工具有:

  • top、vmstat、tsar(历史)

    • 中断:/proc/softirqs、/proc/interrupts

    • I/O:iostat、dstat

热点进程定位

定位到资源瓶颈后,可进一步分析具体进程资源消耗情况,找到热点进程。

常用工具有:

  • 上下文切换:pidstat -w

  • CPU:pidstat -u

  • I/O:iotop、pidstat -d

  • 僵尸进程:ps

线程&进程内部资源定位

找到具体进程后,可细化分析进程内部资源开销情况。

常用工具有:

  • 上下文切换:pidstat -w -p [pid]

  • CPU:pidstat -u -p [pid]

  • I/O: lsof

热点事件&方法分析

获取到热点线程后,我们可用trace或者dump工具,将线程反向关联,将问题范围定位到具体方法&堆栈。

常用的工具有:

  • perf:Linux自带性能分析工具,功能类似hotmethod,基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。
  • jstack
    • 结合ps -Lp或者pidstat -p一起使用,可初步定位热点线程。
    • 结合zprofile-threaddump一起使用,可统计线程分布、等锁情况,常用与线程数增加分析。
  • strace:跟踪进程执行时的系统调用和所接收的信号。
  • tcpdump:抓包分析,常用于网络I/O瓶颈定位。

原文链接:https://mp.weixin.qq.com/s/fzLcAkYwKhj-9hgoVkTzaw

参考链接

1
  1. 1https://mp.weixin.qq.com/s/fzLcAkYwKhj-9hgoVkTzawmp.weixin.qq.com
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/transport/2113

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

CPU飙高,系统性能问题如何排查?

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: CPU JAVA JVM Linux
最后更新:2020年10月23日

岁月同一天 9 月 26 日

回望过去的今天,你在写什么

  • 7 年前 2019年9月26日
    什么是RESTful?RESTful详解

    什么是RESTful 出处 2000 年 Roy Fielding 的博士论文中(论文地址见下方,感兴趣的可以看看),R…

  • 7 年前 2019年9月26日
    妹妹的画【2019.09.26】

    值此国庆佳节来临之际,特此奉上妹妹的大作四张~~~

  • 原创
    7 年前 2019年9月26日
    Java数据类型判断工具类DataTypeUtil

    背景 之前要写一个项目,根据配置以及前端入参来调用具体的接口执行对应的任务,需要校验前端的入参是否是指定的数据类型,防止…

相关文章
  • 精通Linux根目录:核心文件夹深度解析与实战指南2026年1月8日
  • JAVA设计模式-抽象工厂模式2020年2月18日
  • 使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理2022年6月23日
  • SpringBoot 实现接口防刷的 5 种实现方案2025年5月27日
  • JWT 实现登录认证 + Token 自动续期方案2025年4月7日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

人生自古谁无死?留取丹心照汗青。

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
祝大家中秋安康 游本昌去世 Redis7+&8.X 全新进阶系列(02):Redis Functions 详解——替代Lua脚本的官方轻量化函数方案 Redis7.x&8.x 全新进阶系列(01):划时代升级总览——从6.x到7.x/8.x全版本变革全景 让WordPress静态化之Rocket‑Nginx WordPress下一代默认主题Ipsum预览
关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能WordPress缓存插件WP Fastest Cache、WP Rocket 、FlyingPress对比关于使用AI的一些思考WordPress下一代默认主题Ipsum预览Kratos+ v1.1.16版本更新说明
精通Linux根目录:核心文件夹深度解析与实战指南 解锁 Java 开发全流程效率:17 个必备工具深度指南 AI 编程高效提示词模板库(2025 实战版) 妹妹的画【2019.07.13】 技术人员转团队管理该怎么做 Spring事件驱动深度指南:从单机异步到亿级流量,比MQ更轻的架构神器
最近评论
obaby 发布于 23 小时前(09月25日) 中秋快乐
Huo 发布于 1 天前(09月25日) 中秋快乐哦
彬红茶 发布于 1 天前(09月25日) 前几天在班里电脑刷到了,节哀
彬红茶 发布于 1 天前(09月25日) 中秋安康!
不凡 发布于 2 天前(09月25日) 小学的时候是配了个助听器,它是带耳机线的,但是听不太清楚,就好比原本32bit的声音,戴了后变成了8...
标签聚合
数据库 日常 WordPress K8s SpringBoot MQ 分布式 JAVA AI编程 Claude MySQL AI 架构 IDEA SQL Spring 多线程 JVM Redis ElasticSearch
友情链接
  • 知向前端
  • 皮皮社
  • 老张博客
  • 蜗牛工作室
  • 搬砖日记
  • Honesty
  • 临窗旋墨
  • 瓦匠个人小站
  • 韩小韩博客
  • lijie blog
  • Mr.Sun的博客
  • 彬红茶日记
  • 哥斯拉
  • 韩情脉脉
  • Serendipity
  • 志文工作室
  • sssr7844的博客
  • 懋和道人
  • 林羽凡
  • 九仞之行

COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

lifengdi.com

Domain age badge for lifengdi.com

Theme Kratos-plus By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号