我想通过
将进程绑定到特定的核心#0(cpu affinity)taskset -c 0 ./run_prog
当它自己的程序在核心#0上运行时,操作系统可能决定将其他后台和活动进程运行到核心#0。换句话说,该命令严格限制run_prog
到核心#0,但不阻止其他进程在核心#0上运行,这很糟糕!
有没有办法编写一个bash脚本来首先阻止在核心#0上运行的活动进程然后运行该任务集命令?
答案 0 :(得分:1)
我在对原始问题的一系列评论中对此进行了讨论,但我认为这是“根本问题的答案”而不是具体问题的具体答案,所以我们走了:
我已经听过几次这个问题了,而且一直存在 问出了对同时多处理的误解 作品。首先:为什么你需要在核心#0上使用你的进程?你呢 有原因吗?
通常,Linux内核在调度任务时非常有效 处理器以最小化负面影响的方式 流程迁移或单核瓶颈会带来。事实上, 很难看到有人通过手动获得性能 设置亲和力,这通常只发生在用户地区 进程与内核模块紧密通信,对于某些人而言 硬件或实现原因本质上是单线程的 不能轻易迁移。你的问题本身就表现出一种轻微的误解:亲和力意味着 内核知道它应该安排该进程 给定核心。因此,其他进程将自动迁移出去 从那个核心开始,如果你想要的任务离开,那么只能在那里运行 很多核心未使用。要更改您的流程所具有的“优先级” CPU分配,只需更改其良好的值。
原因是通过隔离正在运行的过程进行性能测量。关于第二条评论,这意味着我们必须依赖操作系统 调度程序,因为它不会在核心上运行后台进程 当空闲核心时,目前100%使用。
您所测量的不是该过程的表现 孤立地,但过程,绑定到一个CPU!为一个 单线程进程没问题,但想象一下你的进程可能会 有多个线程 - 这些线程通常都运行在不同的线程上 核心和整体性能会更高。一般来说,试试 只需最小化机器上的非流程工作负载(即无需运行) 一个窗口管理器/会话管理器运行,停止所有非必要的 服务)并使用一个非常小的好价值 - 测量可能是 比较精确。
此外,
time
命令可让您知道进程的时间 完全花费(包括等待),占用CPU作为用户空间进程, 并在系统调用中占用CPU - 我认为这可能符合您的需求 够了:))