系统性能之cpu 篇

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统性能之cpu 篇相关的知识,希望对你有一定的参考价值。

cpu使用率是单位时间内cpu使用情况的统计,以百分比方式展示。

1.工具分析cpu使用率高

1.1 top  

top显示系统总体cpu和内存使用情况,以及各个进程资源使用情况。第三行 %Cpu 就是系统的 CPU 使用率,top 默认显示的是所有 CPU 的平均值,这个时候你只需要按下数字 1 ,就可以切换到每个 CPU 的使用率。

默认每3秒刷新一次
$ top
top - 11:58:59 up 9 days, 22:47, 1 user, load average: 0.03, 0.02, 0.00
Tasks: 123 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8169348 total, 5606884 free, 334640 used, 2227824 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 7497908 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 78088 9288 6696 S 0.0 0.1 0:16.83 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
...

1.2 pidstat  

用来专门分析进程的cpu使用率。用户态 CPU 使用率 (%usr);内核态 CPU 使用率(%system);运行虚拟机 CPU 使用率(%guest);等待 CPU 使用率(%wait);以及总的 CPU 使用率(%CPU); Command 为具体哪个进程。

每隔1秒输出一组数据,共输出5组
$ pidstat 1 5
15:56:02 UID PID %usr %system %guest %wait %CPU CPU Command
15:56:03 0 15006 0.00 0.99 0.00 0.00 0.99 1 dockerd
...
Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 15006 0.00 0.99 0.00 0.00 0.99 - dockerd

1.3 perf

perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数。

​输出结果中,第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。比如这个例子中,perf 总共采集了 833 个 CPU 时钟事件,而总事件数则为 97742399。

$ perf top
Samples: 833 of event cpu-clock, Event count (approx.): 97742399
Overhead Shared Object Symbol
7.28% perf [.] 0x00000000001f78a4
4.72% [kernel] [k] vsnprintf
4.32% [kernel] [k] module_get_kallsym
3.65% [kernel] [k] _raw_spin_unlock_irqrestore
...
  • 第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
  • 第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
  • 第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
  • 最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示

2.案例分析占用cpu高的应用

案例架构:

系统性能之cpu

vm1用来模拟性能问题,web客户端用来给web服务增加压力。

vm1 运行启动服务

$ docker run --name nginx -p 10000:80 -itd feisky/nginx
$ docker run --name phpfpm -itd --network container:nginx feisky/php-fpm

vm2 curl 访问。 

#curl ​​http://192.168.1.250:10000/​​
It works!

vm2 用ab模拟并发并发,看看应用服务的性能如何?nginx 承受每秒平均请求数只有15.81。

#并发10个请求测试nginx性能,共测试100个请求
#ab -c 10 -n 10000 ​http://192.168.1.250:10000/​
Requests per second: 15.81 [#/sec] (mean)

vm1 上运行top命令,查看cpu使用情况。 php-fpm 进程使用率加起来将近200%,用户态使用率超过了98%,接近饱和。可以确认的就是用户空间的php-fpm进程造成的。

$ top
...
%Cpu0 : 98.7 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 99.3 us, 0.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
...
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21514 daemon 20 0 336696 16384 8712 R 41.9 0.2 0:06.00 php-fpm
21513 daemon 20 0 336696 13244 5572 R 40.2 0.2 0:06.08 php-fpm
21515 daemon 20 0 336696 16384 8712 R 40.2 0.2 0:05.67 php-fpm
21512 daemon 20 0 336696 13244 5572 R 39.9 0.2 0:05.87 php-fpm
21516 daemon 20 0 336696 16384 8712 R 35.9 0.2 0:05.61 php-fpm

在vm1上执行perf 分析具体是由哪个函数造成的.

-g开启调用关系分析,-p指定php-fpm的进程号21515
$ perf report -g -p 21515

执行命令后在服务器当前目录生成perf.data文件,然后# docker cp perf.data phpfpm:/tmp 拷贝到容器目录下,最后# cd  /tmp && apt-get update && apt-get install -y linux-perf linux-tools procps , # perf_4.9 report

系统性能之cpu

分析函数

从容器phpfpm中将PHP源码拷贝出来
$ docker cp phpfpm:/app .
使用grep查找函数调用
$ grep sqrt -r app/ #找到了sqrt调用
app/index.php: $x += sqrt($x);
$ grep add_function -r app/ #没找到add_function调用,这其实是PHP内置函数

打开文件源码分析。 发现是测试代码没删除直接发布,循环100万次循环加,删除这块内容解决了问题。

$ cat app/index.php
<?php
// test only.
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++)
$x += sqrt($x);

echo "It works!"

3.定位占用cpu高的应用案例




以上是关于系统性能之cpu 篇的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统和性能监控之CPU篇

系统性能之cpu 篇

系统性能之cpu 篇

linux 性能优化之CPU性能

linux 性能优化之CPU性能

系统性能之cpu 篇