现象描述

不管是性能测试中,还是生产环境中,经常会遇到响应时间过长的问题。

响应时间是性能评估的一个重要指标,会对最终用户产生直接影响,一个产品是快是慢,响应时间是最直观的感受。

因此面对响应时间长的问题,一定想尽办法消灭它。

以下定位方法是针对比较典型的nginx+tomcat应用架构。

排查思路及方法说明

常见有两种表现:偶现极少量的请求出现响应时间偏长,或者会有大量、批量的请求响应时间长。

对偶然出现的少量响应时间长的问题,可能是外部影响、网络异常等造成。

偶然出现少量响应时间过长时,可以排查以下几个方面来定位问题,

查看当时服务器日志是否有错误;

检查服务器资源使用情况是否正常,load average、CPU使用率(尤其是单核CPU)是否有飙高现象;

检查是否出现磁盘短暂负载较高,比如iostat util%飙高等;

确认当时网络情况是否正常,是否有网络丢包等现象。

以上排查建议在有全面监控的基础上进行,偶现问题比较难定位,有全面的监控数据进行排查就方便多了。

案例1:单核CPU使用率高导致偶现响应时间长

某产品线上出现少量的响应时间长的问题,定位结果发现是两个CPU密集型服务部署在同一台机器上,

其中一个服务会使得单个CPU使用率100%,导致另一个服务出现少量请求响应慢。解决办法是服务隔离。

如果出现比较多的响应时间过长,首先要排查所有服务器是否存在资源使用瓶颈,

如CPU使用率高、单核CPU使用率高、内存使用是否正常、是否有频繁FullGC、磁盘IO压力情况、网路时延情况等。

如果不能通过以上检查发现问题所在,那就要逐步分析是系统架构中哪个环节导致的问题。

nginx排查

首先排查nginx access.log日志,分析响应时间可能慢在哪里。

log_format中定义了$request_time字段,它指的是从接受用户请求数据到发送完回复数据的时间。

那究竟是慢在了nginx还是上游服务器?

log_format同时提供了$upstream_response_time字段,它是指从nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间。

那就是说:

如果两者相差很大,也即是$upstream_response_time数值比较小,则需要查看nginx模块配置或nginx与客户端的网络是否有性能瓶颈了。

如果r e q u e s t t i m e 与 request_time与requestt​ime与upstream_response_time相差不大,则可能是nginx连接上游服务器比较慢,或者上游服务比较慢,需要进入下一步应用层排查。

案例2:nginx日志排查出网络问题

一线上产品出现某个操作响应时间30%以上都大于2s,通过分析access.log发现r e q u e s t t i m e 与 request_time与requestt​ime与upstream_response_time相差不大,

进一步检查nginx的配置,以及nginx服务器所在的交换机流量发现,nginx所在交换机流量基本快跑满了,导致nginx返回数据较慢。

nginx层排查除了以上日志排查外,还需要关注nginx本身的配置,比如nginx worker_connections设置过小会导致响应时间长,tps上不去,具体可参考上一期《tps上不去》。

应用层排查

排除Nginx层的问题,那要着重定位应用层自身代码、或者第三方调用、或者数据库等其它依赖服务是否存在响应慢的情况。

首先确认是否存在以下问题:

确认应用服务是否有某些线程CPU使用率高,通过top -H可以方便实时查看

确认线程是否存在异常状态,如频繁blocked、死锁等,推荐使用visualVM、Jconsole、jstack查看线程状态,进行线程dump

连接数检查,应用层连接数设置过小,会导致响应时间长,tps上不去,可以参考上一期《tps上不去》问题

如果有产品内部监控,如典型业务调用的处理时间、慢操作日志监控,那就比较方便了

如果很不幸,监控数据很少,且现有数据难以分析,那推荐两个百试不爽的分析工具,Nprofile和Btrace。

Btrace在线调试神器

BTrace 是一款利用hotSpot虚拟机可以动态替换class的特点而完成的,可以对online的程序动态的改变类的行为, 进而进行线上调试的一个工具。

也就是说可以不需要重启服务可以直接在线调试分析。关于Btrace的教程随意搜索就能找到很多。

案例3:Btrace在线分析

生产环境出现某种请求有30%的比例响应时间比较长,需要定位具体是哪个接口或调用响应时间长。

1、首先要了解应用层的调用关系,我们对com.netease.XXX.usercenter.web.dwr.YYYBean进行跟踪,完成Btrace脚本:

@BTrace

public class LessonLearnRecordServiceImpl {

@TLS

static long beginTime;

@OnMethod(clazz = "/com.netease.XXX.usercenter.web.dwr.YYYBean/", method = "/.+/")

public static void traceExecuteBegin() {// 在方法btrace.test.MyBtraceTest.execute()执行之前进行监控。

beginTime = timeMillis();

// 监控行为是记录一个开始时间。

}

// OnMethod代表运行一个方法的时候进行监控,location @Location(Kind.RETURN)代表在方法返回的时候触发监控行为。

@SuppressWarnings("deprecation")

@OnMethod(

clazz = "/com.netease.XXX.usercenter.web.dwr.YYYBean/",

method = "/.+/",

location = @Location(Kind.RETURN)

)

public static void traceExcute() {

// 监控行为是根据开始时间计算出方法运行时间。

print(strcat("entered ", name(probeClass())));

print(strcat(".", probeMethod()));

println(strcat(" taken : ",strcat(str(timeMillis() - beginTime), "ms")));

}

}

2、获取服务的进程PID,启动Btrace agent:btrace

查看生成的日志如下:

entered com.netease.XXX.usercenter.web.dwr.YYYBean.updateVideoTime taken : 818ms

entered com.netease.XXX.usercenter.web.dwr.YYYBean.updateVideoTime taken : 619ms

entered com.netease.XXX.usercenter.web.dwr.YYYBean.updateVideoTime taken : 930ms

entered com.netease.XXX.usercenter.web.dwr.YYYBean.updateVideoTime taken : 613ms

entered com.netease.XXX.usercenter.web.dwr.YYYBean.updateVideoTime taken : 515ms

entered com.netease.XXX.usercenter.web.dwr.YYYBean.updateVideoTime taken : 716ms

观察日志发现updateVideoTime方法大部分调用时间大于500ms,基本能判断是该方法需要进行性能优化。

Nprofile分析调用热点

Nprofile也即是AJprofile,是由何卓斌开发的一个自身开销比较小,可以profile调用时间和调用热点的小工具。

原理是在需要跟踪的函数调用前后通过AOP调用一些计时的代码,并进行一些简单的统计处理。

使用说明参考:http://doc.hz.netease.com/pages/viewpage.action?pageId=25690763(内部资料)

案例4: 循环调用导致响应时间长

某web应用,一个Http get请求,性能测试最高tps240,平均响应时间接近1s,CPU使用偏高。不满足性能测试通过条件。

对该接口进行profile:

可以发现一次getMyCourse,会有十几次的getFirstLesson和getLastestLearnedLesson调用。

经过确认,确实存在无用的循环调用问题。解决后性能有30%以上的提升。

Nprofile堪称利器,在性能问题分析和定位中非常有效,且比Jprofiler轻便,开销小,对性能测试结果影响小。

数据库层排查

通常web应用会有大量的数据库操作,数据库性能对web应用的性能表现至关重要。如果应用层的分析发现大量线程

等待数据库的响应,就需要对数据库层进行排查。最常见的数据库性能问题有:

索引缺失或者索引建的不合理,sql语句不合理导致没有走索引,进而导致SQL的执行时间长

SQL语句自身写的有问题,导致执行时间比较长

锁等待和锁超时导致事务回滚以致于响应时间很长

数据库的配置不合理,例如最大并发连接过小,bufferpool的设置过小等引起的性能问题

案例5:未创建索引导致响应时间长,CPU飙高

某接口tps只有150时,cpu使用率飚满,且响应时间大于1s。通过Nprofile分析,

发现其中一个方法调用消耗了99%的CPU调用,该方法主要是进行数据库读操作,检查数据库发现未创建索引。

解决后tps上升一倍,响应时间下降到250ms左右。

数据层性能问题可以通过Mysql监控、或mysql-slow.log进一步详细分析。

响应时间过长超时抛出_响应时间过长问题分析相关推荐

  1. java 异常何时抛出_何时适合抛出异常?

    例外点是沟通 exceptional 情况 . 从这个意义上讲:如果你的例子中所有条件都是假的绝对意外,并且没有有效的返回值来表明这种情况,那么抛出RuntimeException是合理的做法;但我可 ...

  2. 海鸥表表带太长了怎么拆_手表表带长了怎么办?手表长了怎么拆

    导语:手表表带的外观与我们的气质形象息息相关,而手表表带的长短影响着我们佩戴手表的舒适度,有人常常会觉得自己的手表表带长了想要换,但是不知道手表表带长了怎么拆,或者是手表表带长了怎么办.那么接下来,我 ...

  3. 公众号推送长图最佳尺寸_公众号长图文排版技巧

    原标题:如何让公众号长图文更加具有层次感 公众号文章图片文字多了之后,就会显得很长,如果内容比较枯燥的话,很难让人看得下去.所以更需要在排版上下功夫,让人能够一目了然地看到文章的主要内容,那么如何让公 ...

  4. winform响应时间最长是多少分钟_漫威电影女性角色出场统计:谁出场时间最长?谁出场次数最多?...

    漫威电影女演员合影 你们知道在所有已上映的漫威电影宇宙系列电影中,出镜总时长最长的女性角色是哪位吗?知道女性角色出现最多的电影是哪部吗?知道单部电影中女性出镜时长最长的电影是哪部吗?美叔猜测出镜总时长 ...

  5. requests获取响应时间(elapsed)与超时(timeout)

    前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的. 如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于reques ...

  6. python requests默认超时时间_requests获取响应时间和超时

    获取响应时间(elapsed) 关于requests库常用的的主要方法及参数,可以参照小鱼的这篇文章 我们接下来直接就来搞怎么获取响应时间,当然是使用 elapsed这个方法, 我们来看看怎么查看el ...

  7. android socket握手,HttpURLConnection抛出java.net.SocketTimeoutException:在Android 4.1.1中SSL握手超时...

    在Android 5.0及更高版本中运行时,我的代码运行正常.但是在Android 4.1.1中它会抛出java.net.SocketTimeoutException:SSL握手超时. URL url ...

  8. Python--day41--事件和信号量之模拟连接数据库并在连接三次后抛出连接超时异常...

    #事件被创建的时候 #False状态 #wait()阻塞 #True状态 #wait() 非阻塞 #clear 设置状态为False #set 设置状态为True #数据库 --- 文件夹 #文件夹里 ...

  9. java捕获定时器抛出的异常_详细了解Java中定时器Timer的使用及缺陷分析

    在需要定时并且周期执行任务时,在最初的JAVA工具类库中,Timer可以实现任务的定时周期执行的需求,不过有一定的缺陷,比如,Timer是基于绝对时间而非相对时间,因此Timer对系统时钟比较敏感,本 ...

最新文章

  1. oracle查看数据库字符编码,oracle 查看、批改字符集编码
  2. Notepad++插件总结
  3. 汇编原理实验 --电话簿的实现
  4. JSONP解决跨域及ajax同步问题
  5. 高德地图api接口文档_在 R 语言里面调用高德地图接口:地理编码与路径规划
  6. hadoop 二次开发DatanodeWriteTimeout设置
  7. sizeof()与_countof()用法
  8. 运营商利润不均衡(转)
  9. 《上海交通大学饮水思源paper(论文)板实用手册(第二版)》出炉
  10. sublime改成中文简体及菜单变成中文
  11. 从QQtabBar看css命名规范BEM
  12. 视频:老外演示如何做康奈尔笔记
  13. 打印机与计算机接口大多数,打印机接口-西北师范大学.PPT
  14. 房子装修选择自装,物业办装修手续,需要哪些资料?
  15. 苹果高管参与直播,或将发布新品
  16. 3D建模:角色手办的制作流程,分分钟一个手办
  17. PLC中ST语言的几种程序流程控制语句
  18. C语言笔记——题目“股神”
  19. linux 磁盘压测工具 fps,荣耀MagicBook Pro锐龙版性能评测,可媲美MX150 2GB核心显卡...
  20. 服务器的垃圾清扫系统指令,求win10清除系统垃圾的几个命令

热门文章

  1. java把map值放入vector_java把map值放入vector
  2. 【Java】浅谈关于代码的耦合性
  3. 科学家发现“超级原子” 元素周期表要扩大(图)
  4. 254work 9月总结复盘:师傅领进门 修行在个人
  5. Memcached 未授权漏洞利用
  6. EC20 查看信号强度
  7. Sensor ISP 图像信号处理系统
  8. Socket 非阻塞模式下connect 返回EINPROGRESS(115)错误
  9. linux如何生成tar文件内容,Linux中的Tar命令创建和提取归档文件
  10. 有关看门狗(监控芯片)