目录结构
问题
在高并发环境时间段,K8S集群中,前端接口应用被强制重启,其中未有异常日志。
环境
- 项目采用Spring Cloud微服务架构,全部打包docker镜像。
- undertow做Web容器 – undertow版本—— 2.0.28.Final。
- 使用阿里云K8S容器服务部署。
- Spring Boot版本——2.2.1.RELEASE。
原因
直接说原因吧,由于undertow web容器,采用了默认配置,没有手动分配线程数,而导致默认线程数过小,系统响应超时,而集群心跳检测时无法响应,认为应用已经挂掉,则强制重启了应用。
默认情况下,undertow的工作线程是以系统获取的CPU个数为基础分配计算的,当CPU数与2取最大值=io-worker,测试了一下,容器内部获取CPU为1,则 io-worker =2。
而workerThreads= ioThreads * 8 ,实际值则为16,一个实例仅16个线程,明显无法满足需求,导致大量等待请求,最终被强制重启。
undertow官方源码可参考如下:
https://github.com/undertow-io/undertow/blob/master/core/src/main/java/io/undertow/Undertow.java
ioThreads = Math.max(Runtime.getRuntime().availableProcessors(), 2); workerThreads = ioThreads * 8;
解决办法
最简单的办法,则是手动配置workerThreads值,这个是比较重要的参数,根据服务器的配置设置相应的值,一般来说最少128以上吧。
版权声明:除特殊说明,文章均为博主 久酷 原创文章,转载请注明来源