【问题标题】:Is it possible to prevent children inheriting the CPU/core affinity of the parent?是否可以防止子代继承父代的 CPU/核心亲和性?
【发布时间】:2011-01-04 10:26:40
【问题描述】:

对于 Java 程序,我对在 Linux 上执行此操作特别感兴趣。已经有一些问题表明您无法通过 Java 控制,并且 Sun/Oracle 关闭了一些 RFE。

如果您可以访问源代码并使用低级语言,您当然可以进行相关的系统调用。然而,沙盒系统——可能没有源代码——提出了更多的挑战。我原以为设置此每个进程或内核参数的工具能够从父进程外部控制它。这正是我所追求的。

我了解reason why this is the default。它看起来像是某个版本的 Windows may allow some control,但大多数都不是。我期待 Linux 允许控制它,但看起来像 it's not an option

【问题讨论】:

    标签: multicore affinity


    【解决方案1】:

    如果您有足够的权限,您可以简单地调用 setaffinity,然后再在子进程中执行。换句话说,从

    if (fork() == 0)
            execve("prog", "prog", ...);
    

    移动使用

    /* simple example using taskset rather than setaffinity directly */
    if (fork() == 0)
            execve("taskset", "taskset", "-c", "0-999999", ...);
    

    [当然使用 999999 不好,但是可以用一个自动确定 cpu 数量并根据需要重置关联掩码的程序来代替。]

    【讨论】:

    • 如果你有办法影响正在运行的子程序(例如配置文件——它并不总是需要程序源),你可以做到。如果两者都没有,好吧,“使用错误的程序”然后;-)
    【解决方案2】:

    您还可以做的是在 fork() 之后从父级更改子级的亲和力。顺便说一句,我假设你在 linux 上,其中一些东西,例如使用 sysconf() 检索内核数量在不同的操作系统和 unix 风格上会有所不同......这里的例子,获取 cpu并尝试确保所有子进程都安排在不同的核心上,以循环方式进行。

    /* get the number of cpu's */
    numcpu = sysconf( _SC_NPROCESSORS_ONLN );
    
    /* get our CPU */
    CPU_ZERO(&mycpuset);
    sched_getaffinity( getpid() , sizeof mycpuset , &mycpuset);
    
    for(i=0 ; i < numcpu ; i++ )
    {
        if(CPU_ISSET( i, &mycpuset))
        {
            mycpu = i;
            break;
        }
    }
    
    //...
    
    while(1)
    {
        //Some other stuff.....
    
        /* now the fork */    
        if((pid = fork()) == 0)
        {
           //do your child stuff
        }    
    
       /* Parent... can schedule child. */
       else
       {
       cpu = ++cpu % numcpu;
           if(cpu == mycpu)
               cpu = ++cpu % numcpu;
           CPU_ZERO(&mycpuset);
           CPU_SET(cpu,&mycpuset);
           /*set processor affinity*/
           sched_setaffinity(pid, sizeof mycpuset, &mycpuset );
    
           //any other father stuff
       }
    }
    

    【讨论】:

    • 至于另一个答案,这在沙盒环境中不起作用(或者 - 烦人但问题较少 - 无法访问源代码)。我正在寻找一种从进程外部(内核设置、任务集等)执行此操作的方法。
    • @sam-brightman 也许我没有理解这个问题,但我真的不明白为什么 taskset 不适合你。如果您想以编程方式执行此操作,如 sched_affinity 联机帮助页的注释部分所述:通过 fork(2) 创建的子代会继承其父代的 CPU 关联掩码。关联掩码在 execve(2) 中保留。因此,如果您想通过 execve 启动进程,那也是可能的。此外,如果您知道 pid,sched_setaffinity 肯定会允许您设置核心亲和力。在沙盒 (chroot) 上确实不应该改变任何东西。
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 2014-11-15
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多