限制CPU使用率的线程数

时间:2015-05-10 11:15:13

标签: java multithreading performance jvm cpu-usage

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

假设我在具有SELECT d.name, d.department_id, d.email , CASE WHEN d.status = 1 THEN 'Active' ELSE 'Inactive' END as status, dep.name as dep_name FROM doctors d INNER JOIN departments dep ON dep.id = d.department_id 内核的计算机上运行该应用程序。我想配置M来限制CPU使用率:例如最多N个所有CPU。

如果处理完全 CPU绑定,那么我会将M设置为50%。但是处理会有一些IO。

我可以使用不同的M运行该应用,并使用N/2Mtop -H等来监控它。

您如何建议我估算ps -L

2 个答案:

答案 0 :(得分:2)

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

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

Linux的

性能就是这样一个工具。 This 问题解决了这个问题。另外一定要收集整个系统的统计数据: perf record -a

您感兴趣的是您的CPU发出并执行尽可能多的指令/周期(IPC)。现代服务器可以执行多达4个IPC,用于强大的计算绑定工作负载。您希望尽可能接近以获得良好的CPU利用率,这意味着您需要增加线程数。当然,如果由于许多上下文切换带来一些惩罚(缓存刷新,内核代码等)而导致许多I / O无法实现

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

答案 1 :(得分:0)

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

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