2012-06-19 7 views
8

Questo è su sistema operativo Linux. L'app è scritta in C++ con la libreria ACE.come rilevare se un thread o processo sta diventando affamato a causa della pianificazione del sistema operativo

Sono sospettoso che uno dei thread nel processo venga bloccato per un tempo insolitamente lungo (da 5 a 40 secondi) a volte. L'app funziona bene la maggior parte delle volte tranne che per un paio di volte al giorno ha questo problema. Ci sono altre 5 app simili in esecuzione sul box che sono anche vincolate all'I/O a causa dei pesanti dati in ingresso sul socket.

Mi piacerebbe sapere se c'è qualcosa che posso fare in modo programmatico per vedere se il thread/processo sta ottenendo il loro intervallo di tempo.

risposta

3

Se un processo è bloccato, l'auto monitoraggio per quel processo non sarebbe così produttivo. Tuttavia, se si desidera che tale processo accorga che non è stato eseguito per un po ', può chiamare periodicamente lo times e confrontare la differenza relativa nel tempo trascorso con la differenza relativa nell'ora dell'utente pianificata (sommando i campi tms_utime e tms_cutime se si desidera contare i tempi di attesa dei bambini come tempo produttivo e si sommano nei campi tms_stime e tms_cstime se si considera che il tempo di kernel speso per conto dell'utente è produttivo). Per i tempi di thread, l'unico modo che conosco è di consultare il filesystem /proc.

Un processo esterno ad alta priorità o un thread ad alta priorità può monitorare esternamente processi (e thread) di interesse leggendo le voci /proc/<pid>/stat appropriate per il processo (e /proc/<pid>/task/<tid>/stat per i thread). Gli orari utente si trovano nei campi 14 e 16 del file stat. I tempi di sistema si trovano nei campi 15 e 17. (Le posizioni dei campi sono accurate per il mio kernel Linux 2.6)

Tra due punti di tempo, si determina la quantità di tempo trascorso che è passato (un processo di monitoraggio o thread di solito si sveglia a intervalli regolari). Quindi la differenza tra i tempi di elaborazione cumulativi in ​​ognuno di quei punti temporali rappresenta quanto tempo il thread di interesse ha avuto modo di eseguire durante quel periodo. Il rapporto tra il tempo di elaborazione e il tempo trascorso rappresenterebbe la porzione temporale.

Un'ultima po 'di info: Su Linux, io uso il seguente per ottenere il tid del thread corrente per l'esame del diritto task nella directory /proc/<pid>/task/:

tid = syscall(__NR_gettid); 

faccio questo, perché non potevo trova la chiamata di sistema gettid effettivamente esportata da qualsiasi libreria sul mio sistema, anche se è stata documentata. Ma potrebbe essere disponibile sul tuo.

Problemi correlati