2016-06-30 36 views
5

devo aggiungere "isolcpus = 3 = 3 nohz_full rcu_nocbs = 3" in grub.conf in RedHat 7.1, kernel: linux kernel 3.10.0-229 e secondo http://www.breakage.org/2013/11/15/nohz_fullgodmode/ I anche eseguire il seguente comando:tickless kernel, isolcpus, nohz_full, e rcu_nocbs

cat /sys/bus/workqueue/devices/writeback/cpumask 
f 
echo 1 > /sys/bus/workqueue/devices/writeback/cpumask 

cat /sys/bus/workqueue/devices/writeback/numa 
1 
echo 0 > /sys/bus/workqueue/devices/writeback/numa 

la scatola ha solo 4 core della CPU, io eseguire il seguente shell:

watch -d 'cat /proc/interrupts' 

aspetto come il lavoro perfetto, solo cpu0 interrupt timer locali, dispone di 2000 per 2 secondi, il resto c pu 1 a CPU 3 ha meno di 10 per 2 secondi.

e poi ho testare la seguente fonte:

void *Thread2(void *param) 
{ 
    pthread_detach(pthread_self()); 
    while(1){ 
     sleep(100000) ; 
    } 
} 

void *Thread1(void *param) 
{ 
    pthread_detach(pthread_self()); 
    while(1){ 
     ; 
    } 
} 

int main(int argc, char** argv) 
{ 
    pthread_t tid ; 
    pthread_create(&tid , NULL, Thread1, (void*)(long)3); 
    pthread_create(&tid , NULL, Thread2, (void*)(long)3); 

    while(1) 
     sleep(5) ; 
} 

ed eseguirlo:

taskset -c 3 ./x1.exe 

guardare l'output in:

watch -d 'cat /proc/interrupts' 

questa volta, cpu 3 ricevi 10 ~ 30 Interruzioni del timer locale per 2 secondi, aspetto corretto, quindi provo a eseguire 2 thread1 di:

pthread_create(&tid , NULL, Thread1, (void*)(long)3); 
pthread_create(&tid , NULL, Thread1, (void*)(long)3); 

poi di nuovo eseguirlo:

taskset -c 3 ./x1.exe 

poi guardare il nucleo 3 ha lo stesso temporizzatore locale interrompe con anima 0, è 2000 interrupt per 2 sec.

Posso chiedere, perché 2 thread1 molto occupato causerà il core 3 ha interruzioni di timer in più?! che causa è successo ?! e come modificarlo se può essere ?!

risposta

7

Nel secondo caso, il kernel deve pianificare 2 attività associate alla CPU sul core 3 e la configurazione delle zecche dinamiche è applicabile solo quando esiste esattamente un'attività eseguibile. ho pensato SCHED_FIFO fermerebbe questi interrupt (e così ho iniziato rispondendo), ma che non è ancora implementata secondo https://www.kernel.org/doc/Documentation/timers/NO_HZ.txt

Non v'è alcun modo per modificare questo comportamento eccetto pianificazione discussioni su diverse CPU. Puoi sempre hackerare il kernel per ottenere ciò di cui hai bisogno.