当前位置:首页 > 技术分享 > 正文内容

Linux 中借助 perf 对 php 程序CPU 100% 定位问题函数

admin3个月前 (12-12)技术分享900

通过使用相关工具找出CPU使用率高的进程之后,我们需要知道这个进程中的哪个函数占用了过高的CPU,然后才能更高效、更有针对性的进行优化。

下面主要介绍一款相关的分析工具perf.

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

perf每隔一个固定的时间,就在CPU上(每个核上都有)产生一个中断,在中断上看看,当前是哪个pid,哪个函数,然后给对应的pid和函数加一个统计值,这样,我们就知道CPU有百分几的时间在某个pid,或者某个函数上了。

预先安装 sysstatperfab 等工具

[root@www ~]# yum install httpd-tools perf sysstat -y
Package httpd-tools-2.4.6-93.el7.centos.x86_64 already installed and latest version
Package perf-3.10.0-1127.13.1.el7.x86_64 already installed and latest version
Package sysstat-10.1.5-19.el7.x86_64 already installed and latest version


EAD785BD-CBC7-4F09-B62E-2BCF52185B64.png

我们主要使用perf一下命令:

# 实时显示占用CPU时间最多的函数或指令及调用关系
$ perf top -g


由于perf top不能保存数据,不能用于离线后者后续的分析,perf提供了另外两个命令:

perf record: 记录系统的性能信息,退出后,将数据保存在执行命令的当前文件夹的perf.data文件中
perf report: 展示perf record命令记录的数据

2B40221B-B8F2-42A3-A287-446E03524495.png

 

字段说明:

symbol: 符号名,也就是函数名,当函数名未知时,使用16进制地址表示
Children: 表示该符号名下调用函数性能事件在所有采样中的比例
我们主要关注上述的两个指标,找出占比最高的行,即可确定CPU占用最高的函数,然后就可以去应用程序源码中寻找,然后进行相关优化。

我们在Nginx服务器使用perf命令查找php-fpm进程中,占用CPU最多的函数

$ sudo perf top -g

0BABD74B-710A-4EA4-9BC4-4918680EA6AB.png

怎么知道是php-fpm的哪个函数导致了 CPU使用率升高呢?我们来用perf分析 一下。在第一个终端运行下面的perf命令:

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

[root@localhost ~]# perf top -g -p 21515

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


根据输出结果,我们发现没有发现相关的函数名,只有16进制的地址。这是因为perf无法找到待分析进程所依赖的库,所有的依赖库都在docker容器中,为了方便起见,我们可以在容器外面保存下相关数据(perf.data),再拷贝到容器中查看结果。

# 记录分析数据, 15秒后,使用CTRL + C结束记录
$ sudo perf record -g

# 将perf.data拷贝到容器中
$ sudo docker cp ./perf.data phpfpm:/tmp/
# 进入docker容器中
$ sudo docker exec -it phpfmp bash
# 在容器中安装perf
$  cd /tmp/
$  apt-get update && apt-get install -y linux-perf linux-tools procps
# 查看perf.data数据
$ perf_4.9 report

0A25C3B1-2186-4800-9B56-88612D4ED350.png


可以发现是sqrt函数占用的CPU最多, 所以在源码中查找sqrt函数

$ cd linux-perf-examples/nginx-high-cpu/

$ grep sqrt -r app


发现sqrt函数在index.php文件中,然后进入index.php文件, 发现测试代码没有删除就直接发布了,这可能就是引起问题的原因,删除多余的代码。

$ vim index.php
<?php
// test only.
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
  $x += sqrt($x);
}
echo "It works!"
?>


扫描二维码推送至手机访问。

版权声明:本文由小刚刚技术博客发布,如需转载请注明出处。

本文链接:https://blog.bitefu.net/post/568.html

标签: php
分享给朋友:

相关文章

php-cgi占用太多cpu资源而导致服务器响应过慢 利用进程和Linux的proc 定位耗资源文件

php-cgi占用太多cpu资源而导致服务器响应过慢 利用进程和Linux的proc 定位耗资源文件

在此环境下,一般php-cgi运行是非常稳定的,但也遇到过php-cgi占用太多cpu资源而导致服务器响应过慢,我所遇到的php-cgi进程占用cpu资源过多的原因有: 1. 一些php的扩展与php版本兼容存在问题,实践证明 e...

360浏览器如何禁止切换到兼容模式[本地终极办法]

360浏览器如何禁止切换到兼容模式[本地终极办法]

浏览器内核控制标签meta说明背景介绍由于众所周知的原因,国内的主流浏览器都是双核浏览器:基于Webkit的内核用于常用网站的高速浏览,基于IE的内核主要用于部分网银、政府、办公系统等网站的正常使用。以360浏览器为例,我们优先通过Webk...

[教程] WTG备份新方法——FFU镜像格式

[教程] WTG备份新方法——FFU镜像格式

FFU(Full Flash Update) 格式是一种基于扇区的磁盘镜像文件格式,默认使用快速哈夫曼压缩(Xpress-Huffman)算法压缩,在捕获和部署时会生成哈希表进行校验,并可以使用DISM修改捕获的镜像。FFU格式很适合WTG...

微软版Ghost Win10:FFU映像备份和还原

微软版Ghost Win10:FFU映像备份和还原

在日常的维护中,系统的备份和还原是大家经常需要操作的事情。虽然Windows 10已经提供很多的工具,如系统还原、WIM备份/还原,VHD备份等。不过这些工具大多是基于文件的备份/还原。我们以前经常的使用的Ghost则是基于扇区的备份/还原...

php Aes 加密模式ECB填充pkcs5padding base64

最近做支付项目用到了aes加密不过试了好多办法总是和官方给出的结果不一样,找了很久终于找到了测试结果同 http://tool.chacuo.net/cryptaes/ <?php /**  * [Aes&nb...

用apicloud 免费,简单封装一个wap手机网站成android app

用apicloud 免费,简单封装一个wap手机网站成android app

APICloud是国内较早布局低代码开发的平台之一,其发布的低代码效率工具Plus Mode,为IT项目中每个角色提供专业工具,将需求分析、产品原型、UI设计、前端开发、后端开发紧密衔接,并基于行业大数据对前置环节进行复用,最终缩减大量重复...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。