dégradation des performances, cpu 95%

dégradation des performances, cpu 95% - Win NT/2K/XP - Windows & Software

Marsh Posté le 05-10-2007 à 14:10:35    

Bonjour,
Je suis nouveau sur le forum, mais j'en apprécie fortement le contenu.
Mon problème est le suivant :
j'ai développé en C un programme qui utilise une carte de communication spécifique, une base de donnée (Mysql) et un serveur web (apache) hébergé sur le disque.
au début tout va bien, j'ai une utilisation de la cPU à 2 à 3% avec 5Mo de mémoire utilisée.
Mon programme tourne en mode boucle (les mêmes tests sont effectués sans relache) 24h/24 et affiche les résultats au fil de l'eau sur une console DOS.
çà défile tout le temps et là y'a pas de problème.
Cependant, au bout d'environ une douzaine d'heure, je constate que le temps CPU utilisé par mon programme passe à 90% avec des pics à 100%, et ce avec :  
- une utilisation mémoire qui n'a pas beaucoup bougé (5 à 6 Mo)
- et + surprenant je n'ai aucun ralentissement sur le PC des autres process standard ou spécifique : je lance l'explorateur sans problème et sans attente, ou de la navigation sur internet ou office sans constater un retard quelconque.
- si je lance une application gourmande en CPU (ex : WinTV), et bien pas de problème, le temps CPU se divise sans problème entre les deux (60% pour mon programme et 30% pour WinTV), puis si j'arrete WinTV, alors mon process revient à 98%.
- j'ai remarqué par contre que si mon écran passait en veille depuis un certain temps, (toujours avec mon programme qui tourne derrière) et bien le temps de réaffichag de l'écran (suite à la pression sur une touche) peut être long (15 à 20 secondes), c'est vraiment le seul cas où je constate un ralentissement momentané, et encore ce n'est pas systématique
Avec processExplorer, j'ai pu voir que mon programme utilise 3 threads :  
 - mon programme pour 45% de temps CPU
 - msvrt.dll pour 45% de temps CPU (bib de runtime pour le C je crois)
 - le driver de la carte de com utilisée pour 2à 3% de CPU
et c'est tout (pas d'autre pilotes ou de process tiers).
J'utilise un PC 2GHz DualCore HP Pavillon avec Windows Home, AVG comme antivirus et ZoneAlarme comme FireWall (cela ne change rien qu'ils soient actifs ou non) et 1,5Go de mémoire virtuelle.
le journal des performances ne me dit rien non plus
 
Tout ce que je peux dire, c'est que tant que je continue à me servir du PC au début du lancement, je ne rencontre pas de problème mais si je le laisse tourner tout la nuit sans y toucher (et avec mon appli en cours) et bien le matin j'ai le droit au 100% mais sans l'effet d'attente lié au 100%  
Je n'ai trouvé aucun moyen d'y pallier (hormis de lancer d'autre exe). En somme mon process se comporte un peu comme le "processus inactif du system (IDLE)" du gestionnaire des tâches .
 
Quelqun ou quelqune a t'il une idée ?
Merci d'avance
 
 

Reply

Marsh Posté le 05-10-2007 à 14:10:35   

Reply

Marsh Posté le 05-10-2007 à 15:00:14    

Salut
 
T'as mis une  pause dans ta boucle?

Reply

Marsh Posté le 05-10-2007 à 20:20:49    

Merci de m'avoir répondu, mais, non, je n'ai pas de pause.
Ma boucle attend des communications dont elle stocke le résultat en Base de Donnée.
J'avais déja ce phénomène en mode débug (avec Borland C++) et je pensais que cela était peut être dû à l'environnement de développement, mais j'ai le même phénomène sans débug.
C'est surtout l'absence "pratique" de dégradation alors que cela affiche 100% d'utilisation CPU que je trouve pas très logique. je me demandais si quelqun avait déja rencontré ce phénomène et s'il n'existait pas des outils d'aide au diagnostic
Je poursuis mes investigations en attendant mieux...

Reply

Marsh Posté le 09-10-2007 à 14:17:05    

Un programme en boucle sans pause fait tourner la machine au maximum de ses capacités en jouant à la fois sur la priorité du processus et la réservation du processeur.  
Quand tu n'as aucun autre activité, l'OS va donner 100% des capacités du processeur mais en priorité de plus en plus faible. C'est pour cette raison que lorsque tu reprends en main ta machine, tu n'es pas du tout gêné par des problèmes de performances.
Ceci est valable quel que soit l'OS et la machine.
 
Pour ton programme, recherche dans la doc une fonction d'écoute de port (COM, LAN, etc...). Ce type de fonction met en pause le programme tant qu'il n'y a pas d'activité. Dès qu'il y a un paquet, il est lu tout de suite et le programme fait ce qu'il doit faire.
 
Si tu ne trouves pas dans la doc, demande sur le forum développeur.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed