K8S集群中高并发应用undertow线程数不足引起的重启

问题

在高并发环境时间段,K8S集群中,前端接口应用被强制重启,其中未有异常日志。

环境

  1. 项目采用Spring Cloud微服务架构,全部打包docker镜像。
  2. undertow做Web容器 – undertow版本—— 2.0.28.Final。
  3. 使用阿里云K8S容器服务部署。
  4. 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以上吧。

Leave a Reply


正在读取数据……