Registra utente / sistema / tempo reale di un processo in Linux / Bash con maggiore precisione


2

Quello che sto cercando è qualcosa del genere /usr/bin/time, tuttavia, questo di solito non ha abbastanza precisione.

Sto eseguendo un programma C (che posso modificare e ricompilare) e ho bisogno di monitorare Utente / Sistema / Tempo reale, utilizzo del processore, memoria di picco, ecc.

Tuttavia, il normale runtime va oltre la precisione del timecomando. timeti dà la precisione in millisecondi, tuttavia è preferibile la precisione in nanosecondi. Un decimo di millisecondo può funzionare, ma sto divagando.

Quello che ho ora è un semplice script bash che registra l'ora di inizio in nanosecondi, esegue il programma, quindi registra l'ora di fine in nanosecondi e quindi segnala la differenza. Questo è ottimo per il tempo reale (orologio da parete), ma non così buono per il tempo di esecuzione perché si tratta di una macchina multiutente.

Note: Sono limitato a Bash come shell; la macchina esegue CentOS 6.4; Sono aperto a soluzioni in C che non richiedono l'installazione di alcun nuovo software.


Desideri la precisione dei nanosecondi per il tempo r / u / s, il carico della CPU, l'utilizzo della memoria, ecc.? O solo il tempo r / u / s? In un secondo momento, la funzione "volte" potrebbe esserti di aiuto.
Gogators

Solo r / u / s volte. Dò un'occhiata alla timesfunzione. Quindi posso solo usare /usr/bin/timeper le statistiche di memoria. Non è l'ideale, ma sicuramente il migliore con cui devo lavorare finora. Non avere sudo può davvero
legarti

Risposte:


0

Puoi farlo usando systemtap. Da uno degli esempi nel loro sito Web:

general / stopwatches.stp - Visualizza la quantità di tempo dell'orologio a muro che un processo impiega in vari stati parole chiave: TIME

Lo script stopwatch.stp illustra come utilizzare più cronometri per registrare il tempo di wallclock che un processo impiega nello spazio kernel e utente. All'uscita lo script stampa il tempo in secondi, millisecondi, microsecondi e nanosecondi . Si noti che questo output di questo script non è direttamente paragonabile al comando time poiché time registra il tempo in cui il processo è effettivamente attivo nello spazio kernel e utente.

# stap stopwatches.stp -c "sleep 1"

Codice da quell'esempio riprodotto qui per completezza:

#! /usr/bin/env stap
# Copyright (C) 2012 Red Hat, Inc.
# by William Cohen <wcohen@redhat.com>
#
# exercise the stopwatch tapset

probe begin
{
  start_stopwatch("wall");
  /* The next two lines assumes that target is running and in user-space. */
  start_stopwatch("user");
  stop_stopwatch("system")
}

probe syscall.*
{
   if (pid() != target()) next
   stop_stopwatch("user")
   start_stopwatch("system")
}

probe syscall.*.return
{
   if (pid() != target()) next
   start_stopwatch("user")
   stop_stopwatch("system")
}

probe end
{
  stop_stopwatch("wall")
  stop_stopwatch("user")
  stop_stopwatch("system")

  w = read_stopwatch_us("wall")
  u = read_stopwatch_us("user")
  s = read_stopwatch_us("system")
  printf ("wall clock                 %12dus\n", w);
  printf ("wall clock in user-space   %12dus\n", u);
  printf ("wall clock in kernel-space %12dus\n", s);

   delete_stopwatch("wall")
   delete_stopwatch("user")
   delete_stopwatch("system")
 }

Questa è una soluzione fantastica! Tuttavia, non ho accesso come root su questa macchina. Ho chiesto agli amministratori di aggiungermi a un altro gruppo utenti un po 'di tempo fa, ma mi è stato negato. Lo ricorderò sicuramente per progetti futuri su macchine che controllo.
Devon Finninger,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.