我们需要 JVM 保留一定数量的 CPU。根据我的研究,我们可以taskset
与内核参数一起使用isolcpus=<CPU_ID>
,这样就没有其他进程使用该 CPU。
出现几个问题:
- 该过程需要从 开始吗
taskset
? - 预留是否意味着该进程只能在该 CPU 上运行,如果存在资源问题,它可以扩展到其他 CPU?
答案1
您通常用于taskset
在进程启动后对其进行限制。您可以使用 来pidof java
确定 Java 应用程序的 PID,然后将其传递给taskset
:
$ taskset -p $(pidof java) --cpu-list 0-2,5
笔记:如果您有 6 个 CPU,则 0、1、2、5 将为您的 JVM PID 分配与这些 CPU 的关联性。
请记住,关联性并不限制其他进程使用这些 CPU,taskset
它更像是一种将特定进程或进程限制到一组特定 CPU 的工具,而不是限制排他性。
任务集用于在给定 PID 的情况下设置或检索正在运行的进程的 CPU 亲和力,或使用给定的 CPU 亲和力启动新的命令。 CPU 关联性是一种调度程序属性,它将进程“绑定”到系统上给定的一组 CPU。 Linux 调度程序将遵循给定的 CPU 关联性,并且该进程不会在任何其他 CPU 上运行。请注意,Linux 调度程序还支持自然 CPU 亲和性:出于性能原因,调度程序会尝试将进程保持在同一 CPU 上,只要可行。因此,强制特定的 CPU 关联性仅在某些应用程序中有用。
备择方案
这个自我回答的 U&L 问答题为:如何使用cgroups将除白名单之外的所有进程限制为单个CPU?涵盖如何使用 cgroup 来完成此任务的主题。