Java Spring Kubernetes 上的 Webflux:总是 [or-http-epoll-1]、[or-http-epoll-2]、[or-http-epoll-3]、[or-http- epoll-4] 尽管配置了资源
Java Spring Webflux on Kubernetes: always [or-http-epoll-1], [or-http-epoll-2], [or-http-epoll-3], [or-http-epoll-4] despite configured resource
关于 Java 11 Spring Webflux 2.6.6+ 网络应用程序的小问题,请使用 Kubernetes 进行容器化和部署。
从 Web 应用程序的应用程序日志中,我看到如下内容:
INFO [service,1bcce5941c742568,22c0ab2133c63a77] 11 --- [or-http-epoll-2] a.b.c.SomeClass : Some message from the reactive pipeline.
INFO [service,67cb40974712b3f4,15285d01bce9dfd5] 11 --- [or-http-epoll-4] a.b.c.SomeClass : Some message from the reactive pipeline.
INFO [service,5011dc5e09de30b7,f58687695bda20f2] 11 --- [or-http-epoll-3] a.b.c.SomeClass : Some message from the reactive pipeline.
INFO [service,8046bdde07b13261,5c30a56a4a603f4d] 11 --- [or-http-epoll-1] a.b.c.SomeClass : Some message from the reactive pipeline.
而且总是,我只能看到 [or-http-epoll-1] [or-http-epoll-2] [or-http-epoll-3] [or-http-epoll-4]
,我认为它代表:[reactor-http-epoll-N]
问题是,无论我从 Kubernetes 分配多少 CPU,总是那 4 个,不多不少。
我试过了:
resources:
requests:
cpu: 1
memory: 1G
limits:
cpu: 2
memory: 2G
resources:
requests:
cpu: 4
memory: 4G
limits:
cpu: 6
memory: 6G
resources:
requests:
cpu: 10
memory: 10G
limits:
cpu: 10
memory: 10G
但同样,总是只有那 4 个。
我很难理解这里的问题是什么,为什么我坚持使用 only/always 4 "or-http-epoll-"。
谢谢
默认情况下,WebFlux 使用 Netty 作为底层 Web 服务器。这是 Netty 如何确定池中的线程数 Netty - LoopResources
/**
* Default worker thread count, fallback to available processor
* (but with a minimum value of 4)
*/
int DEFAULT_IO_WORKER_COUNT = Integer.parseInt(System.getProperty(
ReactorNetty.IO_WORKER_COUNT,
"" + Math.max(Runtime.getRuntime().availableProcessors(), 4)));
下一个问题,现在的Runtime.getRuntime().availableProcessors()
是多少?
这取决于 Java 版本。在 Java 版本 10 之前,Docker 上的应用程序在机器上而不是容器内看到 CPU。
您可以创建一个简单的 Java 应用程序来验证
class TestCpu {
public static void main(String[] args) {
int processors = Runtime.getRuntime().availableProcessors();
System.out.println("CPU cores: " + processors);
}
}
关于 Java 11 Spring Webflux 2.6.6+ 网络应用程序的小问题,请使用 Kubernetes 进行容器化和部署。
从 Web 应用程序的应用程序日志中,我看到如下内容:
INFO [service,1bcce5941c742568,22c0ab2133c63a77] 11 --- [or-http-epoll-2] a.b.c.SomeClass : Some message from the reactive pipeline.
INFO [service,67cb40974712b3f4,15285d01bce9dfd5] 11 --- [or-http-epoll-4] a.b.c.SomeClass : Some message from the reactive pipeline.
INFO [service,5011dc5e09de30b7,f58687695bda20f2] 11 --- [or-http-epoll-3] a.b.c.SomeClass : Some message from the reactive pipeline.
INFO [service,8046bdde07b13261,5c30a56a4a603f4d] 11 --- [or-http-epoll-1] a.b.c.SomeClass : Some message from the reactive pipeline.
而且总是,我只能看到 [or-http-epoll-1] [or-http-epoll-2] [or-http-epoll-3] [or-http-epoll-4]
,我认为它代表:[reactor-http-epoll-N]
问题是,无论我从 Kubernetes 分配多少 CPU,总是那 4 个,不多不少。
我试过了:
resources:
requests:
cpu: 1
memory: 1G
limits:
cpu: 2
memory: 2G
resources:
requests:
cpu: 4
memory: 4G
limits:
cpu: 6
memory: 6G
resources:
requests:
cpu: 10
memory: 10G
limits:
cpu: 10
memory: 10G
但同样,总是只有那 4 个。
我很难理解这里的问题是什么,为什么我坚持使用 only/always 4 "or-http-epoll-"。
谢谢
默认情况下,WebFlux 使用 Netty 作为底层 Web 服务器。这是 Netty 如何确定池中的线程数 Netty - LoopResources
/**
* Default worker thread count, fallback to available processor
* (but with a minimum value of 4)
*/
int DEFAULT_IO_WORKER_COUNT = Integer.parseInt(System.getProperty(
ReactorNetty.IO_WORKER_COUNT,
"" + Math.max(Runtime.getRuntime().availableProcessors(), 4)));
下一个问题,现在的Runtime.getRuntime().availableProcessors()
是多少?
这取决于 Java 版本。在 Java 版本 10 之前,Docker 上的应用程序在机器上而不是容器内看到 CPU。
您可以创建一个简单的 Java 应用程序来验证
class TestCpu {
public static void main(String[] args) {
int processors = Runtime.getRuntime().availableProcessors();
System.out.println("CPU cores: " + processors);
}
}