2012-08-17 14 views
5

Attualmente sto lavorando su una piccola app di test interna per creare più tipi di carico sul computer in modo da poter vedere come funziona il nostro software sotto carico. Mi sto bloccando su una richiesta, in quanto faccio una sorta di modo per specificare un utilizzo percentuale della CPU (ad esempio, 40%) prima che l'utente esegua il programma, e che si spera manterrà la cpu in un intervallo + - Il 10% di ciò che hanno inserito. Mi è stato detto che avevano visto programmi che lo facevano prima, ma tutti quelli che avevo visto che sostenevano di farlo non funzionavano. Sto tentando di leggere un utilizzo medio e di dormire il thread in esecuzione in modo che l'utilizzo della CPU si abbassi, ma ho trovato che non è accurato. Sarà anche utilizzato su più server, ognuno con diverse CPU, quindi non posso fare molto hard coding in quanto dovrà funzionare su ogni server. Personalmente non penso che sia possibile farlo in modo accurato, ma qui mi sto chiedendo come ultimo sforzo per vedere se qualcun altro ha trovato software simile a questo, e sa come sarebbe stato scritto.C# Mantenere la CPU a/vicino all'uso percentuale designato a scopo di test

Modifica: Ho tentato di utilizzare un thread con priorità più bassa e mi è stato anche detto che non sarebbe stato utile per loro (anche se avevo l'opzione creata solo per lo scopo di testare prima che mi venisse richiesto).

+0

Non sono a conoscenza di alcun modo per limitare la potenza della CPU che è possibile consumare, ovvero il compito del sistema operativo, determinare la pianificazione; oltre a limitare il numero di core che può utilizzare. Quello che puoi fare è alterare la priorità del processo, stavo per menzionarlo anche dormendolo, ma hai già notato che questa è una soluzione imperfetta. –

risposta

3

Abbiamo fatto qualcosa di analogo mentre sintonizzavamo un server delle applicazioni. Abbiamo riscontrato che il nostro throughput complessivo era migliore quando la CPU era intorno al 70%. La nostra soluzione era quella di far ruotare i fili aggiuntivi, con un ritardo tra ciascuno, fino al raggiungimento del carico desiderato. Se la CPU superava l'80%, abbiamo ridotto il numero di thread in esecuzione (segnalato un thread per completare il lavoro corrente e quindi terminare). Se la CPU è scesa al di sotto del 60%, abbiamo attivato una nuova discussione.

È possibile applicare una logica simile per creare un carico artificiale che è possibile regolare a un utilizzo della CPU di destinazione. I thread dovrebbero bilanciare CPU e non CPU (IO o semplicemente sleep) per consentire la regolazione fine. Se i tuoi thread richiedono molta CPU, ognuno di essi consuma 1 core CPU a circa il 100%.

+0

Se non ti dispiace chiederti, come è stata la tua discussione? Attualmente ho solo il mio fare un'aggiunta e una sottrazione costanti in un ciclo infinito, e che mangia un intero core da solo (anche se la macchina su cui sto lavorando al momento non è molto potente) – wgallon

+0

@BillyGallon, CPU infinita loop associato mangerà il 100% di un core su qualsiasi macchina (a meno che la pianificazione del livello OS non pianifichi quel thread a causa di priorità o altri limiti, come suggerito da usr) –

+0

I thread nel nostro caso hanno fatto il lavoro nel mondo reale, selezionando i dati da una tabella DB e quindi eseguendo calcoli su di essa. Sospetto che l'intercalare delle chiamate Thread.Sleep (sleep per intervalli casuali ma piuttosto brevi) con calcoli intensivi della CPU dovrebbe consentire di creare un thread che calcola la media dell'utilizzo della CPU in modo da avere una ragionevole capacità di controllare il carico generale generato da un numero di thread . –