我的应用程序是一个“每个请求一个线程”的 Web 服务器,具有 M
个线程的线程池。单个请求的所有处理都在同一个线程中运行。
假设我在一台有 N
核心的计算机上运行应用程序。我想配置 M
来限制 CPU 使用率:例如高达所有 CPU 的 50%
。
如果处理完全受 CPU 限制,那么我会将 M
设置为 N/2
。但是,处理会执行一些 IO。
我可以使用不同的 M
运行应用程序并使用 top -H
、ps -L
、jstat
等来监控它。
你建议我如何估算 M
?
最佳答案
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%。
关于java - 限制CPU使用的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30150735/