View Full Version : [Windows] Misurare le prestazioni di un programma
sottovento
15-03-2006, 06:57
Forse nel thread precedente ho formulato la domanda in maniera errata: qualcuno sa come ottenere, dal Performance Monitor, campioni a tempi inferiori al secondo?
In alternativa, ci sono altri programmi per misurare il tempo di CPU? Cosa usate voi per verificare le prestazioni?
High Flying
Sottovento
sottovento
15-03-2006, 16:03
So che il quesito e' difficilotto... non c'e' nessuno che sappia qualcosa a riguardo? Le mie cpu sono al massimo e non so perche'...
So che il quesito e' difficilotto... non c'e' nessuno che sappia qualcosa a riguardo? Le mie cpu sono al massimo e non so perche'...
mmmmmm...... qualche virus?
se nn mi sbaglio sul forum da qualche parte ho letto una discussione nella quale un ragazzo aveva il tuo stesso problema.... cioè le prestazioni della cpu stavano al max!
ciauz
sottovento
16-03-2006, 09:40
Grazie per il consiglio, ma e' categoricamente escluso.
Si tratta di una macchina (meglio, di una serie di macchine) particolari, collegate in rete fra loro e senza alcun accesso esterno. Fisicamente, sono staccate da Internet e nessuno puo' accederci nemmeno con un CD, un floppy o ona chiavetta USB. Il backup e' controllato da una persona affidabile.
E' sicuramente un problema di performance della mia applicazione, quando tutto va a regime, tutte le cpu sono piuttosto cariche. Secondo il progetto iniziale non doveva essere cosi'.
Sto quindi cercando di fare un'analisi, usando perfmon di Windows, ma se qualcuno ha altri suggerimenti (profilers, o altri tool), tutto e' graditissimo
High Flying
Sottovento
Grazie per il consiglio, ma e' categoricamente escluso.
Si tratta di una macchina (meglio, di una serie di macchine) particolari, collegate in rete fra loro e senza alcun accesso esterno. Fisicamente, sono staccate da Internet e nessuno puo' accederci nemmeno con un CD, un floppy o ona chiavetta USB. Il backup e' controllato da una persona affidabile.
E' sicuramente un problema di performance della mia applicazione, quando tutto va a regime, tutte le cpu sono piuttosto cariche. Secondo il progetto iniziale non doveva essere cosi'.
Sto quindi cercando di fare un'analisi, usando perfmon di Windows, ma se qualcuno ha altri suggerimenti (profilers, o altri tool), tutto e' graditissimo
High Flying
Sottovento
capisco... nn vorrei entrare nella tua vita privata/professionale, ma di che progetto si tratta??? se puoi dircelo così vediamo di risolverlo assieme..... sempre se puoi/vuoi!
ciauz ;)
Alberto.
sottovento
16-03-2006, 13:07
Ciao,
molto gentile. Vorrei ma non posso. Cmq si tratta di un'applicazione di automazione.
Nel momento che le macchine cominciano a lavorare (e si scambiano messaggi), le CPU sono veramente occupate. Da progetto non avrebbe dovuto esser cosi', e ci sono ancora tanti altri processi da far partire.
Le macchine in dotazione hanno un bel po' di pepe... e' veramente strano.
Ho cominciato a fare un po' di analisi col perfmon di Win, ma per ora non sono arrivato a capo a niente.
In piu', nutro anche dei dubbi sull'attendibilita' delle misure che faccio: i dati vengono scambiati con tempi dell'ordine delle centinaia di msec, perfmon mi da valori di occupazione/... non inferiori al secondo.
Non so cosa fare....
High Flying
Sottovento
Ciao,
molto gentile. Vorrei ma non posso. Cmq si tratta di un'applicazione di automazione.
Nel momento che le macchine cominciano a lavorare (e si scambiano messaggi), le CPU sono veramente occupate. Da progetto non avrebbe dovuto esser cosi', e ci sono ancora tanti altri processi da far partire.
Le macchine in dotazione hanno un bel po' di pepe... e' veramente strano.
Ho cominciato a fare un po' di analisi col perfmon di Win, ma per ora non sono arrivato a capo a niente.
In piu', nutro anche dei dubbi sull'attendibilita' delle misure che faccio: i dati vengono scambiati con tempi dell'ordine delle centinaia di msec, perfmon mi da valori di occupazione/... non inferiori al secondo.
Non so cosa fare....
High Flying
Sottovento
figurati..... se ci possiamo dare una mano un pò tutti è meglio!!!
nn saprei proprio?!?!!?
vediamo se dice qualcosa qualche altro utente un pò + esperto!!! ;)
ciauz, Alberto.
sottovento
16-03-2006, 13:47
Grazie, comunque parlarne aiuta anche a chiarire le idee.
Ho un'altra domanda: avrei bisogno di contare il numero di context-switches in un secondo. So che le vecchie versioni di perfmon lo potevano fare, in questa nuova non so come si fa.
Qualcuno ha un'idea?
High Flying
Sottovento
Premetto che di programmazione non capisco niente, o quasi. Ma leggendo il tuo problema mi è venuto in mente che quando faccio partire i giochi di parecchi anni fa, quelli per DOS e quando facevo i programmini in C (somma, cicli iterativi, etc...) la CPU andava al massimo.
Ma non potrebbe essere qualche problemino di emulazione?!?! :confused:
Premetto che di programmazione non capisco niente, o quasi. Ma leggendo il tuo problema mi è venuto in mente che quando faccio partire i giochi di parecchi anni fa, quelli per DOS e quando facevo i programmini in C (somma, cicli iterativi, etc...) la CPU andava al massimo.
Ma non potrebbe essere qualche problemino di emulazione?!?! :confused:
vabbè..... ma stai parlando di cpu vekie o attuali in riguardo ai giochi?????
ciauzzzzzzzzzzzz ;)
^TiGeRShArK^
16-03-2006, 20:38
Forse nel thread precedente ho formulato la domanda in maniera errata: qualcuno sa come ottenere, dal Performance Monitor, campioni a tempi inferiori al secondo?
In alternativa, ci sono altri programmi per misurare il tempo di CPU? Cosa usate voi per verificare le prestazioni?
High Flying
Sottovento
ehm...
ma se ad esempio l'applicazione è in un ciclo è normale ke la cpu sia sempre al max..
ad esempio in diamonds per ovviare al problema abbiamo inserito alla fine di ogni ciclo un thread.sleep() di 1 ms che permette di abbassare di molto l'occupazione della cpu.
Ovviamente senza sapere niente di + preciso sulla tua applicazione nn so come aiutarti...
almeno il linguaggio di programmazione usato???
vabbè..... ma stai parlando di cpu vekie o attuali in riguardo ai giochi?????
ciauzzzzzzzzzzzz ;)
Nuove a casa ho un Athlon 2700+ :cool:
Nuove a casa ho un Athlon 2700+ :cool:
miiiiiii......... :)
OT: athlon 2700+..... vekkio!!! :sofico:
skerzo... ciauz! ;)
sottovento
17-03-2006, 07:08
ehm...
ma se ad esempio l'applicazione è in un ciclo è normale ke la cpu sia sempre al max..
ad esempio in diamonds per ovviare al problema abbiamo inserito alla fine di ogni ciclo un thread.sleep() di 1 ms che permette di abbassare di molto l'occupazione della cpu.
Ovviamente senza sapere niente di + preciso sulla tua applicazione nn so come aiutarti...
almeno il linguaggio di programmazione usato???
Ciao,
naturalmente e' ovvio che tutti i processi siano in un ciclo, visto che l'applicazione deve girare 24 ore al giorno per 20 anni.
Si e' pero' provveduto ai necessari meccanismi IPC per fare in modo che non esistano polling, bensi' ogni processo "dorma", a parte alcuni processi ciclici, i quali pero' si "svegliano" a intervalli biblici (una volta al minuto, ...).
Il tempo di occupazione della CPU quindi, nel caso alcun evento esterno arrivi (per eventi esterni mi riferisco a messaggi di rete ed eventuale I/O) dovrebbe essere pressoche' zero. In realta', registro su ognuna delle 4 CPU di ogni PC del progetto (i quali sono dotati di 4 Gb di RAM, e sembra utilizzata egregiamente) un carico medio del 20%.
Quando arrivano i messaggi per una nuova elaborazione, il carico delle CPU e' intorno al 50%, mentre il nostro progetto prevedeva un valore molto piu' basso. Infatti sto facendo questi test prima del commissioning, ed una buona parte dei processi sono ancora fermi perche' i relativi messaggi non sono ancora spediti.
Se tutto rimane in questa proporzione, la potenza di calcolo prevista non mi bastera'. Ovviamente il problema non e' questo, poiche' se c'e' qualcosa che non va, anche acquistando nuovo hardware potrei saturarlo immediatamente senza ottenere apprezzabili incrementi di prestazioni.
Le applicazioni sono sviluppate principalmente in C++, con la maggior parte delle comunicazioni fatte in CORBA.
Dopo varie analisi, ho la viva impressione che il problema sia legato ai ripetuti context-switch che i processori devono fare da un processo all'altro.
Questo numero potrebbe essere legato ad un uso di meccanismi di sincronizzazione (quali semafori e tutto il resto) ad un livello TROPPO BASSO, i quali obbligano la CPU a switchare inutilmente.
Ovviamente e' solo una supposizione...
Per provarlo, vorrei usare il "perfmon" di Windows. Purtroppo, non so per quale motivo, sembra che questo counter SIA SPARITO!!! Mi ricordo che c'era sui sistemi NT, su XP ci sono tante altre belle cose (quanto spesso inutili) ma non il context switch.
Quello che mi chiedevo e' se esisteva un tool, anche commerciale, che potesse darmi questi valori. Inoltre sarebbe bello avere anche un profiler di quelli tosti....
Scusate la lunghezza del posto
Sottovento
franksisca
17-03-2006, 07:41
credendo che tu stia parlando di sistemi operativi in rete, non è che per caso la gestione delle strutture dati è poco efficiente???
mi spiego meglio:
Avendo fatto un sistema operativo in java(tranquilli, mooooooolto sempliice:D) mi resi conto che la gestione dele code mi occupava moolta cpu, anche a 0 processi in entrata.
adesso dico, potrebbe essere che un qualcosa di simile succeda nella tua applicazione???
I semafori se fatti bene, non dovrebbero rompere tanto....
sottovento
17-03-2006, 07:58
credendo che tu stia parlando di sistemi operativi in rete, non è che per caso la gestione delle strutture dati è poco efficiente???
mi spiego meglio:
Avendo fatto un sistema operativo in java(tranquilli, mooooooolto sempliice:D) mi resi conto che la gestione dele code mi occupava moolta cpu, anche a 0 processi in entrata.
adesso dico, potrebbe essere che un qualcosa di simile succeda nella tua applicazione???
I semafori se fatti bene, non dovrebbero rompere tanto....
Hai ragione, non rompono tanto. Pero' obbligano a fre un context switch.
La mia paura (prossimo test che voglio fare) e' che siano stati utilizzati per la sincronizzazione ad un livello troppo basso.
Come sai, quando si programma, si scrivono procedure le quali vanno ad usare procedure... e cosi' via. Si procede dal basso livello verso l'alto.
Se la sincronizzazione con semafori e tutto il resto avviene ad un livello troppo basso, essa avverra' migliaia di volte quando in realta' era sufficiente una volta sola (quantomeno per l'uso attuale).
A parte la cpu sprecata per sincronizzazioni inutili, il problema e' che se un processo si trova ad aspettare su un semaforo, esso viene tolto dallo stato di ready e ne viene mandato in esecuzione un altro, eseguendo appunto il context switch. Questa operazione richiede un bel lavoro da parte della cpu.
Quindi (indirettamente) l'uso dei semafori fa aumentare il tempo di CPU. Meglio: un uso ERRATO dei semafori RISPETTO a quanto si vuole ottenere.
Ovviamente e' solo una supposizione.
TROVATO - mentre scrivevo, ho trovato dove e' andato a finire questo counter. Lo pubblico nel caso serva a qualcuno:
Dopo aver lanciato perfmon, si puo' aggiungere un counter. Selezionare Threads e ci sara' la voce context switched/sec, il quale mostrera' quante volte la cpu e' costretta a cambiare contesto al secondo.
Per quanto riguarda il tuo consiglio sulle strutture dati, lo prendo sicuramente in considerazione e vado a fare una verifica. Grazie mille
High Flying
Sottovento
franksisca
17-03-2006, 09:11
Hai ragione, non rompono tanto. Pero' obbligano a fre un context switch.
La mia paura (prossimo test che voglio fare) e' che siano stati utilizzati per la sincronizzazione ad un livello troppo basso.
Come sai, quando si programma, si scrivono procedure le quali vanno ad usare procedure... e cosi' via. Si procede dal basso livello verso l'alto.
Se la sincronizzazione con semafori e tutto il resto avviene ad un livello troppo basso, essa avverra' migliaia di volte quando in realta' era sufficiente una volta sola (quantomeno per l'uso attuale).
A parte la cpu sprecata per sincronizzazioni inutili, il problema e' che se un processo si trova ad aspettare su un semaforo, esso viene tolto dallo stato di ready e ne viene mandato in esecuzione un altro, eseguendo appunto il context switch. Questa operazione richiede un bel lavoro da parte della cpu.
Quindi (indirettamente) l'uso dei semafori fa aumentare il tempo di CPU. Meglio: un uso ERRATO dei semafori RISPETTO a quanto si vuole ottenere.
Ovviamente e' solo una supposizione.
TROVATO - mentre scrivevo, ho trovato dove e' andato a finire questo counter. Lo pubblico nel caso serva a qualcuno:
Dopo aver lanciato perfmon, si puo' aggiungere un counter. Selezionare Threads e ci sara' la voce context switched/sec, il quale mostrera' quante volte la cpu e' costretta a cambiare contesto al secondo.
Per quanto riguarda il tuo consiglio sulle strutture dati, lo prendo sicuramente in considerazione e vado a fare una verifica. Grazie mille
High Flying
Sottovento
e di che, ma senti, per quel programmino, è free???
se si, basta una googlata o serve un lonk specifico???
sottovento
17-03-2006, 09:16
e di che, ma senti, per quel programmino, è free???
se si, basta una googlata o serve un lonk specifico???
perfmon, intendi? E' un programma installato di default in Windows XP, versioni Professionali. Lo trovi sotto Settings->Control Panel ->Administrative Tools-> Performance.
Su Internet trovi tanta informazione sul suo uso, su quanto sia bello, utile, ...
Mi e' stato suggerito di provare BoundChecker, hai esperienza a riguardo? Cmq se interessa, pubblico quanto riesco a trovare :)
High Flying
Sottovento
franksisca
17-03-2006, 11:03
quindi io che ho l'home mi frego:(:(
sottovento
17-03-2006, 11:28
quindi io che ho l'home mi frego:(:(
Hai provato a vedere se si trova anche in Internet? Se e' rilasciabile gratuitamente, magari lo trovi.
Potrebbe essere, invece, che i parametri visualizzati da perfmon siano misurati solo dalle versioni professional.... in quel caso, mi dispiace davvero, non puoi proprio farci niente.
Beh, vale la pena di provare, no? E' un tool davvero potente
High Flying
Sottovento
sottovento
17-03-2006, 12:24
quindi io che ho l'home mi frego:(:(
Ciao,
questo e' il secondo post per dirti che, in rete, ho trovato la libreriaNSClient4j la quale ti permette di accedere a tutti questi contatori direttamente da Java.
Da quel che ho capito sei uno smanettone di java, quindi magari ti puo' interessare (o magari, la conoscevi gia').
L'articolo che ne parla e' su
http://www.javaworld.com
franksisca
17-03-2006, 14:03
Ciao,
questo e' il secondo post per dirti che, in rete, ho trovato la libreriaNSClient4j la quale ti permette di accedere a tutti questi contatori direttamente da Java.
Da quel che ho capito sei uno smanettone di java, quindi magari ti puo' interessare (o magari, la conoscevi gia').
L'articolo che ne parla e' su
http://www.javaworld.com
wow, grazie mille, sei un mito;)
sottovento
17-03-2006, 14:10
Ci mancherebbe.
L'indirizzo completo e':
http://www.javaworld.com/javaworld/jw-11-2004/jw-1108-windowspm_p.html
Ti da tutte le info che ti servono, e le librerie da scaricare
High Flying
Sottovento
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.