我在Kubernetes中部署了一个Java服务,它使用并行流进行并发处理。我读到,产生的线程数量是由机器在并行流中的核心数量决定的。如果我的Kubernetes CPU配置是0.8m limit(0.8 milliCPU),那么会产生多少线程?我试图从线程使用的Angular 来理解并行流在这种受限环境中的行为。
根据分配的CPU资源,我怀疑并行流(ForkJoinPool)产生的线程数将是0-1。但是,我不确定在这个场景中使用的线程的确切数量。会不会考虑节点核心?
有人能解释一下当服务部署在Kubernetes中时,Java中的并行流会产生多少线程吗?此外,任何对可能影响这种环境中线程数量的因素的见解都将受到极大的赞赏。
提前感谢您的帮助!
1条答案
按热度按时间fquxozlt1#
公共池中的线程数量等于
Runtime.getRuntime().availableProcessors().
返回的可用处理器(核心)数量记住,当您的服务在Kubernetes pod中运行时,JVM不知道您在pod规范中设置的CPU限制。JVM看到运行它的底层节点上可用的内核数量,而不是pod规范中设置的限制。这将导致availableProcessors()
返回节点上可用的内核数量。例如,如果您为pod设置的CPU限制小于1个CPU,例如0.8m CPU(相当于0.0008个CPU核心,因为m代表milliCPU单位),则您的服务最终可能会创建比您设置的限制内可用CPU更多的线程。同样重要的是要注意,在设置CPU限制时,0.8m是CPU核心的0.0008,而不是CPU核心的0.8。
附件是与此相关的资源材料,对您的用例有帮助。[1] [2]
[1][https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/](https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)
[2][https://developers.redhat.com/blog/2017/04/04/openjdk-and-containers](https://developers.redhat.com/blog/2017/04/04/openjdk-and-containers)的