限制 CPU 使用的线程数

Number of threads to limit CPU usage

我的应用程序是一个 "thread-per-request" 网络服务器,具有 M 个线程的线程池。在同一线程中对单个请求 运行 的所有处理。

假设我 运行 在具有 N 个内核的计算机中安装应用程序。我想配置 M 来限制 CPU 的使用:例如最多 50% 个 CPU 个。

如果处理 完全 CPU 绑定,那么我会将 M 设置为 N/2。但是处理会做一些 IO。

我可以运行 具有不同M 的应用程序并使用top -Hps -Ljstat 等来监视它。

你建议我如何估算 M

这完全取决于您的特定软件和硬件。 硬件很重要,因为如果线程阻塞写入慢速磁盘,则需要很长时间才能再次唤醒(并再次消耗 cpu),但如果磁盘真的很快,阻塞只会切换 cpu 上下文,但是该线程将立即再次 运行。

我认为您只能尝试使用不同的参数,否则该应用可能会监控它 CPU 使用自身并动态调整池。

CPU 使用率为 50% 并不一定意味着线程数需要为 N_Cores / 2。在处理 I/O 时,CPU 在等待数据从设备到达时浪费了很多周期。

因此您需要一个工具来衡量实际CPU使用情况并且通过实验,您可以增加线程数量直到实际CPU使用情况消失到 50%。

perf for Linux就是这样一个工具。 This问题解决了问题。还要确保在系统范围内收集统计信息:perf record -a.

您对CPU发出和执行尽可能多的指令/周期 (IPC) 感兴趣。现代服务器最多可以执行 4 个 IPC,以应对密集的计算密集型工作负载。您希望尽可能接近它以获得良好的 CPU 利用率,这意味着您需要增加线程数。当然,如果有很多 I/O 是不可能的,因为许多上下文切换会带来一些惩罚(缓存刷新、内核代码等)

所以最终的答案是增加线程数,直到实际 CPU 使用率达到 50%。