Linux 为特定任务或进程设置处理器亲和性
当您使用 SMP(对称多处理)时,您可能想要覆盖内核的进程调度并将某个进程绑定到特定的 CPU。
但是 CPU 亲和性是什么?
CPU 亲和性只不过是一种调度程序属性,它将进程“绑定”到 SMP 系统上的一组给定 CPU。Linux 调度程序将遵守给定的 CPU 亲和性,并且该进程不会在任何其他 CPU 上运行。请注意,Linux 调度程序还支持自然 CPU 亲和性:
出于性能原因,调度程序会尝试尽可能长时间地将进程保持在同一个 CPU 上。因此,强制使用特定的 CPU 亲和性仅在某些应用程序中有用。例如,Oracle(ERP 应用程序)等应用程序使用每个许可实例的 CPU 数量。您可以将 Oracle 绑定到特定 CPU 以避免许可问题。这对于具有 4 个或 8 个 CPU 的大型服务器非常有用
使用taskset命令设置特定任务或进程的处理器亲和性
taskset 用于根据给定的 PID 设置或检索正在运行的进程的 CPU 亲和性,或根据给定的 CPU 亲和性启动新的命令。但是,默认情况下不安装 taskset。您需要安装 schedutils(Linux 调度程序实用程序)包。
安装 schedutils
Debian Linux:
# apt-get install schedutils
Red Hat Enterprise Linux:
# up2date schedutils
或者
# rpm -ivh schedutils*
在最新版本的 Debian / Ubuntu Linux 下,使用 util-linux 包默认安装任务集。
CPU 亲和性以位掩码表示,最低位对应第一个逻辑 CPU,最高位对应最后一个逻辑 CPU。例如:
- 0x00000001 是处理器 #0(第一个处理器)
- 0x00000003 是处理器 #0 和 #1
- 0x00000004 是处理器 #2(第 3 个处理器)
要将进程 13545 的处理器亲和性设置为处理器 #0(第一个处理器),请输入以下命令:
# taskset 0x00000001 -p 13545
如果您发现位掩码难以使用,则可以使用-c标志指定处理器的数字列表,而不是位掩码:
其中,
# taskset -c 1 -p 13545
# taskset -c 3,4 -p 13545
- -p:对现有的PID进行操作,不启动新任务(默认是启动新任务)
参见:
- 如何找出 Linux CPU 利用率?
- Linux 在 SMP 模式下限制或约束 SMP CPU 激活
- 阅读 sched_setscheduler(2) 和 taskset(1) 的手册页以了解更多信息。
已更新以确保准确性。