【发布时间】:2015-08-21 21:10:56
【问题描述】:
我想通过
将进程绑定到特定的核心#0(cpu 亲和力)taskset -c 0 ./run_prog
当它自己的程序在核心#0 上运行时,操作系统可能会决定将其他后台和活动进程运行到核心#0。换句话说,该命令将run_prog 严格限制为核心#0,但不会阻止其他进程在核心#0 上运行,这很糟糕!
有没有办法编写一个 bash 脚本来首先阻止在核心 #0 上运行的活动进程,然后运行该任务集命令?
【问题讨论】:
-
我已经听过这个问题几次了,总是因为对同时多处理工作原理的误解而被问到这个问题。首先:为什么你需要核心#0 上的进程?你有理由吗?
-
通常,Linux 内核在将任务调度到处理器方面非常有效,这种方式可以最大限度地减少进程迁移或单核瓶颈带来的负面影响。事实上,很少有人通过手动设置亲和性来真正获得性能,而且这通常只发生在用户态进程与内核模块密切通信时,由于某些硬件或实现原因,内核模块本质上是单线程的并且不容易被迁移。
-
您的问题本身显示了一个小误解:亲和力意味着内核知道它应该在给定的内核上安排该进程。因此,其他进程将自动从该核心迁移出去,并且只有在您所需的任务留下很多未使用的核心时才会在那里运行。要更改您的进程在 CPU 分配中的“优先级”,只需更改其
nice值即可。 -
@Marcus Müller:原因是通过隔离正在运行的进程来进行性能测量。关于第二条评论,这意味着我们必须依赖 OS 调度程序,因为它不会在当前有 100% 空闲内核的内核上运行后台进程。谢谢
-
您测量的不是孤立的进程的性能,而是绑定到单个 CPU 的进程的性能!对于单线程进程来说没问题,但想象一下您的进程可能有多个线程——这些线程通常会在不同的内核上运行,整体性能会高得多。一般来说,尽量减少机器上的非进程工作负载(即在没有运行窗口管理器/会话管理器的情况下运行,停止所有非必要服务)并使用非常小的
nice值——该测量值可能相对精确。