Retourner aux forums || Retourner au forum Programmation.c

Programmation.c : Occupation CPU

Posté par JaguarWan () le 04 août 2004
0
Salut à vous,
Je suis en train de coder un petit serveur en utilisant les pthreads. Le problème, c'est que le thread faisant tourner la fonction serveur utilise 99% du CPU, à cause des i/o non bloquantes. Le code ressemble à ça :

void *server(void)
{
....while ( contrôle du serveur)
....{
......../* Prépare le select à grand coup de FD_SET */
......../* Prépare la structure timeval, avec un timeout de 5000 uS */
........select
......../* Teste le set de socket et lance des threads interpreteurs */
......../* Teste une variable globale contrôlant l'état du serveur */
....}
....pthread_exit(code d'erreur);
}

Comment faire pour réduire la charge CPU à quelque chose de plus raisonnable ? J'ai joué un peu avec le timeout de select, mais ça n'a pas amélioré les choses. D'autre part, on m'a dit qu'utiliser les variables globales en C, c'était Mal, mais je ne vois pas comment m'en passer avec les threads. Y a-t-il un procédé plus élégant ?

Merci pour votre aide :)

> Lire le message (8 commentaires, moyenne: 3,3).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

select() + timeout

Posté par WildChild (page perso, ) le 05/08/2004 à 04:58. (lien). Évalué à 3.

Ici sur un select() qui boucle à chaque 50 milisecondes la charge CPU tombe à 0 sur un projet de serveur que j'ai. J'ai besoin de faire ce bouclage sous Windows pour vérifier les événements de la console. Sous Linux je ne boucle pas sur un timeout mais ayant essayé le timeout qui fait boucler la charge CPU est aussi à 0. Par contre, je n'ai jamais joué avec les pthreads.

Non ce n'est pas mal

Posté par Pascal (page perso, ) le 05/08/2004 à 07:24. (lien). Évalué à 3.

D'autre part, on m'a dit qu'utiliser les variables globales en C, c'était Mal
Non ce n'est pas mal tant que c'est utilisé judicieusement.
Mais si c'est mal utilisé c'est catastrophique pour la lisiiblité et la maintenance. C'est pour cela que l'on conseille souvent eux débutants de ne pas les utiliser.

timeout

Posté par gc (page perso, ) le 05/08/2004 à 07:31. (lien). Évalué à 4.

déjà un timeout de 5000 uS c'est à dire 5 ms c'est très peu. il faut savoir que la résolution sur ta machine est sûrement de 10 ms de toutes façons, si ton HZ est à 100 comme c'est par défaut (seuls les processus root realtime pourront faire des choses plus précises). je pense que si tu l'augmentes il n'y a pas de raison que ça continue à tout bouffer.

  • [^]Re: timeout

    Posté par Nicolas Boulay () le 05/08/2004 à 08:19. (lien). Évalué à 3.

    Pour compléter, le HZ a 100 (== 10 ms) est le default des noyaux 2.4. Le 2.6 est passé à 1 ms. Il existe des kernel red hat 2.4 à Hz=512 (<2ms).

    Donc boucler à moins que le HZ, fait que la tache est tout le temps prète.

    sinon, je pense que le timout du select peut être très élevé sans que cela gène quoi que se soit.

    • [^]Re: timeout

      Posté par gc (page perso, ) le 05/08/2004 à 14:57. (lien). Évalué à 5.

      le défaut du 2.6 est à 100 aussi pour raison de compatibilité, en tous cas c'est ce que j'ai lu de la main de Robert Love il y a quelques jours..

      tes deux dernières phrasent se contredisent, tu ne crois pas ?

Ma méthode à moi...

Posté par Jean-Baptiste Mayer () le 05/08/2004 à 08:35. (lien). Évalué à 4.

Je fais généralement un pipe entre un thread de contrôle et le thread serveur; la sortie du pipe est dans les descripteurs surveillés par select, comme ça, pas besoin de timeout.
Lorsque le thread de contrôle veut dire quelque chose au thread serveur, il le réveille en écrivant dans le pipe, le reste de la comm se fait par segments de mémoire partagés.

  • [^]Re: Ma méthode à moi...

    Posté par JaguarWan () le 05/08/2004 à 16:41. (lien). Évalué à 2.

    Merci beaucoup, je pensais boucler à 50 ms et non 5... honte sur moi !!
    Pour le contrôle, en fait ma fonction serveur lance un mini shell dans un autre thread au début, avant de boucler, en lui passant un pointeur vers une structure contenant quelques booleens et un pointeur sur requête. Comment ça se présente au niveau code la technique du pipe ? C'est portable ?

    • [^]Re: Ma méthode à moi...

      Posté par JaguarWan () le 05/08/2004 à 17:06. (lien). Évalué à 2.

      OK, j'ai trouvé un tutorial assez succint, si j'ai bien compris ça consiste à partager un descripteur pour éviter d'utiliser des mutex... Je vais essayer ça.

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c