限制 CPU 使用的线程数
Number of threads to limit CPU usage
我的应用程序是一个 "thread-per-request" 网络服务器,具有 M
个线程的线程池。在同一线程中对单个请求 运行 的所有处理。
假设我 运行 在具有 N
个内核的计算机中安装应用程序。我想配置 M
来限制 CPU 的使用:例如最多 50%
个 CPU 个。
如果处理 完全 CPU 绑定,那么我会将 M
设置为 N/2
。但是处理会做一些 IO。
我可以运行 具有不同M
的应用程序并使用top -H
、ps -L
、jstat
等来监视它。
你建议我如何估算 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%。
我的应用程序是一个 "thread-per-request" 网络服务器,具有 M
个线程的线程池。在同一线程中对单个请求 运行 的所有处理。
假设我 运行 在具有 N
个内核的计算机中安装应用程序。我想配置 M
来限制 CPU 的使用:例如最多 50%
个 CPU 个。
如果处理 完全 CPU 绑定,那么我会将 M
设置为 N/2
。但是处理会做一些 IO。
我可以运行 具有不同M
的应用程序并使用top -H
、ps -L
、jstat
等来监视它。
你建议我如何估算 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%。