【问题标题】:How to force two process to run on the same CPU?如何强制两个进程在同一个 CPU 上运行?
【发布时间】:2011-06-07 13:43:35
【问题描述】:

上下文:

我正在编写一个由多个进程组成的软件系统。它是在 Linux 下用 C++ 编程的。它们之间使用 Linux 共享内存进行通信。

通常,在软件开发中,是在进行性能优化的最后阶段。在这里,我遇到了一个大问题。该软件对性能要求很高,但在4核或8核(通常多于一个CPU)的机器上,只能使用3核,浪费了25%的CPU功率,超过第二个占60%。 经过多次研究,并放弃了互斥锁和锁争用,我发现时间被浪费在了 shmdt/shmat 调用上(分离并附加到共享内存段)。经过一番研究,我发现这些 CPU,通常是 AMD Opteron 和 Intel Xeon,使用一种称为 NUMA 的内存系统,这基本上意味着每个处理器都有其快速的“本地内存”,而从其他 CPU 访问内存是昂贵的。

在做了一些测试之后,问题似乎在于软件的设计使得基本上任何进程都可以将共享内存段传递给任何其他进程以及其中的任何线程。这似乎会降低性能,因为进程不断地从其他进程访问内存。

问题:

现在的问题是,有没有办法强制成对的进程在同一个 CPU 中执行?我并不是要强迫它们总是在同一个处理器中执行,因为我不在乎它们在哪个处理器中执行,尽管这样可以完成这项工作。理想情况下,有一种方法可以告诉内核:如果你在一个处理器中调度这个进程,你还必须在同一个处理器中调度这个“兄弟”进程(它是通过共享内存与之通信的进程),这样表现不受处罚。

【问题讨论】:

    标签: c linux performance kernel numa


    【解决方案1】:

    在 C 中,您正在寻找的很可能是 sched_setaffinity() 系统调用。

    如果您不想(或不能)修改代码,还有schedtool 命令行实用程序。

    【讨论】:

      【解决方案2】:

      我认为您可以从这些手册页开始:

      $ apropos affinity
      sched_getaffinity (2) - set and get a process's CPU affinity mask
      sched_setaffinity (2) - set and get a process's CPU affinity mask
      taskset (1)          - retrieve or set a process's CPU affinity
      $
      

      取决于您是想从源代码还是外壳中执行此操作。 pthread 库也有一些功能。

      【讨论】:

        【解决方案3】:

        编写支持 NUMA 的应用程序不仅仅是“两个进程在同一个 CPU 上运行”。 NUMA 意识渗透到一切:内存分配、IO 完成、线程调度等。

        看看libnuma

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-09
          • 1970-01-01
          • 2014-07-05
          • 2016-10-11
          • 1970-01-01
          • 2020-10-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多