【问题标题】:One core exclusively for my process [duplicate]一个专门用于我的流程的核心[重复]
【发布时间】:2012-02-22 17:31:54
【问题描述】:

可能重复:
how to set CPU affinity of a particular pthread?

在 Linux 中有没有一种方法可以为除一个进程之外的所有进程禁用一个内核?我想只为我的进程保留一个核心。

预期行为如下:

  1. 将在我的进程之后生成的进程不应看到此核心并使用其他核心。
  2. 当我的进程生成时,所有正在使用该内核的进程都应该切换到其他内核。

【问题讨论】:

  • 您要查找的术语是线程关联性。这是可能的,但就整体性能而言,通常比让调度程序解决它更糟糕
  • @awoodland:倒退。他没有要求他的进程不要使用其他内核,他要求其他进程不要使用他的内核。
  • 在我看来,这与“如何设置特定 pthread 的 CPU 亲和性?”并不重复。我的问题的答案完全不同。请参阅下面 gby 的答案。
  • 我认为这不是重复的,对所链接问题的答案完全没有帮助,下面的答案不仅要好得多,而且还解决了实际问题。
  • 这个问题与 SO 上已经提出的任何问题都不是重复的,链接的问题是完全不相关的。我想知道决定关闭它的人是否甚至费心阅读它并与他们链接的内容进行比较。

标签: linux process core affinity


【解决方案1】:

你可以看看这个lwn article,讨论这个问题的内核解决方案。

【讨论】:

    【解决方案2】:

    是的,有。您想创建两个 cpuset,一个与您的隔离 CPU,另一个与所有其余的 CPU。将您的特殊进程分配给隔离的 cpuset,并将所有其余进程分配给另一个 cpuset。

    这是一个简单的示例脚本:

    mkdir /cpuset 
    mount -t cpuset none /cpuset/
    cd /cpuset
    
    mkdir sys                                   # create sub-cpuset for system processes
    /bin/echo 0-2 > sys/cpuset.cpus             # assign cpus (cores) 0-2 to this set
                                                # adjust if you have more/less cores
    /bin/echo 1 > sys/cpuset.cpu_exclusive
    /bin/echo 0 > sys/cpuset.mems     
    
    mkdir rt                                    # create sub-cpuset for my process
    /bin/echo 3 > rt/cpuset.cpus                # assign cpu (core) 3 to this cpuset
                                                # adjust this to number of cores-1
    /bin/echo 1 > rt/cpuset.cpu_exclusive
    /bin/echo 0 > rt/cpuset.mems
    /bin/echo 0 > rt/cpuset.sched_load_balance
    /bin/echo 1 > rt/cpuset.mem_hardwall
    
    # move all processes from the default cpuset to the sys-cpuset
    for T in `cat tasks`; do echo "Moving " $T; /bin/echo $T > sys/tasks; done
    

    现在启动你的进程并找出它的 PID 并开始:

    /bin/echo $PID > /cpuset/rt/tasks
    

    如果您想恢复这些更改,只需重新启动系统或执行以下操作:

    # move tasks back from sys-cpuset to root cpuset
    for T in `cat /cpuset/sys/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done
    # remove sys-cpuset
    rmdir /cpuset/sys
    # move tasks back from rt-cpuset to root cpuset
    for T in `cat /cpuset/rt/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done
    # remove rt-cpuset
    rmdir /cpuset/rt
    # unmount and remove /cpuset
    umount /cpuset
    rmdir /cpuset
    

    这里是手册页:http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

    还有更复杂的 shell 包装器可以帮助您自动执行此操作,例如 cset。见:http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

    【讨论】:

    • 感谢您提供如此详细的描述:)我会尝试您的解决方案。
    • 如果我想撤消这些更改,我该怎么做?
    • SUSE 教程的链接已失效,here 是存档版本。 cset shield 非常适合我的需求。
    • @Kornel Szymkiewicz 我发现这个解决方案确实适用于 Ubuntu 下内核创建的线程。有什么解决方案吗?
    猜你喜欢
    • 2015-09-12
    • 2021-08-24
    • 2021-10-14
    • 2020-07-23
    • 2014-03-06
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多