首页 » Web前端 » php554技巧_若何运用perf top商量机能

php554技巧_若何运用perf top商量机能

访客 2024-12-09 0

扫一扫用手机浏览

文章目录 [+]

Linux2.6及后续版本都自带该工具,它险些能够处理所有与性能干系的事宜。
perf top常用于展示占用CPU最多的函数或者指令,一样平常程序员们以此查找热点函数。

实战

php554技巧_若何运用perf top商量机能

root@xxxx:~# apt install linux-tools-commonroot@xxxx:~# perf topSamples: 6K of event 'cycles', 4000 Hz, Event count (approx.): 48144737 lost: 0/0 drop: 0/0Overhead Shared Object Symbol3.84% [kernel] [k] native_write_msr2.25% [kernel] [k] update_blocked_averages1.89% [kernel] [k] update_sd_lb_stats.constprop.01.80% [kernel] [k] pvclock_clocksource_read

php554技巧_若何运用perf top商量机能
(图片来自网络侵删)
Samples : 采样数, perf统共采集了6K个CPU时钟事宜。
event : 事宜类型。
Event count (approx.) : 事宜总数量。

行列:

Overhead: 是该符号的性能事宜在所有采样中的比例,用百分最近表示。
Shared: Shared,是该函数或指令所在的动态共享工具(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
Object: Object,是动态共享工具的类型。
比如 [.] 表示用户空间的可实行程序、或者动态链接库,而 [k] 则表示内核空间。
Symbol: Symbol是符号名,也是函数名。
当函数名未知时,用十六进制的地址来表示。

上面结果显示内核模块中native_write_msr占用CPU时钟最多,比例占3.84%。

同样可以利用perf record与perf report进行定时采集再展示。
加上-g参数,开启调用关系的采样,方便我们根据调用链来剖析性能问题。

root@xxxx:~# perf record^C //(结束采集)[ perf record: Woken up 1 times to write data ][ perf record: Captured and wrote 0.967 MB perf.data (739 samples) ]root@xxxx:~# perf reportSamples: 739 of event 'cycles', Event count (approx.): 22853303Overhead Command Shared Object Symbol4.38% swapper [kernel.kallsyms] [k] native_write_msr4.04% swapper [kernel.kallsyms] [k] native_safe_halt3.26% swapper [kernel.kallsyms] [k] update_blocked_averages2.63% swapper [kernel.kallsyms] [k] pvclock_clocksource_read2.07% swapper [kernel.kallsyms] [k] update_sd_lb_stats.constprop.01.94% swapper [kernel.kallsyms] [k] rcu_cblist_dequeue1.79% swapper [kernel.kallsyms] [k] _raw_spin_lock_irqsave1.76% swapper [kernel.kallsyms] [k] ktime_get

利用 Nginx PHP做演示

root@xxxx:~# docker run --name nginx -p 10000:80 -itd feisky/nginxroot@xxxx:~# docker run --privileged --name phpfpm -itd --network container:nginx feisky/php-fpmroot@xxxx:~# curl http://localhost:10000/It works!

接着,我们来测试一下这个Nginx做事的性能。
在第二个终端运行下面的ab命令:

root@xxxx:~# ab -c 10 -n 100 http://localhost:10000/This is ApacheBench, Version 2.3 <$Revision: 1843412 $>Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking localhost (be patient).....doneServer Software: nginx/1.15.4Server Hostname: localhostServer Port: 10000Document Path: /Document Length: 9 bytesConcurrency Level: 10Time taken for tests: 1.188 secondsComplete requests: 100Failed requests: 0Total transferred: 17200 bytesHTML transferred: 900 bytesRequests per second: 84.14 [#/sec] (mean)Time per request: 118.849 [ms] (mean)Time per request: 11.885 [ms] (mean, across all concurrent requests)Transfer rate: 14.13 [Kbytes/sec] received

从ab的输出结果我们可以看到,Nginx能承受的每秒均匀要求数只有84.14。

连续在第二个终端,运行ab命令:

root@xxxx:~# ab -c 10 -n 10000 http://localhost:10000/

接着,回到第一个终端利用docker exec指令进入容器,然后运行top命令,并按下数字1,切换到每个CPU的利用率:

top - 17:50:45 up 21:25, 3 users, load average: 1.11, 0.27, 0.12Tasks: 243 total, 6 running, 237 sleeping, 0 stopped, 0 zombie%Cpu0 : 98.0 us, 1.7 sy, 0.0 ni, 0.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu1 : 98.7 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu2 : 99.0 us, 0.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st%Cpu3 : 99.0 us, 1.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stMiB Mem : 7961.2 total, 4756.2 free, 993.1 used, 2211.9 buff/cacheMiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 6669.1 avail Mem// 在容器内部topKiB Swap: 2097148 total, 2097148 free, 0 used. 6706484 avail MemUnknown command - try 'h' for helpPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND552 daemon 20 0 336700 15420 7744 R 93.3 0.2 0:04.42 php-fpm553 daemon 20 0 336700 15420 7744 R 86.7 0.2 0:04.14 php-fpm555 daemon 20 0 336700 15420 7744 R 86.7 0.2 0:03.55 php-fpm551 daemon 20 0 336700 15420 7744 R 53.3 0.2 0:03.78 php-fpm554 daemon 20 0 336700 15420 7744 R 46.7 0.2 0:04.51 php-fpm1 root 20 0 336316 47672 40276 S 0.0 0.6 0:00.31 php-fpm7 root 20 0 18196 3416 2872 S 0.0 0.0 0:00.00 bash556 root 20 0 43152 3260 2768 R 0.0 0.0 0:00.00 top

这里可以看到,系统中有几个php-fpm进程的CPU利用率加起来靠近400%;而每个CPU的用户利用率(us)也已经超过了98%,已经靠近饱和。
这样我们就可以确认,正是用户空间的php-fpm进程,导致CPU利用率骤升。
那么若何可以知道是php-fpm 的哪个函数导致了CPU利用率升高呢?我们来用perf剖析一下。

root@xxxx:~# docker exec -i -t phpfpm bash // 进入容器//容器内部root@xxxx:~# apt-get update && apt-get install -y linux-perf linux-tools procpsroot@xxxx:~# perf top -g -p 555

按方向键切换到php-fpm,再按下回车键展开php-fpm的调用关系,你会创造调用关系终极到了sqrt 和add_function。
看来,我们须要从这两个函数入手了。

我们拷贝出Nginx运用的源码,看看是否调用了这两个函数:

//从容器phpfpm中将PHP源码拷贝出来root@xxxx:~# docker cp phpfpm:/app .//利用grep查找函数调用root@xxxx:~# grep sqrt -r app/app/index.php: $x += sqrt($x);root@xxxxx:~# cat app/index.php<?php// test only.$x = 0.0001;for ($i = 0; $i <= 1000000; $i++) { $x += sqrt($x);}echo "It works!"?>root

可以看得出这段测试代码导致运行速率变慢。

# 停滞原来的运用root@xxxx:~# docker rm -f nginx phpfpm# 运行优化后的运用root@xxxx:~# docker run --name nginx -p 10000:80 -itd feisky/nginx:cpu-fixroot@xxxx:~# docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:cpu-fix

删除测试代码后再次编译运行。

$ ab -c 10 -n 10000 http://localhost:10000/...Complete requests: 10000Failed requests: 0Non-2xx responses: 10000Total transferred: 3030000 bytesHTML transferred: 1530000 bytesRequests per second: 12273.25 [#/sec] (mean)Time per request: 0.815 [ms] (mean)Time per request: 0.081 [ms] (mean, across all concurrent requests)Transfer rate: 3631.64 [Kbytes/sec] received...

从这里你可以创造,现在每秒的均匀要求数,已经从原来的84.14变成了12273.25。

用户CPU 和Nice CPU高,解释用户态进程占用了较多的CPU,以是该当着重排查进程的性能问题。
系统CPU高,解释内核态占用了较多的CPU,以是该当着重排查内核线程或者系统调用的性能问题。
I/O等待CPU高,解释等待I/O的韶光比较长,以是该当着重排查系统存储是不是涌现了I/O问题。
软中断和硬中断高,解释软中断或硬中断的处理程序占用了较多的CPU,以是该当着重排查内核中的中断做事程序。

结束语

如果碰到CPU利用率升高的问题,你可以借助top、pidstat等工具,确认引发 CPU 性能问题的来源,其次利用perf等工具,排查出引起性能问题的详细函数。

以上便是本期如何利用perf top探究性能的全部内容,下一期将给大家献上《带着dd去探索Linux磁盘IO》,敬请期待~

标签:

相关文章

php表单input技巧_PHP 表单和用户输入

PHP 表单处理有一点很主要的事情值得把稳,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元素自动变成可供 P...

Web前端 2024-12-11 阅读0 评论0

进修php反射技巧_php反射机制用法详解

面向工具编程中工具被授予了自省的能力,而这个自省的过程便是反射。反射,直不雅观理解便是根据到达地找到出发地和来源。比如,一个光秃秃...

Web前端 2024-12-11 阅读0 评论0