我想创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads)
POD资源配置如下
"limits": {
"cpu": "800m",
"memory": "1000Mi"
},
"requests": {
"cpu": "23m",
"memory": "288Mi"
}
使用此配置,我不确定如何正确确定线程数。
我在哪里看到过这个方程
Number of Threads = Number of Available CPU Cores * Target CPU Utilization * (1 + Wait Time / Compute Time)
如果这个方程有效,那么我做了一些计算,假设目标 CPU 利用率为 80%,I/O 密集型应用程序的等待时间/计算时间为 10/1。 可用 CPU 核心数 = 800m,来自上述配置,我将其理解为 0.8 核心 所以计算就变成 = 0.8 * 0.8 * (1 + 10/1)
Java版本:11
那么这是否正确,如果不正确那么我如何确定线程数?
要计算或确定 kubernetes 中的线程池大小,您使用的公式是正确的,公式是
线程数 = 可用 CPU 核心数 * 目标 CPU 利用率 * (1 + 等待时间 / 计算时间)。
在计算之前我们需要考虑以下两点:
Kubernetes 对 CPU 使用 millicore(或 millicpu)分辨率,1000m 等于 1 个 CPU 核心,800m 等于 0.8 个 CPU 核心。根据您的计算,上述配置中可用 CPU 核心数 = 800m,我将其理解为 0.8 核心。
如果您有计算密集型任务,那么我们的(等待时间/计算时间)= 1/10。如果您有 IO 繁重的任务并且我们的(等待时间/计算时间)= 10/1
基于以上要求,
如果您有计算密集型任务,那么
Number of Threads = 0.8* 0.8* (1 + 1/10) = 0.704
如果你有IO繁重的任务那么
Number of Threads = 0.8* 0.8* (1 + 10/1) = 7.04.
请参阅 Mucahit Kurt 的 Finding Ideal JVM Thread Pool Size With Kubernetes 了解更多信息。