Come prefazione sto usando Debian Wheezy con il kernel 3.2 su un chipset AMD64. La mia macchina ha due core Xeon E5-2690. Ho impostato i parametri di avvio in modo che tutti i core su una CPU siano dedicati a un singolo processo. Per fare ciò ho impostato isolcpus = 8,9,10,11,12,13,14,15 in grub.
Fin qui tutto bene. Ora diciamo che voglio usare le CPU isolate per un dato comando, per essere semplice userò solo un semplice ciclo infinito:
$ tasket -c 8-15 bash -c 'mentre vero; do echo hello> / dev / null; fatto' &
Fin qui tutto bene, top mostra che il core 8 gira fino a un utilizzo vicino al 100%. Ora diciamo che lancio di nuovo quel comando:
$ tasket -c 8-15 bash -c 'mentre vero; do echo hello> / dev / null; fatto' &
Ora la parte superiore mostra che i core 9-15 rimangono inattivi e che i due processi condividono il core 8. Se invece lo faccio:
$ tasket -c 8 bash -c 'mentre vero; do echo hello> / dev / null; fatto' &
$ tasket -c 9 bash -c 'mentre vero; do echo hello> / dev / null; fatto' &
I core 8 e 9 ottengono ciascuno il 100% di utilizzo come dovrebbero. Questo vale solo per isolcpus perché lo stesso set di attività con i core 1-7 distribuisce correttamente i processi sui relativi core. Inoltre "tasket -p" mostra che la maschera di affinità per i processi 8-15 è impostata correttamente. Sembra che lo scheduler del kernel si rifiuti di usare qualsiasi cosa tranne il core più basso specificato su una maschera di affinità isolcpus.
Ora normalmente questo non sarebbe un grosso problema con i miei esempi precedenti, basta specificare i singoli core per ogni processo. Tuttavia, voglio eseguire un'applicazione altamente multithread sulla CPU dedicata. Voglio specificare il set di core e utilizzare automaticamente il pool di thread, senza dover reimpostare singolarmente l'affinità del processore per ogni singolo thread generato.
Qualcuno ha idea di come ottenere lo scheduler per darmi più di un core dal set isolcpu?