2012-06-10 18 views
5

Il nostro modello di business richiede l'addebito agli utenti in base alle ore di utilizzo/CPU.Calcolo dell'utilizzo della CPU

Inizialmente stavo pensando di utilizzare semplicemente StopWatch e quindi utilizzare il tempo trascorso come unità di misura.

Ma il problema che vedo con questo approccio è che nel momento del giorno in cui 5000 utenti stanno colpendo il server, il tempo trascorso per lo stesso pezzo di codice sarà maggiore rispetto alla notte quando solo 50 utenti stanno colpendo il server.

Un'altra opzione è addebitare gli utenti in base alle iterazioni eseguite sui dati inviati dagli utenti. Ci sono anche due problemi con questo approccio.

  • Alcune funzioni non richiedono alcuna iterazione sui dati.
  • L'utilizzo della CPU per x + y è inferiore a quello di x + y * z.

Che cosa è un buon modo per calcolare le informazioni sull'utilizzo della CPU in C# /. Net in modo che rimanga lo stesso per tutti gli utenti per la stessa operazione indipendentemente dal carico del server?

Possibilmente, quantità totale di istruzioni a livello di assemblaggio effettivo? C'è un modo per ottenere quell'informazione in C#?

Quale altro approccio, quali consigli puoi condividere?

Grazie mille per aver esaminato questo.

risposta

14

Esegui qualunque cosa i tuoi utenti vogliano eseguire in un process separato e cerca il suo CPU time dopo aver completato il processo. Questo è anche diverso dal tempo di wallclock in quanto prende in considerazione solo il tempo in cui il processo è effettivamente eseguito sulla CPU.

Esempio minimo per coloro che sono disposti a leggere la documentazione:

ProcessStartInfo psi = new ProcessStartInfo(@"C:\Blah\Foo.exe"); 
Process p = Process.Start(psi); 
p.WaitForExit(); 
TimeSpan time = p.TotalProcessorTime; 
p.Close(); 

Si consiglia di eseguire questo modo asincrono, però.

Nessun bisogno di stima, ipotesi o magia nera. Non è possibile calcolarlo in modo affidabile comunque.

+2

Puoi condividere alcuni esempi di esecuzione di un codice in un processo separato e tempo di CPU? – Moon

+0

+1 per "per coloro che non sono disposti a leggere la documentazione" (così come per avere una risposta corretta :-)) – phoog

+0

BTW, cosa succede se voglio monitorare l'utilizzo di una sola funzione? Posso avvolgere quel codice all'interno di un exe. Ma c'è un modo migliore? Se la funzione esegue qualche altra attività nel thread in background, faranno parte dello stesso processo e avranno un impatto su 'TotalProcessTime'? – Moon