现象描述

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

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

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

以下定位方法是针对比较典型的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. token要加编码decode吗_NLP中各种各样的编码器
  2. #pragma execution_character_set的意义
  3. hhc.exe制作chm
  4. vue使用 xterm_为什么我坚持使用xterm
  5. 砸115亿元入局!后知后觉的欧洲重金建设AI,为赶中超美
  6. Redis6.2.6下载和安装
  7. PPT 各行各业素材 10000套 讲解
  8. linux中u盘驱动程序编写,Linux下的硬件驱动——USB设备(下)(驱动开发部分)...
  9. amazeui PHP,amazeui页面分析之登录页面
  10. 学习笔记61—兴趣阅读之经济学
  11. 基于cooja的RPL OF的修改与仿真
  12. 最大m子段和总结与例题 51nod1052 HDU1024
  13. 【嵌入式热敏打印模块(1)】
  14. 关于51地图中循环根据经纬度获取地理位置只显示一条数据的问题
  15. Mac M1芯片安装 MySQL
  16. 不冷不热之人传略《狂热的爱》
  17. Java获取12306余票信息(一)
  18. Redis持久化 RDB和AOF
  19. python银行信贷风险分析_Lending Club贷款数据分析(python代码)
  20. Echarts百分比饼状图

热门文章

  1. 【大话传送网-学习笔记】波分复用与OTN
  2. 右键word(docx)丢失问题
  3. usb转串口驱动怎么安装 usb转串口驱动安装异常的解决方法
  4. 人生若只如初见-安意如
  5. surfacecontrol.java_简单说说JAVA层中Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的关系...
  6. 再见邓肯!再见石佛!
  7. Win10设置java环境变量
  8. 快速分析多个德邦单号物流,并将信息导出EXCEL表格
  9. 6.Ubuntu20.04下载mapserver
  10. 关于实现订单的相关功能实现