linux中的taskset究竟做了什么?

时间:2013-01-24 22:43:06

标签: c++ linux tbb

我在使用英特尔TBB的32核系统上运行程序。 我遇到的问题是当我将程序设置为使用32个线程时,与16个线程(仅增加50%)相比,性能不够好。但是,当我使用:

taskset 0xFFFFFFFF ./foo

这会将进程锁定到32个核心,性能要好得多。

我有以下两个问题:

  1. 为什么?默认情况下,操作系统无论如何都会使用32个核心程序的所有32个核心。
  2. 我假设即使使用taskset,操作系统也可以(将)交换虚拟线程和物理线程,即线程不固定。我是对的吗?
  3. 感谢。

1 个答案:

答案 0 :(得分:3)

操作系统可能会选择使用较少的内核进行缓存。想象一下,如果应用程序使用相同的内存集,则每次写入都会导致缓存无效。强制锁定本质上是告诉操作系统并发缓存开销不值得,继续使用所有内核。

您还必须记住还有其他进程要运行(例如来自内核和后台进程的kthread)。在内核之间迁移线程代价很高,如果您的线程没有做大量的工作,可能会导致不平衡。

另外请记住,操作系统会尝试在所有进程中均匀分配核心上的工作,而不仅仅是您的进程。这意味着负载均衡器可能选择不将您的进程放在所有32个核心上,因为当前正在运行其他进程,迁移成本可能很高,或者均匀分布流程可能会导致CPU核心之间的负载不平衡。操作系统力求最佳系统性能,不一定是每个应用程序性能最佳的。