性能瓶颈--CPU(使用率)

CPU使用率是最长见的CPU性能指标

CPU使用率

当使用top命令的时候,就会看到很多的CPU指标。

$ top
top - 19:16:40 up 21:00,  4 users,  load average: 0.00, 0.01, 0.05
Tasks: 178 total,   1 running, 177 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  3.0 sy,  0.0 ni, 97.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861512 total,  2438584 free,   197496 used,  1225432 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3331204 avail Mem 

这里介绍下命令输出的第三行。

  • user (缩写:us) ,表示用户态CPU时间,不包括nice时间,但包括了guest时间。
  • nice (缩写:ni),表示低优先级用户态的CPU时间,也就是进程的nice值为 1-19之间的CPU时间,nice的取之范围是 -20 -- 19,数值越大,优先级反而越大。
  • system(缩写:sys),表示内核态CPU。
  • idle(缩写:id),表示空闲时间,但是不包括等待I/O的时间(iowait)。
  • iowait(缩写:wa),表示等待I/O的时间。
  • irq(缩写:hi),表示处理硬中断的CPU时间。
  • softriq(缩写:si),表示处理软中断的CPU时间。
  • steal(缩写:st),表示当系统运行虚拟机的时候,被其他虚拟机占用的CPU时间。
  • guest(缩写:guest),表示通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的时间。
  • guest_nice(缩写:gnice),表示以底优先级运行虚拟机的时间。
    CPU的使用率计算方式不一样,事实上不同的性能工具都是通过取一段时间(比如3秒)的两次值,作差后,才计算出CPU使用率,这也是为什么不同的CPU性能工具的结果不太一样。

分析CPU使用率为什么高

可以直接定位的cpu使用率高的进程。

通过top,ps,pidstat 工具可以快速的找到CPU使用率高的进程,但是想知道占用CPU的到底是代码里的哪个函数呢。找到它,才能更高效的针对性优化。

perf

perf 是以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析制定的应用程序的性能问题。
使用perf分析CPU性能问题。

  • perf top
    他能够实时显示占用CPU时钟最多的函数或者指令,因此可以查找热点函数。
$ 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
...

第一行为采样数(Samples)、事件类型(event)和事件总数(Event Count)。
第二行的数据格式。

  1. OverHead 是该符号的性能事件在所有的采样中的比例,用百分比表示。
  2. Shared 是该函数或者指令所在的动态共享对象(Dynamic Shared Object),如内核,进程名,动态链接库,内核模块等。
  3. Object 是动态共享对象的类型。[.] 表示用户空间的可执行程序、或者动态链接库,而[k]表示的内核空间。
  4. Symbol 是符号名,也是就函数名,当函数名未知时,用16进制的地址来表示。
  • perf record 和 perf report
    perf top 虽然展示了系统的性能信息,但是缺点是不能保存下来进行分析。而perf record 就可以提供保存数据的功能,保存后的数据可以使用perf report解析并且展示。
实际案例

使用ab压测工具对phpweb站点进行压测。

ab -c 30 -n 10000 http://localhost:10000/
...
Total transferred:      1720000 bytes
HTML transferred:       90000 bytes
Requests per second:    14.40 [#/sec] (mean)
Time per request:       2083.193 [ms] (mean)
...

每秒的平均请求数只有14个。性能很差劲。
使用top命令查看,发现load很高,cpu的使用率也很高。前面的几个都是php-fpm进程,不用说了。是php-fpm 的问题了。

top - 01:19:26 up  2:06,  2 users,  load average: 3.85, 1.04, 0.42
Tasks: 185 total,   6 running, 179 sleeping,   0 stopped,   0 zombie
%Cpu(s): 97.0 us,  3.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3861520 total,  2303384 free,   253588 used,  1304548 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  3216488 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                  
 20864 bin       20   0  336684   9360   1680 R  43.8  0.2   0:19.38 php-fpm: pool www                                                        
 20862 bin       20   0  336684   9368   1688 R  37.5  0.2   0:19.96 php-fpm: pool www                                                        
 20863 bin       20   0  336684   9364   1684 R  37.5  0.2   0:19.65 php-fpm: pool www                                                        
 20866 bin       20   0  336684   9360   1680 R  37.5  0.2   0:19.89 php-fpm: pool www                                                        
 20865 bin       20   0  336684   9360   1680 R  31.2  0.2   0:20.25 php-fpm: pool www    

使用perf命令记录。

perf record -a -g -F 99 -p 21212
Warning:
PID/TID switch overriding SYSTEM^C[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.263 MB perf.data (2067 samples) ]

转成火焰图,然后打开看。


perf 火焰图

可以看到右上角。主要是在执行那两个函数。
原来性能问题就出在那两个函数上。

小结

CPU使用率是最直观和最常用的系统性能指标。

  • 用户CPU和Nice值高时,说明用户态进程占了较多的CPU,所以应该着重排查进程的性能问题。
  • 系统的CPU高,说明内核态占用的CPU多,应该着重查看内核线程或者系统调用的性能问题。
  • I/O 等待CPU高,说明等待I/O的时间比较长,所以应该着重查是不是出现了I/O问题。
  • 软中断和硬中断高,说明中断处理程序占用了较多的CPU,应该着重查看内核中的中断服务程序。

perf 的使用与动态追踪技术:
https://www.jianshu.com/p/3cdc0f05ac5d
动态追踪技术漫谈
http://www.brendangregg.com/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352