在当今的高性能计算、实时任务处理及云原生环境中,通过CPU隔离的方式确保关键业务的高性能运行,已成为企业提升系统效率主要方法。KOS(KeyarchOS)作为面向企业级场景的国产服务器操作系统,深度整合了多种CPU隔离技术。本文基于KOS最新版本(2025年)的核心能力,深入解析CPU隔离技术、使用方式及典型应用场景。
Isolcpus隔离方式
Isolcpus 是Linux内核的一个启动参数,用于隔离指定的CPU核心,使其不被系统默认的进程调度器使用,一般在高性能计算、实时任务或低延迟场景下被广泛使用。其主要作用:隔离CPU核心给特定任务进程,禁止普通进程或系统进程自动调度到被隔离的CPU核心,减少特定任务进程的上下文的切换和干扰。
启用isolcpus隔离功能可以通过grubby命令完成。
grubby --update-kernel=ALL --args="isolcpus=<CPU列表>"
如隔离1,2,3核心可以使用以下命令
grubby --update-kernel=ALL --args="isolcpus=1,2,3"
设置后需要重启操作系统以使配置生效。再重启系统后可以查看当前系统的启动参数是否有isolcpus=1,2,3字样。
cat /proc/cmdline | grep isolcpus
通过 taskset 或 cpuset 将进程绑定到隔离的 CPU。
taskset -c 1,2,3 <your_command>
your_command替换成要执行的命令。
我们编写一个测试用例,该测试用例将生成一个进程,在进程中创建20个线程,每个线程完全占用CPU时间。在没有指定CPU核心的情况下,进程在被隔离的CPU核心外的核心上运行(图1所示),使用taskset后,进程在被隔离的CPU核心上运行(图2所示)。
图1 测试程序在被隔离的cpu核心之外运行,且占用CPU的利用率极高
图2 测试程序在隔离的CPU核心上运行,且占用CPU的利用率极高
要注意的是Isolcpus隔离CPU核心的方式并不能完全将所有的任务都排除在被隔离的CPU核心上。要使该功能达到目标最好同步使用nohz_full启动参数。并且在设置完成后还需要花点时间找到在被隔离的CPU核心上的中断和内核线程,将这些中断、内核线程到其它的CPU核心上。
cgroups/cpuset 动态隔离方式
Cpuset是Linux内核提供的一种资源管理机制,通过cgroups子系统将CPU和内存节点(NUMA)动态分配给特定任务组,实现资源隔离与精细化调度。使用 cpuset可以高效隔离CPU资源,将进程绑定到指定的CPU核心,避免资源争用,提升关键任务的性能稳定性。
以下是使用cpuset动态隔离进程的方法。
进入/sys/fs/cgroup/cpuset创建自定义的cpuset组
mkdir /sys/fs/cgroup/cpuset/testisolcpus
绑定testisolcpus的cpu集合。
echo 2-4 > /sys/fs/cgroup/cpuset/testisolcpus/cpuset.cpus
绑定进程到testisolcpus组中
cgexec -g cpuset:testisolcpus /path/to/application
依旧采用上述测试用例,可以发现进程在cpu 2-4上运行(图3所示)。
图3 进程在testisolcpus组的cpu中运行且占用CPU的利用率极高
dyn_isolcpus的动态隔离方式
动态CPU隔离技术是相对于isolcpus静态隔离改进而来,该功能由龙蜥社区开发,支持系统运行时动态更改CPU隔离配置,适应运行时关键任务变化场景。
通过该方式设置隔离的CPU核心的过程中会更新进程的CPU亲和性掩码,检查进程当前CPU亲和性掩码,如果进程的亲和性掩码与当前设置的隔离策略冲突,系统将更新为新的掩码集合,以确保进程仅在允许的CPU集合上运行;会重建调度域,默认调度策略不再将任务调度到被隔离的CPU上;会设置无绑定工作队列的CPU执行掩码,对于无绑定工作队列(unbound workqueue)任务,系统会调整其CPU执行掩码,使得这些任务可以在任意可用的CPU上执行,避免被隔离的CPU限制,从而保持系统负载的均衡。
新增/proc/dyn_isolcpus配置接口,允许用户通过该接口设置隔离策略。例如,要隔离CPU核心2、3、4和5,可以写入“2,3,4,5”或“2-5”。
本次测试依旧采用上述测试用例,将8-10核心设置为隔离的CPU核心。
可以看到在不指定CPU核心的情况下运行测试用例,CPU核心8-10不再被调度任务(图4)。
图4 8-10核心不再被调度任务
总结
可以通过上面三种方式在KOS上使用CPU隔离功能,可显著提升关键业务的性能,能有效避免资源争用、减少上下文切换及硬件中断的干扰,从而降低关键任务的延迟波动,有效保障高优先级业务的服务质量,最大化硬件利用率,为高性能计算、边缘智能、实时控制等场景提供底层算力保障。