最近牛市来临,我负责的一个直播项目用户量暴涨,服务器负载也逐日升高到7。通过apache日志分析请求响应速度还是很快,apache进程数也保持在正常范围,但是cpu使用率比较高,通过strace命令只能看到加载了一些thinkphp框架的基类和函数库,没有其他异常,再查看io负载比较高,料想可能是1.thinkphp加载的文件比较多,io读取操作频繁。2.设备老化磁盘性能跟不上节奏了,于是安装xhprof分析一下程序代码。
sudo tar -zxvf xhprof-0.9.4.tgz
cd xhprof-0.9.4/extension
sudo /usr/bin/phpize
sudo ./configure --enable-xhprof --with-php-config=/usr/bin/php-config
sudo make
sudo make install
sudo vim /etc/php.d/xhprof.ini 加入extension=xhprof.so
sudo vim /etc/php.ini 加入
[xhprof]
xhprof.output_dir=/tmp/xhprof
重启apache
安装图形工具
sudo yum install -y graphviz
使用方法:
xhprof_enable(XHPROF_FLAGS_CPU+XHPROF_FLAGS_MEMORY);//加上这个参数可以使得xhprof显示cpu和内存相关的数据。
程序代码
$data = xhprof_disable();
//得到统计数据之后,以下的工作就是为页面显示做准备。
$xhprof_root = "/var/www/xhprof";//这里填写的就是你的xhprof的路径
include_once $xhprof_root."/xhprof_lib/utils/xhprof_lib.php";
include_once $xhprof_root."/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHprofRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "test");//第二个参数在接下来的地方作为命名空间一样的概念来使用
/**************************
访问<xhprof-ui-address>/index.php?run=$run_id&source=test就能够看到一个统计列表了。
1. <xhprof-ui-address>其实就是http://localhost/xhprof_html
2. 你会在/tmp里面找到一个类似这样的文件:50f7ed6689205.test.xhprof,第一个部分就是run_id,当然,程序里面的$run_id跟这个是一样的。
第二个部分的test就是你在save_run里面的第二个参数,第三个部分就是文件后缀不用去管
3. 例子中,要看到统计列表需要访问的地址就是http://localhost/xhpro_html/index.php?run=50f7ed6689205&source=test
**************************/
访问<xhprof-ui-address>/index.php?run=$run_id&source=test
可以看到框架加载的文件和调用的方法,图表会显示程序最耗时的调用路径。经过分析,框架大部分的时间都耗费在加载文件上面了,根据同事之前压测过thinkphp框架的经验,也发现在压力较大时cpu和io负载非常高,其他指标正常。于是申请横向扩容,新服务器上线后对比旧服务器发现同样的权重下,旧服务器负载任然高达2.5左右,而新服务器负载在不到0.1。于是分析对比一下新旧服务器磁盘性能。
用vmstat 0 100查看下系统负载,都未发现异常,于是压测下磁盘。
旧机器:
sudo dd if=/dev/cciss/c0d0p3 bs=1024 count=1000000 of=/home/qiang.deng/1Gb.file
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 29.9413 seconds, 34.2 MB/s
dd if=/home/qiang.deng/1Gb.file bs=64k | dd of=/dev/null
15625+0 records in
15625+0 records out
1024000000 bytes (1.0 GB) copied, 3.59115 seconds, 285 MB/s
2000000+0 records in
2000000+0 records out
1024000000 bytes (1.0 GB) copied, 3.59146 seconds, 285 MB/s
新机器:
sudo dd if=/dev/sdb bs=1024 count=1000000 of=/usr/home/qiang.deng/1Gb.file
1000000+0 records in
1000000+0 records out
1024000000 bytes (1.0 GB) copied, 5.26781 s, 194 MB/s
sudo dd if=/usr/home/qiang.deng/1Gb.file bs=64k | dd of=/dev/null
15625+0 records in
15625+0 records out
1024000000 bytes (1.0 GB) copied, 2.75348 s, 372 MB/s
2000000+0 records in
2000000+0 records out
1024000000 bytes (1.0 GB) copied, 2.75382 s, 372 MB/s
果然旧机器的磁盘性能较差,尤其是写入操作,可见在加载文件和生成各类日志的时候消耗了不少cpu性能。