造成后端响应时间高的原因
现象描述:
不管是性能测试中,还是生产环境中,经常会遇到响应时间过长的问题。 响应时间是性能评估的一个重要指标,会对最终用户产生直接影响,一个产品是快是慢,响应时间是最直观的感受。 因此面对响应时间长的问题,一定想尽办法消灭它。
排查思路及说明
常见有两种表现:偶现极少量的请求出现响应时间偏长,或者会有大量、批量的请求响应时间长。
对偶然出现的少量响应时间长的问题,可能是外部影响、网络异常等造成。
偶然出现少量响应时间过长时,可以排查以下几个方面来定位问题:
查看当时服务器日志是否有错误;
检查服务器资源使用情况是否正常,load average、CPU使用率(尤其是单核CPU)是否有飙高现象;
检查是否出现磁盘短暂负载较高,比如iostat util%飙高等;
确认当时网络情况是否正常,是否有网络丢包(如ping www.baidu.com -t 若有请求超时显示说明有网络丢包)等现象。 以上排查建议在有全面监控的基础上进行,偶现问题比较难定位,有全面的监控数据进行排查就方便多了。
如果出现比较多的响应时间过长,首先要排查所有服务器是否存在资源使用瓶颈,
如CPU使用率高、单核CPU使用率高、内存使用是否正常、是否有频繁FullGC、磁盘IO压力情况、网路时延情况等。 如果不能通过以上检查发现问题所在,那就要逐步分析是系统架构中哪个环节导致的问题。
模块内部原因造成的响应时间高
比如:qps过大,下游模块的响应时间高,缓存读写异常,代码问题(可以分析系统架构哪一环节响应时间高,具体分析代码问题)等。 如笔者曾经遇到过因为日志打印太多导致响应时间高的情况
压力上不去:
- 模块本身响应时间过高
- 下游模块响应时间过高
- 部署机器网卡带宽
- 部署机器tcp收发缓冲区限制
- 压力源所在机器带宽
响应时间异常:
- 尖峰:对应时间点查询词返回结果过多;下游模块重启等引起
- 突然下降:缓存命中率过高;词表异常 等引起
- 居高不下:缓存读写异常;下游收发堵塞等引起
出core:
- 空指针
- 数组越界
- 相关模块参数解析错误
- 读取数据与缓存结构不一致
- 线程安全等
内存泄漏:
- 指针数组释放语法错误
- 分支路径过多,释放指针未覆盖所有分支
- 扫尾函数未执行
- 智能指针交叉引用