Linux 性能优化实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
87256 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
结束语 (1讲)
Linux 性能优化实战
15
15
1.0x
00:00/00:00
登录|注册

05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?

思考在发现 CPU 使用率升高时的分析方法
思考 CPU 使用率的含义
使用 perf 分析引发性能问题的函数
通过 top 和 pidstat 分析 CPU 使用率
perf record 和 perf report
perf top
使用 perf 工具进行性能分析
pidstat
ps
top
user、nice、system、iowait、irq、softirq、steal 等指标的含义
CPU 使用率的计算公式
/proc/stat 提供系统的 CPU 和任务统计信息
以百分比的方式展示
单位时间内 CPU 使用情况的统计
思考
案例分析
CPU 使用率过高的处理方法
如何查看 CPU 使用率
CPU 使用率的不同场景
CPU 使用率的计算方法
CPU 使用率的含义
CPU 使用率

该思维导图由 AI 生成,仅供参考

你好,我是倪朋飞。
通过前两节对平均负载和 CPU 上下文切换的学习,我相信你对 CPU 的性能已经有了初步了解。不过我还是想问一下,在学这个专栏前,你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平均负载,也不是 CPU 上下文切换,而是另一个更直观的指标—— CPU 使用率。
我们前面说过,CPU 使用率是单位时间内 CPU 使用情况的统计,以百分比的方式展示。那么,作为最常用也是最熟悉的 CPU 指标,你能说出 CPU 使用率到底是怎么算出来的吗?再有,诸如 top、ps 之类的性能工具展示的 %user、%nice、 %system、%iowait 、%steal 等等,你又能弄清楚它们之间的不同吗?
今天我就带你了解 CPU 使用率的内容,同时,我也会以我们最常用的反向代理服务器 Nginx 为例,带你在一步步操作和分析中深入理解。

CPU 使用率

在上一期我曾提到,Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。
为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了处理CPU使用率达到100%的问题。首先,解释了CPU使用率的计算方法和各种指标的含义,以及如何查看CPU使用率,包括使用top和ps等性能分析工具。其次,介绍了对比分析时需要注意间隔时间的设置,以及如何使用性能分析工具来计算CPU使用率。文章还介绍了如何使用perf工具来分析CPU性能问题,包括使用perf top实时显示占用CPU时钟最多的函数或指令,以及使用perf record和perf report保存和解析数据。通过一个Nginx + PHP的Web服务案例,演示了如何使用top等工具找出异常的进程,以及如何利用perf找出引发性能问题的函数。总结了CPU使用率的含义和排查方法,以及邀请读者分享交流经验。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Linux 性能优化实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(304)

  • 最新
  • 精选
  • D白菜
    Day 5,干活满满啊,谢谢老师啊。 今天总结如下: 1、Linux并发(任务并行)的实质:Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用 2、cpu的维护,通过实先定义的节拍率(内核用赫兹HZ标示)触发时间判断(全局变量jiffies记录)。 3、节拍率是内核态运行,属于内核空间节拍率;用户空间节拍率( USER_HZ)是一个固定设置 [root@dbayang ~]# grep 'CONFIG_HZ=' /boot/config-$(uname -r) CONFIG_HZ=1000 4、/proc/stat 提供的就是系统的 CPU 和任务统计信息; /proc/[pid]/stat展示进程的CPU和任务统计信息 5、cpu的使用率={1-(idle_time/total_cpu_time)}/sample_time 6、性能分析工具给出的都是间隔一段时间的平均 CPU 使用率,所以要注意间隔时间的设置。top默认为3s,ps使用的是进程运行时间。 7、top、vmstat、mpstat等命令种关于cpu性能相关指标的含义 8、pidstat命令含义 9、perf 以前用到的一堆[n]trace分析工具,perf的直观易用,这是今天最大的收获,作为dba对数据库的分析也很有的,么么哒。 perf top、perf record、perf report 对进程进行跟踪分析其调用perf top -g -p <mysqlpid> 10、今天用到测试工具:ab

    作者回复: 👍 课代表的总结很全面

    2018-11-30
    95
  • 樊海涛
    执行perf top -g -p (php-fpm进程号),发现不了sqrt函数

    作者回复: 只看到地址而不是函数名是由于应用程序运行在容器中,它的依赖也都在容器内部,故而perf无法找到PHP符号表。一个简单的解决方法是使用perf record生成perf.data拷贝到容器内部 perf report。

    2018-12-02
    4
    27
  • dexter
    每天上班地铁听一遍,下班地铁听一遍,晚上做实验

    作者回复: 👍

    2018-12-01
    2
    20
  • ichen
    内核如果没有perf package的话,可以从git下载源码安装 https://askubuntu.com/questions/50145/how-to-install-perf-monitoring-tool/306683 git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git (大约2.5G 左右) cd linux/tools/perf make (可能缺flex,bison等,需自行安装) cp perf /usr/bin perf --version

    作者回复: 感谢分享

    2018-12-01
    2
    17
  • 郭江伟
    用sysbench测试cpu性能,然后利用perf 找到具体哪个进程的哪个函数在消耗CPU gjw@gjw:/etc/apt$ sysbench --threads=1 --time=600 cpu run sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3) Running the test with following options: Number of threads: 1 Initializing random number generator from current time Prime numbers limit: 10000 Initializing worker threads... Threads started! 查看sysbench进程 ps -egjw@gjw:~$ ps -ef | grep sysbench gjw 31921 1294 77 11:20 pts/0 00:04:39 sysbench --threads=1 --time=600 cpu run perf top获取进程信息: sudo perf top -g -p 31921 Samples: 824 of event 'cycles:ppp', Event count (approx.): 618842235 Children Self Shared Object Symbol + 100.00% 100.00% sysbench [.] cpu_execute_event 然后在sysbench源码中查看cpu_execute_event 函数: gjw@gjw:~/soft/sysbench-master$ grep -r cpu_execute_event Binary file src/tests/cpu/libsbcpu.a matches Binary file src/tests/cpu/libsbcpu_a-sb_cpu.o matches src/tests/cpu/sb_cpu.c:static int cpu_execute_event(sb_event_t *, int); src/tests/cpu/sb_cpu.c: .execute_event = cpu_execute_event, src/tests/cpu/sb_cpu.c:int cpu_execute_event(sb_event_t *r, int thread_id) Binary file src/sysbench matches gjw@gjw:~/soft/sysbench-master$ vi src/tests/cpu/sb_cpu.c int cpu_execute_event(sb_event_t *r, int thread_id) { unsigned long long c; unsigned long long l; double t; unsigned long long n=0; (void)thread_id; /* unused */ (void)r; /* unused */ /* So far we're using very simple test prime number tests in 64bit */ for(c=3; c < max_prime; c++) { t = sqrt((double)c); for(l = 2; l <= t; l++) if (c % l == 0) break; if (l > t ) n++; } return 0; 可以看到该函数在计算素数,由此完成了一个cpu使用率很高的案例分析

    作者回复: 很详细的分析步骤,感谢分享👍

    2018-12-02
    3
    16
  • 处理CPU高的流程如下(大数据,基本都是jvm): 通过top查看cpu使用率比较高的进程 pid top -H $pid 造成cpu使用率的线程 tid (top第一列,列明还是PID) printf 0x%x $tid 获得16进制的tid jstack $pid 查找 nid=16进制tid,相应线程的就找到了 PS:现在大多是docker 环境,在宿主机无法直接通过jstack获取到容器内的jvm 线程信息,可以进入容器再jstack 或者在宿主机上使用jdk 10;容器内无法使用jtack 之类命令,那么需要添加容器参数 privileged

    作者回复: 谢谢分享,Java专家呀😊

    2018-12-14
    3
    15
  • 风清扬笑
    cpu使用率,就是cpu被使用的比例,也就是空闲之外的使用比例。 对我来说,发现cpu使用率高后,先跟老师一样用perf来抓取cpu消耗栈,很容易发现瓶颈。 另外,我一般用mpstat -P ALL 来看各个cpu核心的使用率情况,因为top之类的看的是系统总使用率,不一定能发现问题,特别是多进程或者多线程应用

    作者回复: 👍

    2018-11-30
    3
    14
  • 我来也
    [D5打卡] 以前只会用top看CPU使用率,发现占用高的进程了再针对性的分析,比如c程序就用prof,局限性很高, 今天了解到可以用perf,直接看进程内函数调用栈和各函数的cpu使用率。 以前看到%sys过高,系统中断数过高的判断方法更搞笑,挨个杀可疑进程。 现在直接用pidstat就是了。 —————— 最近在某云服务器上就遇到了诡异的事情,cpu空闲75%,%iowait不到1,系统中断数一直比较稳定,vmstat中的r正在运行和等待队列也还正常,但是系统每隔1小时23分,负载load1:就会从平常的0.2升高到8甚至是12的情况。好在每次持续时间较短,约2分钟,load5的值还可以接受。 争取最近能把原因查出来,早点把学费赚回来,哈哈😄 ————— 虽然之前学k8s专栏时ubuntu 18.04 和docker都配好了,但是最近手上事情有点多,还是先解决手上的事情吧。老师见谅哈。

    作者回复: 很多线上问题其实跟这个类似,等到你登陆服务器的时候性能问题已经结束了,这样在线分析就看不出哪里导致的问题,只有从平均负载这种反应历史的指标看出一些问题。 这种情景下,就需要监控系统的配合,记录下历史的系统和进程的性能指标。并且,这个case只有load1高,所以监控的间隔时间也需要比较精细。

    2018-11-30
    8
  • 大头
    总结一下docker运行的步骤吧,我的是Centos系统: 1 安装docker,yum -y install docker-io。确保系统内核为3.10.0及以上。低版本的需要升级内核或者使用高版本的CentOs系统 2 启动docker systemctl start docker.service 3 下载课件上提供的源码,进入到源码目录。执行make build && make run

    作者回复: 谢谢分享。其他发行版安装 Docker 的步骤可以参考官方文档 https://docs.docker.com/install/

    2019-06-27
    6
  • 沙漠风暴
    老师,弱弱的请教下怎么用docker安装您那个nginx和php环境和程序,我以前没用过docker,刚学的,见谅。

    作者回复: 按照文中的步骤操作就可以

    2019-02-09
    3
    5
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部