热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用xhprof分析zabbix页面性能问题

xhprof是什么?xhprof是一个php的性能分析利器,写过php的东西应该都比较清楚。大致说下功能:统计函数调用的次数内存使用CPU占用zabbix页面的问题zabbix性能一直都是非常让人不满的地方,页面部分自然也跑不掉了。页面的功能是非常的丰富和强大,但

xhprof是什么? xhprof是一个php的性能分析利器,写过php的东西应该都比较清楚。 大致说下功能: 统计函数调用的次数 内存使用 CPU占用 zabbix页面的问题 zabbix 性能一直都是非常让人不满的地方,页面部分自然也跑不掉了。 页面的功能是非常的丰富和强大,但

xhprof是什么?

xhprof是一个php的性能分析利器,写过php的东西应该都比较清楚。

大致说下功能:

  • 统计函数调用的次数
  • 内存使用
  • CPU占用
  • …

zabbix页面的问题

zabbix 性能一直都是非常让人不满的地方,页面部分自然也跑不掉了。

页面的功能是非常的丰富和强大,但至于性能上着实不够。

最近我们遇到的一个问题就是发现screens.php这个页面打开速度非常慢,而且

在切换主机的时候同样非常非常慢。平均需要等待15s的样子吧,一大堆的同事均抱怨。

so,我们还是上xhprof来分析下问题吧。

定位问题

抓包分析

  • 首先是同时抱怨慢的时候,进行了抓包测试,发现消耗了大量的事件在等待服务器响应,但

页面刷新完成后发现每个图表的加载事件非常短,那说明问题不在数据加载,而在于整个页面

的处理逻辑上。

  • 其次,当时利用其他帐号测试的时候发现加载速度与帐号有关,更进一步的测试发现超级管理员的

速度非常块,而其他帐号速度基本一致,非常慢。

而帐号的差别最大的可能就是权限检查的部分不同–超级管理员不需要权限检查。

那我们暂时记住,先用xhprof分析下页面吧。

  • 抓包分析结果:

抓包分析

xhprof分析

配置、使用都不多说了,网上百度即可。

贴一个分析的结果:

xhprof分析结果

可以非常直观的看到大量的事件浪费在CScreen::get这个调用上,那问题就很简单了,我们去看下这部分的代码。

分析代码

Screen::get 这是一个api调用,所以代码路径在api/classes/CScreen.php中,我们看下get方法。

很快发现了疑似的地方:

// editable + PERMISSION CHECK
                if ($userType == USER_TYPE_SUPER_ADMIN || $options['nopermissions']) {
                }   
                elseif ($result) {
                        $groupsToCheck = array();
                        $hostsToCheck = array();
                        $graphsToCheck = array();
                        $itemsToCheck = array();
                        $mapsToCheck = array();
                        $screensToCheck = array();
                        $screensItems = array();
                        $dbScreenItems = DBselect('SELECT si.* FROM screens_items si WHERE '.dbConditionInt('si.screenid', $screenIds));
                        while ($screenItem = DBfetch($dbScreenItems)) {

看到了吧,如果是超级用户则不进行权限检查,否则就进行一个非常复杂的权限检查过程。

我把对应的sql打印出来,发现非常非常长,执行长达4.8s,这和前面的xhprof图的中DBselect

速度慢也吻合。

修复方法

代码已经定位了,修复方法就不是问题了,简单的注释掉就可以了。

验证效果

重新抓包看下:

修复效果

推荐阅读
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
author-avatar
mobiledu2502891023
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有