Небольшой вопрос относительно веб-приложения Java 11 Spring Webflux 2.6.6+, контейнеризованного и развернутого с использованием Kubernetes.
Из журналов приложений веб-приложений я вижу такие вещи, как:
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]
Проблема в том, что сколько CPU я не выделяю из Kubernetes, всегда эти 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.
Мне трудно понять, в чем здесь проблема, и почему я застрял только/всегда с 4 "или-http-epoll-".
Спасибо
У меня была возможность посмотреть ссылку. Особенно ответ: «Количество потоков по умолчанию зависит от количества ядер хост-системы». Вот почему я задаю свой вопрос. Я настроил другой вариант количества ядер, но все равно вижу то же самое.
По умолчанию WebFlux использует 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 видит ЦП на машине, а не внутри контейнера.
Вы можете создать простое Java-приложение для проверки
class TestCpu {
public static void main(String[] args) {
int processors = Runtime.getRuntime().availableProcessors();
System.out.println("CPU cores: " + processors);
}
}
Это действительно правильный ответ. По какой-то причине этот фрагмент кода всегда показывает одно и то же число, независимо от того, сколько ЦП я выделяю со стороны Kubernetes. Я считаю, что это скорее проблема Kubernetes, а не проблема Spring. Спасибо
какую версию java вы используете для контейнеров?
В качестве базового образа я использую обычную alpine java 11, а для Kubernetes использую AKS
Отвечает ли это на ваш вопрос? WebFlux — темы Reactor Http Epoll