我想知道在什么场景下设置 CPU 亲和性是有价值的。
答案1
通常,CPU 亲和性用于进程隔离或减少资源争用。高频交易是我使用的应用程序CPU 组和 CPU 屏蔽但我也看到了科学/计算计算 (HPC)、实时应用程序和电子商务中的应用。专业音频应用程序是另一个需要实时内核和 CPU 亲和性集的常见示例。
从基本层面来说,任务集命令用于分配亲和力。
这是一个使用 cset 为特定应用程序/进程创建 CPU 组的教程,它比 taskset 更有条理一些。 https://rt.wiki.kernel.org/index.php/Cpuset_management_utility/tutorial
答案2
CPU 亲和性在两种情况下很重要:最常见的情况是当您的工作负载从 CPU 缓存中受益匪浅,并且存在足够的资源争用导致作业在核心或 CPU 之间移动时,这会导致每个 CPU 都需要使其缓存无效并重建缓存。这种情况的更极端版本发生在具有非均匀内存架构 (NUMA) 的系统上,其中 RAM 组物理连接到特定 CPU,该 CPU 始终可以更快地访问该内存。
一般来说,对于这种问题,您确实需要先对其进行监控,看看它是否是个问题 - 如果您的应用程序受 I/O 限制,那么摆弄 CPU 调度是没有意义的 - 这可以像运行 top 并观察 CPU 列以查看作业是否在跳动一样简单。还有一些基本的系统配置工作,确保您频繁访问的任何内存块实际上都可以容纳在任何一个 CPU 上附加的内存量中。
对于测试,设置亲和力的最简单方法是使用任务集实用程序。您可能还想看看库函数因为 numactl 为 CPU 和内存分配提供了独立的控制,更重要的是,libnuma 库为您的应用程序提供了一种编程方式来请求有利的分配:例如,您可能想要请求将一组共享某些数据结构的线程分配给同一 CPU 上的其他核心,而不必承受通过互连带来的性能损失。