前言
之前出现过一次服务器Cpu
占用率达到100%的问题,经分析是Jenkins
的重启Jar
包脚本导致的。
最近在使用测试服务器时,发现服务器卡顿仍然很严重,定位到问题是 rsdun-zuul-balance
网关服务导致的,下面是调查过程:
发现问题
在任务管理器中,定位到一个java
服务的线程数很多,然后通过pid
定位到是rsdun-zuul-balance
服务
通过 jconsole.exe
监视该服务,利用压测工具 jmeter
进行压力测试,请求 获取朋友圈信息
接口,得到的运行情况如下
CPU
占用率在 5%
- 25%
之间浮动,利用 windows
自带的资源监视器,对比其他正在运行的 java
服务,CPU
占用率稍高
注:资源监视器打开方式如下
原因分析
所有的请求都需要经过 zuul
进行转发,这是造成 zuul
服务 cpu
占用过高的原因。当某个时间点大量请求涌入,CPU
使用率会飙升,见下方测试:
优化办法
根据上面的分析,CPU
使用率与单位时间请求数量成正比,这一块儿目前无法进行优化。但是可以以下面两个目标作为优化方向:
- **提高系统的TPS(吞吐量)**。
- 降低请求错误率。
优化方法:
zuul
服务参数调优。- 建立高可用架构。
目前的主要调优手段应该是第一种,第二种需要物理设备的支持。
其他问题
在使用 jmeter
进行压力测试时,发现了如下几个错误。
REJECTED_SEMAPHORE_EXECUTION 错误
在使用 jmeter
进行压测时(1s内1000请求),发现大量请求报错:{"timestamp":"2021-09-22T08:30:37.484+0000","status":500,"error":"Internal Server Error","message":"REJECTED_SEMAPHORE_EXECUTION"}
异常率达到 87.2%
并且这个报错有时在进行 App测试
时也会出现。查询资料发现是因为 zuul
默认每个路由直接用信号量做隔离,并且默认值是 100
,也就是当一个路由请求的信号量高于 100
那么就拒绝服务了,返回500。
重新设置信号量为5000,再次测试,没有出现报错。
Internal Server Error 错误
目前测试发现有两个原因会导致该错误:
- 请求连接时间过长。
- 服务挂了。
这里仅分析一下第一个原因,与 ribbon.ConnectTimeout
这个参数有关。这个参数配置的是请求连接超时时间,将这个参数调整至1(ms),头几个请求会报这个错误;调整至3000(ms),请求正常。
1 | # 请求连接超时时间3s |