java - 限制CPU使用的线程数

标签 java multithreading performance jvm cpu-usage

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

假设我在一台有 N 核心的计算机上运行应用程序。我想配置 M 来限制 CPU 使用率:例如高达所有 CPU 的 50%

如果处理完全受 CPU 限制,那么我会将 M 设置为 N/2。但是,处理会执行一些 IO。

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

你建议我如何估算 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/

相关文章:

java - Bean 不从不同的包 Autowiring

java - RxJava - 通过另一个控制一个 Observable

c# - 使用 Azure WebJobs 调用静态方法

iphone - 当我从 Xib 文件加载自定义 UITableViewCells 时发生泄漏?

java - JPanel 以 BoxLayout 和 ScrollPane 作为其父级

c# - C#线程和类问题

java - 无法在线程内加载平铺 map 而不出现故障(libgdx)

performance - 如何忽略 JMeter 中的登录和注销请求?

c++ - OpenMP中的每个线程执行相同数量的工作是否正常?

java - SHA256 是否具有良好的跨平台支持?