当前位置: 首页 > 编程日记 > 正文

【译】如何精确判断最终用户响应时间过长的原因?

译者:原始文章有点性能测试工具软文的感觉,毕竟文章来源于某工具官方博客。高手请略过。
对于我这种新手,此文还是给我带来一些惊喜,从上到下地,从表象到根源地,定位他们遇到性能问题-响应时间过长-的根本原因,有具体的步骤,思考和判断依据,这就是一个比较不错性能测试分析实例。可以更清楚看到性能测试如何分析定位,可以学习其思路。故分享之。

原文连接: http://apmblog.compuware.com/2013/06/04/how-to-accurately-identify-impact-of-system-issues-on-end-user-response-time/


以下为正文

我们希望检测下我们社区网站的负载能力,所以我们开发团队进行了一个任务,验证生产环境的系统是否能在现有的硬件基础上处理10倍于目前的负载。为了将网站在高负载下可能的崩溃影响降到最低,我们决定在周日下午进行第一轮测试。在运行测试之前,我们给运维团队提了一个醒:他们可能在这次两小时的期间观察到明显的负载变化,从而可能影响到运行在同一环境下的其他应用程序。

在测试过程中,运维团队和开发团队一起监控实时性能数据,当达到一定的负载水平后,我们看到最终用户的响应时间和耗尽资源。在本次测试中非常有趣的是,开发团队和运维团队都看着相同的数据,但是却从不同的角度去审视这些结果。然而,他们都是依赖于最近才公布的Compuware的PureStack技术 ,这是——整合dynaTrace和PurePath——的第一个解决方案,显示出在高负载下生产环境的硬件是如何影响到关键业务应用程序的性能。

'横向'事务以及'纵向'层面的热点区域

上下文为运维团队和开发团队的数据之间架起桥梁:这张图片显示"横向"事务以及"纵向"层面的热点区域(Bridging the Gap between Ops and Apps Data by adding Context: One picture that shows the Hotspots of "Horizontal" Transaction as well as the "Vertical" Stack.)。

在我们的场景中表现不佳的根本原因 - 一个运行着Web和应用程序服务的主服务器的CPU被耗尽 - 从而导致达不到我们的负载目标。事实证明,这个问题是跟硬件设备和应用程序都有关系(This turned out to be both an IT provisioning and an application problem)。让我解释一下团队的步骤以及他们是如何得出他们的行动项列表,以便改善目前的系统性能,以便在第二轮测试中得到更好的结果。

第1步:监控和识别硬件健康状况

运维团队希望能够看着他们的服务器列表,而所有关键指标(CPU,内存,网络,磁盘等)都能很快地呈现出绿色状态(Operations Teams like having the ability to look at their list of servers and quickly see that all critical indicators (CPU, Memory, Network, Disk, etc) are green)。但是,当我们的负载测试达到了顶峰时,他们看向服务器的状态时,显示出来却是,他们有2台机器正出现了异常:

我们的社区网站核心服务器出现CPU相关的问题,并影响到另一运行在这台服务器上的应用程序。

我们的社区网站核心服务器出现CPU相关的问题,并影响到另一运行在这台服务器上的应用程序。

步骤2:哪些运行中的应用程序被真正影响到了?

单击受影响的程序 选项卡,它会显示受影响的机器上所有运行的应用程序,以及目前受影响的应用程序:

增加的负载不仅影响到社区网站,而且也影响到我们支持网站

增加的负载不仅影响到社区网站,而且也影响到我们支持网站

这次负载测试已经让我们明白:如果我们希望未来的社区网站能够承担更高的负载,那我们可能需要移动支持网站到其他的机器,以避免不必要的影响。

当两个团队孤立检查,运维导向的监测是不会有这个的结论(When examined independently, operations-oriented monitoring would not be that telling.)。但是,当它被放到具体的上下文中,并涉及到关联的数据(最终用户响应时间,用户体验,...),这对开发团队来说是非常重要的,两个团队将获得更多的灵感和视角。这是一个良好的开端,但仍然还有很多需要了解的。

步骤3:哪些关键事务被真正影响到了?

点击社区应用程序的链接,它会显示实际受硬件状态影响的事务和页面,但仍然存在着两个关键的却又悬而未决的问题:

  • 这些事务,是否是我们成功运行的关键?
  • 这些事务和个人用户受性能问题影响后,有多严重的后果?
自动基线告诉我们,社区网站主要页面的响应时间受到明显的的性能影响。也包括我们的首页,这是我们最有价值的一个页面。

自动基线告诉我们,社区网站主要页面的响应时间受到明显的的性能影响。也包括我们的首页,这是我们最有价值的一个页面。

步骤4:可视化受硬件问题影响的事务流

事务流图表是一个令人满意的方式,能使得运维团队和开发团队达到一个基本的共识,并根据其完整的上下文查看关键的数据。它能显示涉及到的应用层,正在运行的物理机器和虚拟机器,以及哪里是热点区域。

运维团队和开发团队有相同的概要图表,告诉他们无论是在'横向'事务和'纵向'层面的热点区域。

运维团队和开发团队有相同的概要图表,告诉他们无论是在"横向"事务和"纵向"层面的热点区域。

我们知道,我们的网页内容非常"丰富"(图像,JavaScript和CSS),高达80%的事务时间花费在浏览器上。看到热点区域这样的表现,现在整体页面加载时间下降到50%,我们马上就知道更多的事务时间已经转移到新的热点区域:服务器端。好消息是,数据库是没有问题的(只用了1%的响应时间),整个性能热点区域似乎转到Web和应用程序服务器,它们都运行在同一台机器上 - 即那台存在CPU问题的机器。

第5步:精确定位存在问题的机器的健康问题

点击主机健康图表(Host Health Dashboard),它会显示了那个特定的服务器出了什么问题:

运维团队立即看到了CPU的消耗主要来自于一个Java应用服务器。网络,磁盘和页面错误在一些某些特定的时间也都存在不寻常的波动。

运维团队立即看到了CPU的消耗主要来自于一个Java应用服务器。网络,磁盘和页面错误在一些某些特定的时间也都存在不寻常的波动。

第6步:进程健康图表显示应用程序服务器上响应缓慢

我们可以看到,这台机器上的两个主要进程是IIS(Web服务器)和Tomcat(应用程序服务器)。再进一步看看,随着时间的推移,他们具体的表现情况:

我们并不是没有足够的工作线程。传输速率是相当平缓。这就说明,Web服务器正在等待应用服务器的响应。

我们并不是没有足够的工作线程。传输速率是相当平缓。这就说明,Web服务器正在等待应用服务器的响应。

它表明应用程序服务器的CPU被耗尽。负载测试工具发送的持续请求在排队等待,因为服务器无法及时处理掉这些请求。实际上已处理的事务数量在下降。

它表明应用程序服务器的CPU被耗尽。负载测试工具发送的持续请求在排队等待,因为服务器无法及时处理掉这些请求。实际上已处理的事务数量在下降。

第7步:精确定位CPU的大量消耗

现在我们开发团队非常有兴趣搞清楚到底是什么在消耗着CPU,以及是否我们可以在应用程序代码里面修复,或者是否只是我们需要更多的CPU:

热点区域显示应用程序的两层都消耗CPU比较多。让我们进一步深入

热点区域显示应用程序的两层都消耗CPU比较多。让我们进一步深入。

我们有些相当复杂的页面(包含大量Confluence macros)导致大量的CPU占用

我们有些相当复杂的页面(包含大量Confluence macros)导致大量的CPU占用。

缺少资源和身份验证问题导致了这些异常

缺少资源和身份验证问题导致了这些异常。

运维和开发团队现在可以轻松地划分处理硬件和应用程序问题的优先级

所以如前所述,上下文是关键。但这些数据不是轻而易举就能获得的 - 上下文依赖于智能关联的能力,使所有相关的数据组成一个连贯的故事。当"横向"的事务数据(最终用户响应时间的分析)关联到"纵向"的硬件层面信息,这就很容易让两个团队达到一个共识,并规划影响最小的修复的优先级。

这次实验使我们能够确定以下几个行动项:

  • 当应用程序对其他程序造成负面影响时,部署我们的关键应用程序到其他的机器上。
  • 优化我们的页面生成方式,以便降低CPU使用率。
  • 为虚拟机分配更多的CPU,以便能够处理更多的负载。

相关文章:

javascript中重要概念-闭包-深入理解

在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入。本人经过一段时间的学习,对闭包的概念又有了新的理解。于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给读者提供学习的途径,…

ssl握手过程和ca证书验证

转载:https://www.cnblogs.com/cposture/p/9029014.html SSL 认证 可以将 SSL 服务器与客户端之间的通信配置为使用单向或双向 SSL 认证。 单向 SSL 认证一般是客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是…

【ACM】练武奇才

题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1005 【问题描述】 很久很久以前,constbh大神还在上着小学。一天,在放学的路上,他被一位乞丐叫住,这位乞丐对constbh说,我看你骨骼惊奇,…

Bat命令学习

参考资料:http://www.cnblogs.com/SunShineYPH/archive/2011/12/13/2285570.html

记一次CentOS7内核kernel的删除重装

人生在于折腾,学习Linux更要多多折腾。在一次折腾中吸取教训,更易于记忆。今天我们来折腾Linux的内核:删除系统内核后,通过光盘进行kernel的重安装。友情提示:请在虚拟机环境进行,折腾前务必做好系统快照。…

tcpdump抓包并保存到远程服务器

有的时候,运行tcpdump抓包进程的主机A可能没有足够的硬盘空间。例如我们使用树霉派搭建了一个热点,然后我们想在树霉派上抓包,因为树霉派的存储很小,所以很容易在短时间内将存储空间使用完。 为了解决该问题,我们可以…

【ACM】家喻户晓的中药店(待更)

题目链接:http://acm.nuc.edu.cn/OJ/contest/show/43/1007 【问题描述】 long_xiao和const_hhh是一对恩爱的夫妻。 他们在京城经营着一家中药店,夫妻二人医术精湛、古道热肠,虽然年过花甲,身体依然硬朗。更重要的是&#xff…

常用MySQL的命令集锦

常用MySQL的命令集锦 一、连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1、例1:连接到本机上的MYSQL。 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码…

google的gn构建系统

什么是GN? GN是一个生成Ninja构建文件的元构建系统,以便你可以用Ninja构建Chromium。 你为什么从GYP切换? 我们相信GN文件比GYP文件更具可读性和可维护性。GN很快: GN比GYP快20倍。GN支持作为构建的一部分,根据Ninj…

【ACM】五子棋

题目链接:http://acm.nuc.edu.cn/OJ/contest/show/25/1009 【问题描述】 五子棋想必大家都玩过,如果没有那我只能重新介绍一下规则了,当横竖斜(共八个方向)出现5个同色棋子时,则认为该颜色棋的选手获胜。…

源码编译安装httpd及其常见错误

一、编译安装的整体步骤 1、在官网下载源码,并解压2、切换到其目录中 3、执行./configure4、编译 二、编译中及安装后配置常见的参数及其说明编译中配置1)指定安装路径--prefix/usr/local/Pacakage_name 指定安装路径--sysconfigdir/etc/Package_name …

Nhibernate3循序渐进(三): 一对多映射和级联保存

我们知道, 对于数据库中的一对多关系, 我们在建表的时候, 应该在多表这里建立外键我们准备这样一个场景, 大学里的系和学生, 一个系有多个学生Department类和Xml如下:Department.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespa…

自定义UISearchBar外观

本文转载至 http://www.jianshu.com/p/66b5b777f5dc 最近,在项目过程中遇到要自定义SearchBar的外观,虽然自己觉得用系统默认的外观就行了,不过UI设计师要求不用系统的默认样式,要跟app主题保持 一致。 图1:设计效果图…

linux内存管理和原理分析

https://blog.csdn.net/rebirthme/article/details/50402082

【数据结构】邻接矩阵及其实现

文件操作比直接输入方便很多 直接输入&#xff1a; //建立图的邻接矩阵储存结构 #include <stdio.h> #include <string.h> #define M 20 #define FINITY 5000 typedef struct {char vexs[M];int edge[M][M];int n,e; }Mgraph;//c0&#xff0c;表示建立无向图 …

对职业生涯的思考

从刚毕业到目前所在公司&#xff0c;差不多6年了&#xff0c;想想这六年里面&#xff0c;自己的能力和刚毕业比有了很大的提升&#xff0c;但是现在在什么能力上&#xff0c;我不知道&#xff0c;毕竟没有去过别的公司。最近也在思考自己未来&#xff0c;算是比较迷茫阶段。趁最…

jquery源码分析(七)——事件模块 event(二)

上一章节探讨了事件的一些概念&#xff0c;接下来看下jQuery的事件模块。 jQuery对事件的绑定分别有几个API&#xff1a;.bind()/.live()/.delegate()/.on()/click()&#xff0c; 不管是用什么方式绑定&#xff0c;归根到底还是用addEventListener/attachEvent&#xff08;IE&a…

google gn构建系统的介绍

GN语言和操作 GN语言和操作 内容介绍 使用内置的帮助设计理念语言 字符串清单条件语句循环函数调用作用域和执行Scoping and execution命名事物 文件和目录名称构建配置目标CONFIGS 公共配置模板其他特性 Imports路径处理模式执行脚本与Blaze的区别和相似之处 介绍 本页面描述…

【数据结构】邻接表的储存结构 建立图的邻接表算法

【数据结构】邻接矩阵及其实现 一个图的邻接矩阵的表示是唯一的&#xff0c;但其邻接表表示不唯一&#xff0c;这是因为在邻接表结构中&#xff0c;各便表结点的链接次序取决于建立邻接表时的算法以及输入的次序。 一般而言邻接矩阵适合存储稠密图&#xff0c;邻接表适合存储…

报错:该字符串未被识别为有效的DateTime

报错&#xff1a;该字符串未被识别为有效的DateTime □ 背景 前端的搜索条件中包含关于时间的字符串&#xff0c;由jquery ui的datepicker产生时间字符串。 服务端对时间做了一次转换&#xff1a;DateTime.Parse(Request["时间字段"].ToString())。 搜索的时候没有选…

Nagios监控笔记上

Nagios软件介绍及服务端安装部署实战1. Nagios服务端安装1.1 准备3台服务器或者虚拟机器管理IP地址角色备注192.168.1.80Nagios监控服务器192.168.1.81Lamp服务器被监控的客户端服务器192.168.1.82Lamp服务器被监控的客户端服务器1.2 解决perl编译问题&#xff1a;后面编译的软…

liunx查看python的site-packages路径

有时候我们在liunx上想修改查看python的包路径可以试试以下命令 from distutils.sysconfig import get_python_lib print(get_python_lib()) 如图&#xff1a;

【ACM】杭电OJ 2010

注意格式&#xff01;&#xff01;&#xff01;注意格式&#xff01;&#xff01;&#xff01; 空格的设置 \n的设置 #include <stdio.h> int main () {int i,m,n,g,s,b,flag;while(scanf("%d%d",&m,&n)!EOF){flag0;for(im;i<n;i){gi%10;bi/100…

中科院 工程硕士专业课 复试考试前的辅导安排

同学们大家好&#xff1a;学校定于12月6日、7日组织专业课辅导&#xff0c;1月初进行专业课复试及资格审查。辅导具体日程安排如下&#xff1a;12月6日下午13:00 数据结构&#xff08;报考软件工程、计算机技术领域考生&#xff09; 人文楼教一阶12月7日上午9:00 信号与系统…

TCP性能和发送接收Buffer的关系

本文希望解析清楚&#xff0c;当我们在代码中写下 socket.setSendBufferSize 和 sysctl 看到的rmem/wmem系统参数以及最终我们在TCP常常谈到的接收发送窗口的关系&#xff0c;以及他们怎样影响TCP传输的性能。 先明确一下&#xff1a;文章标题中所说的Buffer指的是sysctl中的 …

PHP 异常类 Exception 高洛峰 细说PHP

/** 1.自定义的异常类&#xff0c;必须是系统类Exception的子类* 如果继承Exception类&#xff0c;重写了构造方法,一定要调用一下父类的构造方法。*/class MyException extends Exception{//必须继承Exception类function __construct($mess){parent::__construct($mess);}func…

【ACM】杭电OJ 2023

注意最后又两个\n #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn 1000; int a[maxn][maxn]; double grade[maxn]; double average[maxn]; int main () {int m,n,i,j,flag,count;//n个学生&#xff0c;m门…

Hadoop学习笔记—7.计数器与自定义计数器

一、Hadoop中的计数器 计数器&#xff1a;计数器是用来记录job的执行进度和状态的。它的作用可以理解为日志。我们通常可以在程序的某个位置插入计数器&#xff0c;用来记录数据或者进度的变化情况&#xff0c;它比日志更便利进行分析。 例如&#xff0c;我们有一个文件&#x…

win10安装spacemacs

1、下载emacs最新版 26.1 2、解压emacs到你的安装目录,我的系统是D:/Program File/。执行/bin目录下的addpm.exe 这一步会在开始菜单创建快捷方式 3、在系统环境变量中添加新项HOME(具体环境变量设置方式请自行google)&#xff0c;该变量的路径决定了emacs启动时.emacs.d目录…

【ACM】杭电OJ 2024

注意&#xff1a; 1、getchar() 2、scanf和gets的区别 3、判断条件 C语言的合法标识符 1、由字母&#xff0c;数字&#xff0c;下划线组成 2、且首字符不能是数字 #include <iostream> #include <cstdio> #include <cstring> using namespace std; in…