我使用运行 Java JVM 的 Linux 系统,该 JVM 创建新线程(进程)来处理工作负载。线程复杂性无法预先预测,有些线程最终会比其他线程执行更多的 CPU 密集型工作。我们遇到了一个问题,当启动了太多线程时,CPU 使用率会令人不安地接近 100%,而空闲百分比很低。我知道如果 CPU 使用率过高,其他正在运行的服务会受到影响,例如,系统在重新启动之前不会接受新的 ssh 登录。
是否没有可以在系统级别配置的自动化进程监视器,以防止用户进程的 CPU 使用率过高,从而不会影响系统服务?
答案1
Linux 下的大部分用户进程在启动时都具有相同的优先级,并平等共享时间片。所有线程也平等共享时间片,因此当线程过多时,其他进程可能需要等待很长时间才能获得下一个时间片。
至少有三种方法可以控制进程获得的 CPU 时间:
- 该
nice
命令可以手动降低任务的优先级。 - 该
cpulimit
命令可以暂停一个进程以避免它超出限制限度。 - Linux对照组(cgroups)可以限制进程可用的资源量。
更多信息请参阅文章
使用 nice、cpulimit 和 cgroups 限制进程 CPU 使用率。
答案2
替代解决方案:如果您将 JVM 作为 Docker 容器运行,则该docker run
命令有许多选项可以限制 CPU 使用率(CPU 数量、CPU 配额......)。
使用容器还可以使您的应用程序更易于部署和管理。