Page 1 sur 1

Apache et multi-coeur

Posté : 26 sept. 2012, 09:22
par Wells83
Bonjour à tous, suite au dev d'un script nécessitant pas mal de ressources (longue boucle)

je me suis rendu compte que le processus httpd.exe (apache) plafonne à 25% du CPU

En fait j’ai un processeur quadri-core, et apache semble se cantonner à n'utiliser qu'un seul des 4 cœurs.

Est ce normal , Est ce configurable ?

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 09:37
par Berzemus
Apache l'est, sans soucis. Mais est-ce que ton script l'est ?

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 09:58
par Wells83
Hum, si je te suis, c'est dans notre code PHP qu'on doit gérer l'utilisation par Apache des différents processeurs/code.

Ça me semble super lourd ! D'autant plus que je n'ai qu'un seul processus (pas de tache en //) qui prend beaucoup de temps. Donc le multi-thread ne m'aidera pas.

J'aimerais que cet unique processus utilise 100% des capacités de ma machine.

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 10:35
par xTG
Faut pas croire que si le processeur tourne à 100% c'est qu'il va plus vite...
Il plafonne à 25% c'est soit qu'il est limité par la configuration de l'OS ou d'Apache.
Soit tout simplement qu'il n'a pas besoin de plus (qu'il ne peut pas aller plus vite).

Vitesse et consommation sont deux choses totalement différentes. ;)

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 11:12
par Wells83
Je pense dans mon cas, que apache est limité à 1 cœur sur les 4.

Mais je ne sais pas pourquoi, y a t'il un fichier de conf à regarder à ce sujet ?

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 11:30
par xTG
Si Apache exécute un script à la fois de toute façon je vois pas pourquoi il utiliserait plusieurs coeurs. :lol:
Il me semble t'avoir vu écrire que tu n'avais rien de parallélisable donc... Un process peut avoir une affinité sur plusieurs coeurs, MAIS à un instant t il ne peux tourner que sur un seul coeur. De plus il faut savoir que la migration d'un process sur un autre coeur n'est pas un temps nul. L'ordonnanceur de l'OS le fait automatiquement dans certains cas mais applique un algorithme optimisé.
De plus ton 25% c'est quoi ? Un coeur ou bien la moyenne sur tous les coeurs ?

N.B : je suis pas dans le métier du web donc je ne saurai te répondre quand à la configuration d'Apache, mais par contre je suis dans le métier du développement multicoeur.

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 11:45
par Berzemus
Apache est mutli-coeur, multi-thread, multi-processus, tout ce que tu veux. :mrgreen:

Le problème, c'est que ton script qui ne l'est pas. Alors oui, c'est tentant de mettre la faute sur Apache, mais ce dernier n'y est pour rien: il ne fait qu'attendre que ton script se termine. Il n'est même pas concerné, en fait. Il est comme toi, avec un cerveau humain qui traite des milliers de choses en parallèle: il attend que php daigne se terminer.

Ta question est donc : PHP et multi-coeur...

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 12:10
par Wells83
Le probleme c'est que je vois pas comment lancer la meme boucle sur des threads multiples.

Ca me semble impossible. Ce qui signifie que sur un gros scripts, php n'utilise qu'1/4 de la puissance réellement disponible, ce que je trouve assez abhérant mais bon :)

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 13:30
par Mazarini
Je ne suis pas sur que beaucoup de programmes utilisent plusieurs coeurs en parallèle. Le multi coeur me semble plus utilisé pour effectuer plusieurs programmes en parallèle. D'ailleurs apache peut répondre à plusieurs requetes en parallèle.

Je ne suis pas sur que php soit adapté à des traitements très lourd, voir encore moins php en mode web.

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 13:31
par Berzemus
Ce qui signifie que sur un gros scripts, php n'utilise qu'1/4 de la puissance réellement disponible, ce que je trouve assez abhérant mais bon :)
C'est pas aberrant du tout :wink: c'est au programmeur d'intégrer le parallélisme dans son "oeuvre", pour autant que le langage qu'il choisit le lui permet. Ce qui n'est pas tout à fait le cas de PHP, malheureusement.

Il y a plusieurs façons d'y arriver, le plus propre étant l'utilisation des fonctions PCNTL:
http://uk.php.net/manual/fr/function.pcntl-fork.php

Ceci dit, la programmation parallèle renverse tout une série de concepts liés à l'algorithmique classique, et demande une manière de penser toute autre. Par exemple, tu parles d'une "boucle". Que se passerait-il si chaque itération de ta boucle s'exécuterait en même temps ? Ou dans le désordre ? Ou qu'une d'entre elle ne se plante ?

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 14:18
par xTG
Ca me semble impossible. Ce qui signifie que sur un gros scripts, php n'utilise qu'1/4 de la puissance réellement disponible, ce que je trouve assez abhérant mais bon :)
Tu n'utiliseras de manière jamais toute la puissance d'un processeur avec un script PHP.
Même avec un programme écrit en C ce n'est pas toujours le cas. En règle générale même si l'indicateur système t'indique 100% il n'utilise véritablement que 40-50% de la véritable puissance du cpu (les opérations de base en gros). Les optimisations des compilateurs ne sont pas parfaites ce qui fait qu'ils ramènent majoritairement à des instructions de base, le reste est donc sous-utilisé.
En règle générale il n'y a que les benchmarks cpu qui utilisent 99% des capacités du processeur pour faire des tests de températures ou autre.
La seule opération qui fait travailler énormément le cpu dans tous les programmes que j'ai eu loisir de voir c'est la compilation d'un noyau linux. x)

Concernant la programmation parallèle c'est pas vraiment le lot de PHP... Il n'a clairement pas été écrit pour cela.
Cependant tu peux regarder comme te le suggères Berzemus du côté de la PCNTL, c'est un bon début.
Mais saches que la programmation parallèle c'est tout un paradigme...
Je retravaille justement en ce moment des programmes (C/C++) pour qu'ils exploitent des machines multicoeurs et c'est pas la joie...
PHP n'a pas les outils nécessaires pour faire de l'exclusion propre pour ce que je sache, donc personnellement je m'aventurerai même pas à faire de la programmation parallèle sans ce genre d'outils... C'est tout simplement suicidaire de jouer avec de la mémoire partagée sans cela.
Et si c'est pour faire de la duplication de données de partout pour combler ce manque... Je doute qu'au final on obtienne un meilleur temps de traitement, bien au contraire !

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 14:36
par Wells83
Hum oui sauf du coup y a une grosse différence entre un dual core avec une grosse fréquence et un quadri avec des fréquences moyennes.

Re: Apache et multi-coeur

Posté : 26 sept. 2012, 14:48
par Mazarini
Il ne faut pas oublier qu'il n'y a pas qu'un processus qui tourne. L'affichage d'une page utilise souvent plusieurs processus pour les images et surtout il peut y avoir plusieurs clients de connecté. Ceci sans parler des autres processus.

Au passage, des processeurs profitent de l'inactivité de certains coeurs pour augmenter leur fréquence.

Re: [RESOLU ?] Apache et multi-coeur - compléments - infirma

Posté : 28 mars 2013, 01:22
par trebly
Bonsoir,

:o Vrai et faux tout ce qui a été dit et que je découvre aujourd'hui.

Oui Apache exécute une requête http sur un seul coeur.

:wink: Mais il faut savoir qu'une requête principale génère des requêtes secondaires en cascade, c'est le patron qui donne ses ordres c'est tout.

:idea: Non ce n'est pas difficile d'accélérer une exécution grâce à un parallélisme : il suffit de savoir que lorsqu'un navigateur reçoit une instruction html, notamment comprenant "href" ou "src" c'est lui qui va automatiquement lancer une requête complémentaire.

=D> Alors tout est imaginable :
  • Le chargement des images se fera sur un second ou n ième coeur
  • un iframe qui chargera une part de la page génère sur le même serveur mais un autre coeur générera une nouvelle requête
  • un href vers la même appli globale mais faisant référence à une partie d'appli indépendante (retourner le flux d'un texte demandé) pourra renvoyer un contenu (texte, images suivant type mime donné)
  • js ajax peut permettre énormément de choses en mettant à jour des zones avec des flux très faibles en volume et en temps d'exécution (i.e. jqgrid)
  • des liens via jquery de même
  • on peut aussi soulager un serveur en faisant résider les src: *.js *.css etc... images, video etc... sur un autre, pour les videos youtube, kaltura sont spécialisés etc.
:wink: Bien sur l'astuce est aussi d'envoyer sa(ses) page(s) par morceaux pour permettre au navigateur de travailler, au fur et à mesure.

:) En résumé il y a le processus principal qui utilise un seul cœur c'est vrai mais un nombre illimité de processus secondaires sont lancés presque tout seuls. Il suffit de penser à les utiliser, ils sont là à disposition (HTML5 nous y aide).

Tout ça permet de diviser les temps de réponse à une requête et le travail du cœur "principal" dans des facteurs impressionnants.

A bientôt

Trebly