背景

在Linux上可以实现CPU孤立,从而让孤立的CPU实现单任务执行,减少其他任务使用该CPU,以提升单CPU的运行效率。通过任务绑核操作,达到CPU亲和性的目的。
什么是CPU亲和性,以下摘自维基百科。

处理器亲和性又称处理器关联。通过处理器关联可以将虚拟机或虚拟处理器映射到一个或多个物理处理器上。该技术基于对称多处理机操作系统中的native central queue调度算法。队列(queue)中的每一个任务(进程或线程)都有一个标签(tag)来指定它们倾向的处理器。在分配处理器的阶段,每个任务就会分配到它们所倾向的处理器上。
处理器亲和性利用了这样一个事实,就是进程上一次运行后的残余信息会保留在处理器的状态中(也就是指处理器的缓存)。如果下一次仍然将该进程调度到同一个处理器上,就能避免一些不好的情况(比如缓存未命中),使得进程的运行更加高效。
调度算法对于处理器亲和性的支持各不相同。有些调度算法在它认为合适的情况下会允许把一个任务调度到不同的处理器上。比如当两个计算密集型的任务(A和B)同时对一个处理器具有亲和性时,另外一个处理器可能就被闲置了。这种情况下许多调度算法会把任务B调度到第二个处理器上,使得多处理器的利用更加充分。
处理器亲和性能够有效地解决一些高速缓存的问题,但却不能缓解负载均衡的问题。而且,在异构系统中,处理器亲和性问题会变得更加复杂。

总结就是:CPU亲和性提升了单CPU的运行效率,因为CPU只执行单个任务,降低了任务切换的成本。同时也来带了无法负载均衡任务。

所以,CPU亲和性的主要目的是为了执行并行任务,而非并发任务,此为大前提。

实现

目前只在Linux上实现

  1. 决定所需要孤立的CPU

    • 通过htop指令看到本机的CPU编号,总共有6个核心,实际编号是0-5,因此在孤立CPU的时候,应该以后者为准。

    • 在grub中设置需要孤立的CPU

      1
      sudo vi /etc/default/grub
    • 在GRUB_COMLINE_LINUX_DEFAULT的配置中,配置类似于如下的配置以隔离CPU

    • 执行 sudo update-grub使其生效。

  2. 中断均衡服务

    • 通过执行sudo sysv-rc-conf --level 123456 irqbalance off中断均衡服务

测试

  1. 执行stress -c 6可以看到
    CPU:1,2,3已经被孤立了,不参与任务的负载均衡。
  1. 执行taskset -c 1 stress -c 1可以看到 CPU1单独执行任务,其他CPU并不参与任务的负载均衡。

结论

根据以上的配置,通过孤立CPU,达到任务的CPU亲和性的目的。