05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
该思维导图由 AI 生成,仅供参考
CPU 使用率
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了处理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-3095 - 樊海涛执行perf top -g -p (php-fpm进程号),发现不了sqrt函数
作者回复: 只看到地址而不是函数名是由于应用程序运行在容器中,它的依赖也都在容器内部,故而perf无法找到PHP符号表。一个简单的解决方法是使用perf record生成perf.data拷贝到容器内部 perf report。
2018-12-02427 - dexter每天上班地铁听一遍,下班地铁听一遍,晚上做实验
作者回复: 👍
2018-12-01220 - 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-01217 - 郭江伟用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-02316 - 鹏处理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-14315 - 风清扬笑cpu使用率,就是cpu被使用的比例,也就是空闲之外的使用比例。 对我来说,发现cpu使用率高后,先跟老师一样用perf来抓取cpu消耗栈,很容易发现瓶颈。 另外,我一般用mpstat -P ALL 来看各个cpu核心的使用率情况,因为top之类的看的是系统总使用率,不一定能发现问题,特别是多进程或者多线程应用
作者回复: 👍
2018-11-30314 - 我来也[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-308 - 大头总结一下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-276 - 沙漠风暴老师,弱弱的请教下怎么用docker安装您那个nginx和php环境和程序,我以前没用过docker,刚学的,见谅。
作者回复: 按照文中的步骤操作就可以
2019-02-0935