Cattura dinamicamente l'utilizzo della CPU e della memoria
-
03-07-2019 - |
Domanda
Sto eseguendo uno script di shell per eseguire un'applicazione c ++, che misura le prestazioni di un API. posso catturare la latenza (tempo impiegato per restituire un valore per un determinato set di parametri) dell'API, ma desidero anche catturare l'utilizzo della CPU e della memoria a intervalli di 5-10 secondi.
c'è un modo per farlo senza influenzare troppo le prestazioni del sistema e anche quello all'interno dello stesso script? ho trovato molti esempi in cui si può fare al di fuori (indipendentemente) dello script che stiamo eseguendo; ma non uno in cui possiamo fare all'interno dello stesso script.
Soluzione
Suggerirei di usare il comando time 'e anche il comando vmstat '. Il primo fornirà l'utilizzo della CPU dell'esecuzione eseguibile e il secondo - periodico (ovvero una volta al secondo) dump della CPU / memoria / IO del sistema.
Esempio:
time dd if=/dev/zero bs=1K of=/dev/null count=1024000
1024000+0 records in
1024000+0 records out
1048576000 bytes (1.0 GB) copied, 0.738194 seconds, 1.4 GB/s
0.218u 0.519s 0:00.73 98.6% 0+0k 0+0io 0pf+0w <== that's time result
Altri suggerimenti
Se stai cercando di catturare dinamicamente l'utilizzo di CPU e Mem per l'intero box di Linux, anche il seguente comando può aiutarti:
CPU
vmstat -n 15 10| awk '{now=strftime("%Y-%m-%d %T "); print now free -m -s 10 10 | awk '{now=strftime("%Y-%m-%d %T "); print now <*>}'> DataDumpMemoryfile.csv &
}'> CPUDataDump.csv &
vmstat
viene utilizzato per la raccolta di contatori CPU
-n
per valore di ritardo, in questo caso è 15, ciò significa che dopo ogni 15 secondi verranno raccolte le statistiche.
allora 10
è il numero di intervalli, in questo esempio ci sarebbero 10 iterazioni
awk '{now = strftime ("% Y-% m-% d% T "); stampa ora $ 0} '
questo scaricherà il timestamp di ogni iterazione
alla fine, il file di dump con & amp;
per la continuazione
Memory
<*> gratuito
è per la raccolta di statistiche mem
-m
è per unità di mem (puoi usare -b
per byte, -k
per kilobyte, - g
per gigabyte)
quindi 10
è il numero di intervalli (in questo esempio ci sarebbero 10 iterazioni)
awk '{now = strftime ("% Y-% m-% d% T "); stampa ora $ 0} '
questo scaricherà il timestamp di ogni iterazione
alla fine, il dump & amp;
per la continuazione