限制CPU使用的线程数

3

我的应用程序是一个“每请求一个线程”的Web服务器,具有 M 个线程的线程池。单个请求的所有处理都在同一线程中运行。

假设我在具有 N 个核心的计算机中运行应用程序。我希望配置 M 以限制CPU使用率:例如,最多使用 50% 的所有CPU。

如果处理完全受CPU限制,则将 M 设置为 N/2。但是,处理还涉及一些IO。

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

您会如何建议我估计 M?


1
无论您选择什么M值,如果M大于M/2,服务器将并行处理N个请求,并且可能会消耗超过50%的CPU(如果它们可用)。如果您想要一个限制,操作系统应该设置它,而不是JVM。 - JB Nizet
1
CPU使用率是一项统计数据而非资源浪费。为什么不限制进程优先级呢?线程的作用不仅在于优化处理时间,还可以让编程更加容易。你可以拥有所需的线程数量,并且不会对其他进程产生太多干扰。 - aalku
为什么要限制CPU使用率?有了它,就使用它。当它不足时,进行扩展。如果不能扩展,你的业务模型存在严重问题。 - Markus W Mahlberg
安装一个硬件虚拟机(http://en.wikipedia.org/wiki/Comparison_of_platform_virtualization_software),并将其设置为占用50%的CPU时间。 - Alexei Kaigorodov
2个回答

2
拥有50%的CPU使用率并不一定意味着线程数量需要是N_Cores / 2。在处理I/O时,CPU会浪费很多周期等待数据从设备到达。
因此,您需要一个工具来测量真实的CPU使用率,并通过实验,逐渐增加线程数,直到真实的CPU使用率到达50%为止。
Linux下的perf就是这样的工具。这个问题讨论了如何测量Linux中的真实CPU使用率。同时,请务必收集系统整体的统计信息:perf record -a。
您关心的是CPU发出和执行尽可能多的指令/周期(IPC)。现代服务器可以在强烈的计算受限工作负载中执行高达4个IPC。要获得良好的CPU利用率,您需要尽可能接近该值,这意味着您需要增加线程数。当然,如果有太多的I/O操作,由于带来一些惩罚(缓存刷新、内核代码等),这将是不可能的。
因此,最终答案就是增加线程数,直到真实的CPU使用率达到50%为止。

0

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

我认为您只能尝试使用不同的参数,或者应用程序可以自己监视其CPU使用情况并动态调整池。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接