Monitorare le CPU / chiamate di sistema in Linux

Ho un paio di processi che stanno mangiando un sacco di tempo di CPU del sistema (come determinato guardando vmstat). C'è un modo semplice per scoprire quali tipi di chiamate di sistema sono state fatte?

So che c'è strace, ma c'è un modo più veloce e più semplice? Esiste qualcosa come un "top" per le chiamate di sistema?

3 Solutions collect form web for “Monitorare le CPU / chiamate di sistema in Linux”

Penso che la strace con la bandiera -c è probabilmente la più vicina di cui so. Se non hai usato il flag -c , prova questo:

 $ sudo strace -c -p 12345 

Dove 12345 è l'ID process (PID) del process in questione. Notare che il passaggio di un process comport un sovraccarico aggiuntivo, per cui durante la tracciatura, il process verrà eseguito più lentamente.

Dopo aver eseguito tale operazione per tutto il tempo che desideri raccogliere i dati, premi Ctrl-C per arrestare la raccolta dei dati e pubblicare i risultati. Producerà qualcosa di simile:

 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 31.88 0.001738 145 12 futex 16.79 0.000915 11 80 tgkill 12.36 0.000674 34 20 read 9.76 0.000532 266 2 statfs 8.42 0.000459 13 35 time 4.38 0.000239 6 40 gettimeofday 3.65 0.000199 4 48 sigprocmask 2.94 0.000160 18 9 open 2.88 0.000157 12 13 stat64 1.32 0.000072 9 8 munmap 0.90 0.000049 6 8 mmap2 0.88 0.000048 3 14 7 sigreturn 0.79 0.000043 5 9 close 0.77 0.000042 4 10 rt_sigprocmask 0.64 0.000035 3 12 setitimer 0.55 0.000030 5 6 6 rt_sigsuspend 0.53 0.000029 4 8 fstat64 0.29 0.000016 8 2 setresuid32 0.13 0.000007 4 2 _llseek 0.09 0.000005 3 2 prctl 0.04 0.000002 2 1 geteuid32 ------ ----------- ----------- --------- --------- ---------------- 100.00 0.005451 341 13 total 

Come si può vedere, si tratta di una ripartizione di tutte le chiamate di sistema effettuate dall'applicazione, ordinate per il tempo totale e includendo il tempo medio per chiamata e il numero di chiamate per ciascun syscall. Se vuoi ordinarli in modo diverso, consulta la pagina man per strace, poiché ci sono un paio di opzioni.

Forse provare uno dei profilatori di campionamento, come oprofile, o per nuovi kernel, perf. Se sei fortunato, "perf top" potrebbe dirti esattamente quello che vuoi. Vedere qui per alcuni esempi

Il tipo di switch strace che tendo a usare è questo.

strace -ffttT -p pid -o /tmp/strace.out

Un esempio di questo sembrerebbe,

 19:35:57.485493 mprotect(0x7f35e7472000, 16384, PROT_READ) = 0 <0.000037> 19:35:57.485599 mprotect(0x7f35e7692000, 4096, PROT_READ) = 0 <0.000030> 19:35:57.485697 mprotect(0x7f35e78b7000, 4096, PROT_READ) = 0 <0.000030> 19:35:57.485782 munmap(0x7f35e7896000, 129588) = 0 <0.000037> 19:35:57.485875 set_tid_address(0x7f35e78949d0) = 10730 <0.000029> 19:35:57.485960 set_robust_list(0x7f35e78949e0, 0x18) = 0 <0.000024> 19:35:57.486048 futex(0x7fff8f58628c, FUTEX_WAKE_PRIVATE, 1) = 0 <0.000025> 19:35:57.486131 futex(0x7fff8f58628c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 7f35e7894700) = -1 EAGAIN (Resource temporarily unavailable) <0.000024> 

Vedete la differenza di tempo sul lato destro della chiamata di sistema mostrando quanto tempo ha preso per andare da una chiamata di sistema a un altro.

Ti catturerà la differenza di tempo tra le chiamate di sistema. Quindi, quando si vede che una chiamata di sistema ha un intervallo di pochi secondi con la prossima chiamata di sistema, allora c'è un rumore.

Un altro metodo è quello di coredump con gcore. Tuttavia, ciò richiede una piccola esperienza di navigazione tramite gdb.

Ma, se il thread è un thread del kernel, allora non puoi strace o coredump. In questo caso dobbiamo usare qualcosa di più complesso. Nel kernel RHEL5, utilizziamo l'oprofile. In RHEL6 usiamo perf. Preferisco perf oltre l'oprofile. I dati di Perf possono essere raccolti con il formato del grafico che mostra la chiamata di sistema in cui viene utilizzata la percentuale massima della CPU.

Con un test perf, vedo questo.

 38.06% swapper [kernel.kallsyms] [k] mwait_idle_with_hints ↑ 29.45% swapper [kernel.kallsyms] [k] read_hpet 4.90% swapper [kernel.kallsyms] [k] acpi_os_read_port ▒ 4.74% swapper [kernel.kallsyms] [k] hpet_next_event 

Mostra la function del kernel where viene speso il tempo del CPU del 38%. Ora, possiamo controllare la function e vedere cosa sta facendo e cosa si suppone.

Con alcuni esempi, non è molto difficile.

Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.