【问题标题】:cpu affinity, allowing only process to run on a specific cpucpu 亲和性,只允许进程在特定 cpu 上运行
【发布时间】: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 值——该测量值可能相对精确。

标签: linux bash affinity


【解决方案1】:

我已经在原始问题的一系列 cmets 中对此进行了讨论,但我认为这是“对潜在问题的答案”,而不是对您的特定问题的具体答案,所以我们开始吧:

这个问题我听过几次了,而且一直都是 出于对如何同时进行多处理的误解而被问到 作品。首先:为什么你需要核心#0 上的进程?你 有原因吗?

通常,Linux 内核在调度任务方面非常有效 处理器以最大限度地减少负面影响的方式 进程迁移或单核瓶颈会带来。实际上, 很少看到有人通过手动获得性能 设置亲和力,这通常只发生在用户空间 进程与内核模块密切通信,对于某些 硬件或实现原因本质上是单线程的,并且 不容易迁移。

您的问题本身显示了一个小误解:亲和力意味着 内核知道它应该在 给定核心。因此,其他进程将自动迁移出去 从那个核心开始,并且只有在你想要的任务离开时才在那里运行 很多核心未使用。要更改您的流程的“优先级” CPU 分配,只需更改其不错的值即可。

原因是通过隔离正在运行的进程来进行性能测量。关于第二条评论,这意味着我们必须依赖操作系统 调度程序,因为它不会在核心上运行后台进程 当前在有空闲内核时利用率为 100%。

您衡量的不是流程的性能 孤立地,但进程,绑定到单个CPU!为一个 单线程进程没问题,但想象一下你的进程可能 有多个线程——这些通常会在不同的线程上运行 核心,整体性能会高得多。一般可以试试 只是最小化您机器上的非进程工作负载(即在没有 正在运行的窗口管理器/会话管理器,停止所有不必要的 services) 并使用一个非常小的不错的值——该度量可能是 比较精确。

另外,time 命令可以让您知道一个进程需要多少时间 完全花费(包括等待),作为用户态进程占用 CPU, 并在系统调用中占用 CPU - 我认为这可能符合您的需求 很好:)

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2014-08-30
    相关资源
    最近更新 更多