高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

使用strace定位性能问题

目录
  1. 1. 项目背景
  2. 2. 服务器配置
  3. 3. 压测结果
  4. 4. 使用strace定位问题

要给php的应用做性能测试,
对php不熟,问题定位的时候很惆怅,
不知道有什么好用php分析工具(类似jvm的jprofile jconsole jstack)。
还好有万能函数调用工具:strace和ltrace。
(1) strace —— Trace system calls and signals (跟踪一个进程的系统调用或信号产生的情况)
(2) ltrace —— A library call tracer (跟踪进程调用库函数的情况)

项目背景

目标站点xxx.xxx.com访问量稍高就会出现无法打开的现象。

服务器配置

虚拟机:4核CPU+7G内存
php版本:php-5.4.41

压测结果

20用户并发(带思考时间)
响应时间不高,单是cpu和负载已经彪到很高了,cpu >90%,负载>11。
Alt text

数据库基本无负载,说明压力没到数据库,都在应用上面。
可想而知,如果50个、100个用户访问操作,会崩到什么样子。

使用strace定位问题

  1. 找到cpu占用最高的进程

    top
    top -Hp pid

  1. strace -cp [pid] ,查看cpu占用最频繁的调用情况(图中的pid跟上图的没关系,运行了两次,这是第二次的pid)
    Alt text

可以看到read和lseek调用占用80%以上的cpu。

  1. strace -o output.txt -T -tt -e trace=all -p [pid]
    查看具体调用
    Alt text

定位到文件操作上面有瓶颈,直接缩小了范围。