系统重启时http请求量为什么会涨?

系统重启时开始QPS为0,启动后瞬间QPS达到平时2-3倍,什么情况?

 

 

1、是不是监控系统显示错了?

登陆到服务器上,查看日志,原始日志也是同样情况。

2、是不是metric log记录的问题?

在进入调用方法后记录http的metric日志(qps),调用结束后记录耗时日志(latency)。

系统重启时http请求量为什么会涨?

 

问题就在这里:系统刚启动时,系统计算资源并没有完全准备好(如Tomcat线程池),请求会在队列中排队,并没有进入到方法调用,此时统计的QPS为0;当更多线程池可以处理请求后, 队列中的请求被分配到不同线程进行处理,直到队列被消费完,这段时间显示的QPS会高于正常情况。

请求进入调用之前都要经过哪些环节?看下图

系统重启时http请求量为什么会涨?

 

解决办法:

当前的metric中统计的QPS并不能在真实反映系统的负载(排队的请求为包括在内),通过上层Nginx的日志统计请求量更加准确。  Nginx日志监控也只能获取到请求结束后的日志。

换个思路:如何解决启动是队列堆积的问题?

运维角度:Nginx权重调节,负载探测

开发角度:系统启动后直接启动相关的线程池

spring-boot 在1.3.3 的tomcat容器 支持最大线程数设施,默认为0;

spring-boot 在2.0 后支持更多的线程池选项:

server.tomcat.accept-count=0 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.
server.tomcat.background-processor-delay=30s # Delay between the invocation of backgroundProcess methods. If a duration suffix is not specified, seconds will be used.
server.tomcat.max-connections=0 # Maximum number of connections that the server accepts and processes at any given time.
server.tomcat.max-http-header-size=0 # Maximum size, in bytes, of the HTTP message header.
server.tomcat.max-http-post-size=0 # Maximum size, in bytes, of the HTTP post content.
server.tomcat.max-threads=0 # Maximum number of worker threads.
server.tomcat.min-spare-threads=0 # Minimum number of worker threads.