2011-01-04 1 views
3

Je suis particulièrement intéressant en faisant cela sur Linux, en ce qui concerne les programmes Java. Il y a déjà quelques questions qui disent que vous n'avez aucun contrôle de Java, et que certains RFE sont fermés par Sun/Oracle.Est-il possible d'empêcher les enfants d'hériter de l'affinité CPU/core du parent?

Si vous avez accès au code source et utilisez une langue de bas niveau, vous pouvez certainement effectuer les appels système appropriés. Cependant, les systèmes en boîte de sable - probablement sans code source - présentent plus de défis. J'aurais pensé qu'un outil pour définir ce par-processus ou un paramètre du noyau est capable de contrôler cela depuis l'extérieur du processus parent. C'est vraiment ce que je suis après. Je comprends le reason why this is the default. Il ressemble à une version de Windows may allow some control de cela, mais la plupart ne le font pas. Je m'attendais à Linux pour permettre le contrôle de celui-ci, mais semble it's not an option.

Répondre

1

Si vous avez des privilèges suffisants, vous pouvez simplement appeler setaffinity avant d'exécuter dans l'enfant. En d'autres termes, de

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

passage à utiliser

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

[Bien sûr, utiliser 999999 est pas agréable, mais qui peut être substitué par un programme qui a déterminé automatiquement le nombre de CPUs et remet à zéro l'affinité masque comme vous le souhaitez.]

+0

Mais seulement avec l'accès au code source (non-sandboxed), non? –

+0

Si vous avez un moyen d'influencer quel programme enfant est exécuté (par exemple, fichier de configuration - il n'a pas toujours besoin de source de programme), vous pouvez le faire. Si elle n'a ni, bien, "mauvais programme à utiliser" alors ;-) – user562374

1

Ce que vous pouvez également faire, c'est changer l'affinité de l'enfant par rapport au parent, après fork(). En passant, je suppose que vous êtes sur Linux, certaines de ces choses, telles que la récupération du nombre de cœurs avec sysconf() sera différente sur les différents OS et saveurs unix .... L'exemple ici, obtient le cpu du processus parent et essaie de s'assurer que tous les processus enfants sont planifiés sur un noyau différent, à la ronde.

/* 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 
    } 
} 
+0

Comme pour l'autre réponse, cela ne fonctionnera pas dans les environnements en sandbox (ou - ennuyeux mais moins problématique - sans accès au code source). Je cherche un moyen de le faire de l'extérieur du processus (paramètre du noyau, taskset etc.). –

+1

@ sam-brightman Peut-être que je n'ai pas compris la question, mais je ne comprends vraiment pas pourquoi ** taskset ** ne le coupe pas pour vous. Et si vous souhaitez effectuer cela par programme, comme expliqué par la section notes de la page de manuel sched_affinity: un enfant créé via fork (2) hérite du masque d'affinité CPU de son parent. Le masque d'affinité est conservé à travers un execve (2). Donc, si vous voulez le faire en lançant un processus via execve, c'est aussi possible. De plus, si vous connaissez le pid, sched_setaffinity vous permettra certainement de définir l'affinité de base. Être sur un bac à sable (** chroot **) ne devrait vraiment rien changer. – truthbk

Questions connexes