Newsgroup: it.comp.lang.c
Titolo: programma che mangia la cpu

Salve a tutti,
vorrei avere qualche consiglio da esperti su un problema che affligge
un programma che sto sviluppando (un motore scacchistico su Linux). Il
guaio è che 'sto programma tende a far salire l'utilizzazione della
cpu via via che gira (lo vedo con il comando top), fino a rendere il PC
di una lentezza mostruosa dopo un paio d'ore.
'Sto programma mi aveva già fatto questo scherzetto qualche versione
fa e la causa era che non liberavo la memoria allocata da una malloc e
si provocava un "memory leak" (è corretto?).
Adesso non c'è neanche una malloc, se in una funzione ho bisogno ad
esempio di un vettore di strighe, lo dichiaro char[nr][nc] in modo che
la memoria sia liberata automaticamente all'uscita dalla funzione.
Mi rivolgo quindi a voi, o sapienti, per raccogliere qualche
suggerimento su come uscire dall'impasse! Cosa potrebbe causare la
crescita del carico della cpu?
Grazie,
Giuliano

 Giuliano
Forse la mia domanda e` molto stupida, ma quanti e quali processi
hai in esecuzione quando fai girare il tuo? Se c'e` poca roba, e`
normale che buona parte del tempo di esecuzione se lo mangi il tuo
programma (che comunque e` CPU intensive). Ad esempio, ora sto sotto
X, con firefox aperto, pine aperto, amsn aperto, un po' di terminali
aperti e, udite udite, gnuchess: top tiene praticamente sempre in cima 
alla lista gnuchess (ma non sto giocando) con un uso della CPU di
circa il 95-99%. E` normalissimo che un processo CPU intensive su
una macchina non particolarmente carica di processi CPU intensive
si prenda tutta la CPU. Per fare una prova, ho aperto un'altra
istanza di gnuchess e, guarda un po', l'uso della CPU delle due
istanze e` scesa a circa il 46-49%.
Saluti,
Marco
-- 
To email me, remove the no_ and _spam from my address.

 crescita del carico della cpu?
la crescita del carico della CPU e' normale. Il fatto che il sistema
diventi mostruosamente lento, dopo del tempo, invece no.
il tuo motore e' multi-threaded o single-threaded?
hai per caso cambiato la priorita' del processo?
dopo un paio di ore come mai usa la CPU:
- ci stai giocando tu?
- sta giocando in automatico online?
- hai implementato il pondering?
Prova a rispondere alle domande che ti ho fatto e magari a fornirmi
qualche dettaglio in piu'.
Ma ricorda che un programma di scacchi e' normale che tenda ad usare
tutta la CPU.
 
Tommaso
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
Grazie mille!
Giuliano


Grazie mille,
Giuliano

 
Saluti e grazie,
Giuliano

 "swappando" ?
vmstat, top o free.
Stai usando funzioni ricorsive ? non č che stai facendo esplodere lo 
stack con un una serie enorme di chiamate ricorsive ?


 stack con un una serie enorme di chiamate ricorsive ?
No :)
Giuliano

 "swappando" ?
Nei kernel 2.4.x top dava le informazioni di quanto swap veniva usato e 
la somma di quanto usato da ogni programma corrispondeva al totale 
usato.  Ora top da` numeri strani che non riesco a capire. Nel kernel 
2.6.1x non mi e` chiaro come sia gestito perche` i numeri non corrispondono.
In ogni caso vmstat e free danno informazioni sulla memoria. E se 
conosci il pid, /proc/<pid> contiene una serie di pseudo files con molte 
informazioni sul processo (per chi le sa interpretare).


 la memoria sia liberata automaticamente all'uscita dalla funzione.
Ciao,
 nr e nc sono costanti o argomenti? Nel secondo caso, credo che gcc
allochi i vettori nello stack, e quindi la memoria occupata non viene mai
liberata.
 Ciao
 Federico



Probabilmente sono argomenti e il gcc li alloca 'dinamicamente' sullo
stack. tuttavia, proprio perché parliamo di STACK la memoria verrà
rilasciata all'uscita della funzione.. si chiama stack per questo no ?



Ah. Ho capito ora cosa intendevi leggendo anche gli altri post. Tuttavia,
è vero che viene richiesta piu memoria incrementando lo stack ma è anche
vero che all'uscita della funzione quella parte di memoria viene 'markata
come libera' e verrà riutilizzata dalla prossima funzione (anche se non
viene rilasciata dall'applicazione).
By the way, tutto questo non mi pare possa entrarci con il rallentamento
della cpu :-)

 qualcosa che si accumulasse.
Lol! 200% ? E che vuol dire ? La percentuale non va da 0 a .. cough
cough.. 100 ? C'è qualcosa che non mi torna.. di quale campo di top stai
parlando ?

Matic a écrit :

top - 08:39:11 up 7 min,  3 users,  load average: 0.35, 0.54, 0.32
                                                  ^^^^
                                                  ^^^^
Questo arriva a 2,40 e oltre... bizzarro, no?
Giuliano

 Giovanni
Ciao,
Giuliano

JSorel a écrit :
[..]
Fatto il test:
1- %esp non aumenta costantemente come si poteva supporre, anzi resta
fisso nel punto in cui lo osservo (a 0xB7E789A8), quindi credo si possa
concludere che non è un problema di riempimento dello stack.
2- Ecco un esempio di cpu debordata: top dice questo:
top - 00:05:08 up 10 min,  5 users,  load average: 2.18, 1.51, 0.85
Tasks:  89 total,   2 running,  87 sleeping,   0 stopped,   0 zombie
Cpu(s): 95.3% us,  4.7% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,
0.0% si
Mem:    255832k total,   248640k used,     7192k free,    10548k
buffers
Swap:  1124508k total,        0k used,  1124508k free,   113804k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
21662 giuliano  15   0  9940  592  496 S 51.9  0.2   2:06.88 sc4v3ng3r
21660 giuliano  15   0  9940  592  496 S 42.9  0.2   1:43.00 sc4v3ng3r
.......
Notare i valori di load average!!!
Poi evolve cosi`:
top - 00:11:25 up 17 min,  5 users,  load average: 1.70, 1.77, 1.20
top - 00:12:17 up 18 min,  5 users,  load average: 1.43, 1.68, 1.20
top - 00:12:59 up 18 min,  5 users,  load average: 1.40, 1.65, 1.21
top - 00:13:50 up 19 min,  5 users,  load average: 1.44, 1.62, 1.22
top - 00:14:32 up 20 min,  5 users,  load average: 1.25, 1.54, 1.21
top - 00:15:31 up 21 min,  5 users,  load average: 1.89, 1.67, 1.27
top - 00:16:52 up 22 min,  5 users,  load average: 2.16, 1.76, 1.33
Insomma, non c'è una chiara tendenza al rialzo, ma questi valori sopra
1 non mi piacciono per niente!
3- free dice questo:
             total       used       free     shared    buffers
cached
Mem:        255832     251796       4036          0       9664
106148
-/+ buffers/cache:     135984     119848
Swap:      1124508          0    1124508
Dunque niente swap! (used 0)
4- anche gnuchess provoca valori di uso della cpu sopra 1 quando lo
faccio giocare contro se stesso:
top - 00:22:03 up 27 min,  5 users,  load average: 1.47, 1.16, 1.16
Tasks:  93 total,   4 running,  89 sleeping,   0 stopped,   0 zombie
Cpu(s): 99.0% us,  1.0% sy,  0.0% ni,  0.0% id,  0.0% wa,  0.0% hi,
0.0% si
Mem:    255832k total,   251860k used,     3972k free,     2260k
buffers
Swap:  1124508k total,     7632k used,  1116876k free,    71704k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
30630 giuliano  25   0 27664  17m  736 R 49.6  7.1   0:25.18 gnuchess
30615 giuliano  25   0 27664  17m  736 R 48.9  7.1   0:25.70 gnuchess
....
5- Mi sa che il mio programma è ok e che il problema è altrove
(hardware?).
Ok, vi ho rotto le scatole abbastanza, mi ritiro a vita privata e torno
nel regno dei lurker :)
Salut e grazie per l'aiuto e le informazioni,
Giuliano