故事起因

本故事根据真实故事书写,如有雷同绝非巧合。在开发过程中难免反复修改程序,面对突然起来的问题难免束手无策,有些人选择自我处理问题,也有人选择交流区域咨询,或许恰巧有人有类似的问题,刚好可以解决你的问题,但是如果你的问题恰好有些独特,最后还是需要自己谷歌百度,大海捞针似的搜寻。

一套几年前的程序,现在急需大范围使用起来,优化了一些细节,由于业务的转型,全线使用php快速解决方案,于是乎就没有测试其他问题匆忙上线了。

初入江湖下山历练

去年上线,上线肯定难以避免很多细节问题,优化优化,最大的优化就是布局模式增加,常见的企业网站布局方式难免那么几种,于是在总结常见情况的基础下开始了布局设计。大致分析为如下草图。



首页布局模式比起之前的要多一些,全部模块容器是自适应的,无内容的情况下自动收缩。left与right默认情况下保留一种,按钮提示网站编辑人员自动激活。

无统一心法几乎走火入魔

开发过程中必须要有一套统一的规范,但常常有这样的情况,第一规范运行后有一批产出的时候,优化细节后又上了第二规范,初入江湖的时候已经是正式大范围使用的第三次规范了,也就是说之前有异议。这个只是说在使用过程中如果遇见之前版本的,重新按照新的规范优化上线,对于没有使用到的暂时就保持原型。

平静中暗藏杀机

渐渐的布局的问题趋于平静,伴随着这种平静迎来的一个新的难题,服务器CPU飙高,卡死。

这个是我今天主要分享的故事,公司由于自身条件的问题,一直使用的windows+iis+mysql+php(asp),在win上使用iis运行php,使用过这样生产环境的应该知道上面的各种问题,但是实际问题还是实际问题,改变不了只能按照这种环境来做适应。其他问题暂且不描述了,说来就话长了。

除了服务器的原因,肯定的还是程序有问题了。

潜心修炼 问题分析

  1. 首页布局复杂化加载引起?

    访问模式与编辑模式同时操作首页,首页也是动态读取,解决方案就是静态化首页,服务器环境设置文档类型优先级index.html高于index.php,这样一来就需要第一次自动生成,后续主动生成。这个过程也伴随着很多问题,编辑时自己遗忘了生成,产生出的问题就是我添加了资料为何界面没有任何变化?这个只是一个习惯问题,渐渐的就好了,但是问题还是存在,只是感觉好了一些许。

  2. 首页布局程序优化?

    大部分时间是在操作资料添加,首页布局拖动,首页布局拖动保存的时候页面会刷新一次,加载一次页面本身占用很高的CPU,开发环境下连续多次刷新的后果就是卡死,还不用说服务器环境下。于是想到的是把布局拖动完成后的那一次刷新给取消掉,通过ajax的方式插入内容,但是实际的开发过程中由于程序本身的问题,修改了一些程序,眼看着就能成功的时候遇见了一些小问题,数据不能与结构关联起来,正准备深入研究怎么解决的时候,找寻了一些程序分析优化工具,前面的工作就放弃了,开始给程序做一个整体的诊断。

  3. 工具的选择

    之前还没有这么细致的优化过程序,完全不知道如何开始下手。在 @luofei614 的建议下推荐我试试xdebug,xhprof,使用就是oneApm,其中oneApm简单很多,搜索了一下发现是蓝海讯通的项目,这里好像有一个认识的人 @互联网fans ,他们的态度的确不错,只是我只是抱着试试的心态注册使用了,很是挺不错的,但是只有linux的,在win上的方案没有,下了key下来也没有使用,第二天客服竟然通过我留下的电话联系了我,咨询相关情况,还好没有留下企业名称要不就暴露了。态度不错,但是肯定是有原因的…

    无奈下一个工具,之前其实就了解过这些工具,但是一直没有落实过使用方法,这次是被逼无奈的。尝试了使用xedebug,安装过程什么都还是比较愉快,但是就是扩展始终加载不起。在官网文档上找到了问题的原因:

    Xdebug does not work together with the Zend Optimizer or any other extension that deals with PHP's internals (DBG, APD, ioncube etc). This is due to compatibility problems with those modules.

    由于zend的原因暂时就放弃了xdebug,转为尝试xhprof,这时又发现了一个新的问题,在windows上xhprof的php的版本是5.3+,生产环境的php的版本是5.2.17,按理说应该可以编译一个适合5.2的xhprof,不会这个也就无奈了。本地开发中我切换到了5.3,愉快的运行了,替换掉了核心加密文件,分析过程也就即将开始了。

  4. 正式开始检查优化工作

    一个好的工具往往是解决问题的关键方案,知道根本原因,然后对症下药。安装好了xhprof,检测了一下程序现在的运行情况





    从图中可以看出大量文件操作导致CPU占用极高,找到问题就是接下来优化问题,程序中有使用一个mysql_fetch_object(),表面看是没有什么问题的,php官网文档,中描述的是接收一个资源结果集作为参数。但是程序中这里使用了多个参数,搜索了一下找不到答案,有几个简单的描述,但是还是不能理解,还希望熟悉的指教一下,谢谢。我暂时直接取消后两个参数,相应的首页判断加载的时候调用了一个方法暂时也就屏蔽了,内容无异,相反各方面数据都明显提升。



涉世总结 秘籍书写

xhprof 性能分析器的使用

1.安装扩展,选择适合自己版本的xhprof,phpinfo查看适合安装成功

2.简单的调试,数据模式+可视化模式

  1. /**
  2. * xhprof start
  3. * XHPROF_FLAGS_NO_BUILTINS (integer) 使得跳过所有内置(内部)函数。
  4. * XHPROF_FLAGS_CPU (integer) 使输出的性能数据中添加 CPU 数据。
  5. * XHPROF_FLAGS_MEMORY (integer) 使输出的性能数据中添加内存数据。
  6. */
  7. xhprof_enable(XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_CPU);
  8. function useXhprof() {
  9. $str;
  10. $i = 1000;
  11. while (($i--)>=0) {
  12. $str .= $i;
  13. }
  14. return $str;
  15. }
  16. useXhprof();
  17. $xhprof_data = xhprof_disable();
  18. print_r($xhprof_data);
  19. /**
  20. * 截取部分参数含义表示
  21. * [main()==>useXhprof] => Array (
  22. * [ct] => 1 useXhprof函数的调用次数
  23. * [wt] => 2064 消耗的时间,单位为微秒
  24. * [cpu] => 0 cpu时间
  25. * [mu] => 3744 内存使用情况,单位byte
  26. * [pmu] => 728 峰值内存使用情况
  27. * )
  28. */
  29. /**
  30. * 可视化 这里按照自己的情况设置好参数 clone地址:https://github.com/phacility/xhprof
  31. */
  32. $XHPROF_ROOT = realpath(dirname(__FILE__) .'/xhprof');
  33. include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
  34. include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
  35. $xhprof_runs = new XHProfRuns_Default();
  36. $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
  37. echo "<a href='/xhprof/xhprof_html/index.php?run=$run_id&source=xhprof_foo'>look</a>";

江湖恩仇录之PHP程序CPU高占用优化经历分享的更多相关文章

  1. SQL Server 解决CPU 高占用的一般step

    第一步: 看这些CPU是不是SQL Server用的. 第二步: 确定SQL Server 有没有引发17883\17884错误 第三步: 找出使用CPU最高的语句进行优化.(sys.dm_exec_ ...

  2. 新人补钙系列教程之:拒绝CPU高占用

    1.关于MovieClip和Sprite的鼠标事件,当不需要鼠标事件的时候将mouseEnabled和mouseChildren设为false. 不断的检测鼠标交互事件会消耗CPU,尤其是大量交互对象 ...

  3. 使用jstack命令查看CPU高占用的问题记录

    笔记: 1.top命令找出最高占用的进程(command为java) 2.查看高负载进程下的高负载线程:top -Hp [PID] (或 ps -mp PID -o THREAD,tid,time) ...

  4. tomcat - CPU高占用问题记录

    先查询进程 top 再根据进程号,查出进程的线程 ps p 3036 -L -o pcpu,pid,tid,time,tname,cmd 得到最高使用率CPU的线程TID,转换成16进制 printf ...

  5. top命令定位CPU高占用代码

    步骤如下: 1.使用top命令定位异常进程.可以看见12836的CPU和内存占用率都非常高 2.使用top -H -p 进程号查看异常线程 3.使用printf "%x\n" 线程 ...

  6. 记一次容器CPU高占用问题排查

    起因:发现docker中有两个容器的CPU持续在百分之95以上运行了一晚上 执行命令:docker stats 发现这个两个大兄弟一点没歇满负荷跑了一晚上,再这么下去怕不是要GG 容器里跑的是JAVA ...

  7. cpu高占用,线程堆栈,jstack,pstack,jmap, kill -3 pid,java(weblogic,tomcat)

    1 ps -mp pid -o THREAD,tid,time 2 printf "%x\n" tid 3 jstack pid |grep tid -A 30

  8. linux c++应用程序内存高或者占用CPU高的解决方案_20161213

    对于绝大多数实时程序来说,实时处理相关程序中的循环问题所带来的对机器的损耗和自身的处理速度的平衡,以及与其他程序的交互以及对其他功能的影响难免会成为程序设计中最大的障碍同时也是最大的突破点. 在所有这 ...

  9. Mysql占用过高CPU时的优化手段

    Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...

随机推荐

  1. Apache2.4和Apache2.2访问控制配置语法对比

    一.访问控制 在Apache2.2版本中,访问控制是基于客户端的主机名.IP地址以及客户端请求中的其他特征,使用Order(排序), Allow(允许), Deny(拒绝),Satisfy(满足)指令 ...

  2. 避免jQuery名字冲突--noConflict()方法

    众所周知,在jQuery语法中,$符号是jQuery的简写方式.但在某些情况下,可能需要在同一个页面引入其他javascript库(比如Prototype).因为$简短方便,很多的库也是使用$符号.为 ...

  3. Linux下集群的搭建

    1.集群的简介: 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术. 如果一个事情 ...

  4. tomcat发布记录

    web项目发布详细步骤 服务器 tomcat服务器1.删除webapps文件夹里面的项目war包-->ifm.war(项目war名称)2.把项目的ifm.war放到webapps里面3.删除we ...

  5. iTOP-4412开发板低功耗高性能的开源硬件平台——上手评测

    iTOP-4412开发板现在比较热门的开发板,笔者近期入了一套.也推荐给初学ARM的朋友学习,4412开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超 ...

  6. 怎样Zbrush 4R7中添加和删除SubTool

    添加或删除SubTool在ZBrush®软件中是非常简单易操作的,通常在用SubTool面板已经给我们提供了相应的命令来对其进行操作,它能够将一个或多个格式为ZTL的文件同时添加进SubTool里. ...

  7. Java虚拟机详解01----初识JVM

    主要内容如下: JVM的概念 JVM发展历史 JVM种类 Java语言规范 JVM规范 一.JVM的概念: JVM: Java Virtual Machine,意为Java虚拟机. 虚拟机: 指通过软 ...

  8. 使用Android Studio搭建Android集成开发环境(图文教程)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. 创建自定义的Cocos2d-x场景

    操作步骤 1.创建cocos2d-x工程 2.新建 Scene1.cpp Scene1.h Scene1.h代码 #ifndef __SCENE1_H__#define __SCENE1_H__ #i ...

  10. 3D跑酷遇到的问题

    前言 项目名称:3D跑酷项目 写作目地:使用Asset Server进行多人协作开发过程中,记录遇到的问题 问题1:UIAtlas无法自动更新 描述:NGUI的Atlas图集(图片)无法自动更新 后果 ...