Apache/PHP/MySQL : 44 Mo par process httpd ?

yo! les geeks,

Je suis en charge d’un site que je contrôle de A à Z. J’ai installé le serveur, compilé Apache/PHP/MySQL, écrit tout le code PHP, etc. Je suis un héro.
Toutefois, ma gloire souffre d’une utilisation mémoire des process httpd qui me semble un peu (beaucoup ?) anormale : 44 Mo par process !
C’est ce que me dit la commande “top” (colonne RES).

Connaissez vous un moyen de tracer l’utilisation mémoire d’Apache et PHP (en module) ?
J’ai du mal à comprendre d’où vient le squat d’autant de mémoire. Dans mon php.ini j’ai mis une limite à 8 Mo par script, et de toutes façons, je vois pas trop dans mon code ce qui pourrait utiliser de RAM.

Any idea ?
Merciiiiii
Antoine

D’abord, tu dois lire “SIZE” ou “VIRT” (en fonction de ta version de top) pour avoir la taille totale du processus.

Ici, j’ai du apache 1.3 debian woody qui fait des thread a 11Mo et du apache2 sur sarge qui fait du 20Mo.
Sur une machine que je gere pas, je vois apache 1.3 a 120Mo par processus (yalla) donc t’as de la marge.

Sinon, j’aurais tendance a deconseiller les serveurs de prod (apache et mysql en premier) en version home made compiled car c’est une galere sans nom pour les mise a jours.

LoneWolf
apt-get rulez.

[quote name=‘LoneWolf’ date=’ 23 Mar 2005, 12:41’]Sinon, j’aurais tendance a deconseiller les serveurs de prod (apache et mysql en premier) en version home made compiled car c’est une galere sans nom pour les mise a jours.
[right][post=“343559”]<{POST_SNAPBACK}>[/post][/right][/quote]

Et j’ai tendance a conseiller tout le contraire pour des raisons de performances evidentes. Hier je faisais des tests sur un script php que je developpe et j’ai lance un simulateur de clients dessus. 50 hits sur la homepage toutes les secondes pendant plusieurs minutes (ca a fait des pics de 150 processus httpd en meme temps) sur un serveur avec 512Mo de RAM. Le serveur a parfaitement bien tenu le coup, et des que le test etait fini, la reactivite etait redevenue comme avant.

Tu veux que le lance ce test sur un de tes serveurs avec des apache usine a gaz made in Debian ?

[quote name=‹ unreal › date=’ 23 Mar 2005, 12:49’]Tu veux que le lance ce test sur un de tes serveurs avec des apache usine a gaz made in Debian ?
[right][post=« 343563 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Ouais, pourquoi pas. File moi tout ca et j’install ca sur mon celeron 800 a la maison (328 de ram). Ca m’interesse assez.

Et tu me fileras la doc pour tout recompiler aussi, pour faire le test en version recompilee.

LoneWolf
On verra bien :stuck_out_tongue:

J’ai donc utilise Http_Load c’est tres facile a utiliser. Suffit de faire un make pour compiler.

Compile apache (1.3.x) :

Compile de php (4.3.x) :

C’est quoi ton simulateur, et quel est ton protocole ? si tu veux essayer de le lancer durant 3 minutes sur http://finn.homeip.net/graphes/ histoire de faire du mal (usage massif de gd inside)

Kikoo lol, ca fait du bien de te voir passer Unreal !

Ok Unreal, mais file aussi ton code php qu’on soit d’accord sur le fichier. Sinon, ca sert a rien :stuck_out_tongue:

Je te garantie pas le delai pour essayer tout ca par contre :stuck_out_tongue:

edit: fait peter le fichier de conf apache et de php aussi. Par mail ou PM comme tu veux :stuck_out_tongue:

LoneWolf
Connaissait pas http_load, tiens, sympa.

[quote name=‹ good_boy › date=’ 23 Mar 2005, 13:27’]C’est quoi ton simulateur, et quel est ton protocole ? si tu veux essayer de le lancer durant 3 minutes sur http://finn.homeip.net/graphes/ histoire de faire du mal (usage massif de gd inside)

Kikoo lol, ca fait du bien de te voir passer Unreal !
[right][post=« 343579 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Voila, done, euh, ton serveur a pas specialement bien tenu la charge :stuck_out_tongue:

[quote]6599 fetches, 1020 max parallel, 1.26617e+07 bytes, in 180 seconds
1918.74 mean bytes/connection
36.661 fetches/sec, 70342.9 bytes/sec
msecs/connect: 8523.26 mean, 54825.7 max, 28.945 min
msecs/first-response: 4850.07 mean, 58228.2 max, 48.429 min
3461 timeouts
3289 bad byte counts
HTTP response codes:
  code 200 – 3500[/quote]

Les « bad byte », ca veut rien dire, je crois que c’est parce que le soft a du mal avec le html 1.1. Par contre, les timeout, c’est pas bien.

Sinon, je pense que ton site c’est du statique plutot, avec des images precalculees (comme mrtg).

Lonewolf > bah teste avec un truc leger, genre DotClear vide.

[quote name=‹ unreal › date=’ 23 Mar 2005, 14:05’]Voila, done, euh, ton serveur a pas specialement bien tenu la charge :stuck_out_tongue:
Les « bad byte », ca veut rien dire, je crois que c’est parce que le soft a du mal avec le html 1.1. Par contre, les timeout, c’est pas bien.

Sinon, je pense que ton site c’est du statique plutot, avec des images precalculees (comme mrtg).
[right][post=« 343594 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Nanan, mate l’url des images. C’est que du bon gros gd des familles.
C’est fait exprès, j’allais pas te filer une page economique : un benchmark, c’est pas pour voir si ça passe, c’est pour voir quand ça casse…

Bon, comme je suis bon prince, je t’en colle une là, d’url de l’image :
http://finn.homeip.net/graphes/cpu.php?PC=…TH=500&OFFSET=0
Que du gd.

J’ai un peu du mal avec l’interprétation du rapport « 36.661 fetches/sec, 70342.9 bytes/sec » par exemple.

Sinon si tu regardes l’url susnommée on voit clairement que tu n’as pas fait les requêtes avec une petite machine, saloupiot. Rien que le débit des requêtes ça fait du 289 ko/s.

MERCI en tout cas !

[quote name=‹ good_boy › date=’ 23 Mar 2005, 14:24’]Nanan, mate l’url des images. C’est que du bon gros gd des familles.
C’est fait exprès, j’allais pas te filer une page economique : un benchmark, c’est pas pour voir si ça passe, c’est pour voir quand ça casse…

Bon, comme je suis bon prince, je t’en colle une là, d’url de l’image :
http://finn.homeip.net/graphes/cpu.php?PC=…TH=500&OFFSET=0
Que du gd.

J’ai un peu du mal avec l’interprétation du rapport « 36.661 fetches/sec, 70342.9 bytes/sec » par exemple.

Sinon si tu regardes l’url susnommée on voit clairement que tu n’as pas fait les requêtes avec une petite machine, saloupiot. Rien que le débit des requêtes ça fait du 289 ko/s.

MERCI en tout cas !
[right][post=« 343604 »]<{POST_SNAPBACK}>[/post][/right][/quote]

C’est tres rapide pour du gd alors.

Donc j’ai mis a 50/seconde, donc on pourrait s’attendra a du 50 fetches/sec, le pb etant que le serveur n’a pas reussi a faire les 50/seconde, donc les requetes sont retardees, jusqu’a timeout (parce que chaque seconde le serveur prend de plus en plus de retard pour traiter les requetes). Et les 70342.9 bytes/sec c’est ce qu’envoit ton serveur comme upload pour les 36.6 requetes/seconde reussies…

Ou ca devient tres drole c’est quand on fait des tests sur du php/MySQL. Beaucoup de sites php mal concus font des requetes MySQL a la pele (genre 200-300 pour une page d’accueil php-nuke), quand on multiplie ca par 20 requetes par seconde (disons), ca nous fait 4000 nouvelles requetes mysql par seconde (minimum) : on comprend vite pourquoi les nuke tiennent si mal la charge. :stuck_out_tongue:

Pour répondre au monsieur AntoineViau :

Si tu veux optimiser la RAM utilisé par ton couple Apache/PHP , deux solutions :

1/ enlever les modules non utilisés par ton apache ( les directives LoadModules … ) en etant sur que le module que tu enleves n’est utilisé nulle part.

Ca te fera grapiller un peu de RAM

2/ Ton PHP, fais un phpinfo et regarde bien si tu as vraiment besoin de toutes les options du phpinfo, auquel cas, recompile toi un php plus light avec uniquement les options dont tu as besoin.

Voila

En esperant avoir pu t’aider
++

F34R DA MIGHTY POWA DA MANDRAKE

512 de pc 2100 et un 1800+ qui pédale derrière…

En fait j’ai trois requêtes mysql par image, et je génère un tracé de courbe sur 180 points pour chaque. C’est codé pas orienté perf mais clarté, avec une boucle pour le min-max de l’échelle, c’est clairement pas une page ayant vocation à être rafraichie plus d’une fois à la minute…

Pour les timouts c’est ce qu’il me semblait, que ça repoussait tant que ça pouvait jusqu’à périr. Il faudrait refaire le test sur un dotclear vide, par exemple, voui.

Qu’on se la mesure entre une debian, une debian compilée et un gros rpm qui tache (mais en 2.6)

Comment on a détourné le thread, c’est impressionant.

&nbsp;PID USER &nbsp; &nbsp; &nbsp;PR &nbsp;NI &nbsp; &nbsp;RES &nbsp;SHR S %CPU %MEM &nbsp; &nbsp;TIME+ &nbsp;COMMAND 23433 apache &nbsp; &nbsp;15 &nbsp; 0 18248 5964 &nbsp;12m S &nbsp;0.3 &nbsp;1.2 &nbsp; 0:00.47 httpd2

Tu as raison sparc, on a meme pas repondu a la question du Monsieur :stuck_out_tongue:

Chez moi, mes processus httpd (apache 1.3.33, php 4.3.10) prennent 10Mo de ram a peu pres. 40 c’est tout simplement du grand n’importe quoi.

Bon, quelques infos en plus: j’ai fait quelques tests au taf.

D’abord, le matos:
Xeon 2.4 512Mo, disque RAID 1 (machine Dell)
Apache 2 sur sarge.

J’ai fait un premier test avec un fichier HTML classique:

lonewolf@guillaume:/tmp/http_load-04jan2002$ ./http_load -rate 900 -seconds 20 simple 19997 fetches, 13 max parallel, 2.15908e+08 bytes, in 20.006 seconds 10797 mean bytes/connection 999.549 fetches/sec, 1.07921e+07 bytes/sec msecs/connect: 1.80318 mean, 8.401 max, 0.129 min msecs/first-response: 2.16562 mean, 12.933 max, 0.622 min HTTP response codes: &nbsp;code 200 -- 19997
Ensuite, avec phpinfo();

lonewolf@guillaume:/tmp/http_load-04jan2002$ ./http_load -rate 250 -seconds 20 info 4998 fetches, 4 max parallel, 1.89419e+08 bytes, in 20 seconds 37899 mean bytes/connection 249.9 fetches/sec, 9.47096e+06 bytes/sec msecs/connect: 0.967764 mean, 2.472 max, 0.124 min msecs/first-response: 1.64396 mean, 3.638 max, 1.459 min HTTP response codes: &nbsp;code 200 -- 4998
Gag: je peux pas aller plus loin car j’ai du 100Mb/s et pas du 1Gb/s
Le test de phpinfo est interessant car il n’utilise que apache et php.
J’essaye de voir pour faire d’autres tests php de maniere a charger la machine.

Note: http_load est limite a 1000 requetes par secondes.

LoneWolf
On test…

Bon alors, les dernières news :
après interruption d’Apache puis relance, mes httpd sont de nouveaux propres (environ 8 Mo). Reste à observer le comportement sur les jours/semaines/mois à venir.
Là comme ça, tout de suite, je dirais : memory leak.

Antoine

[quote name=‘LoneWolf’ date=’ 23 Mar 2005, 16:33’]19997 fetches, 13 max parallel, 2.15908e+08 bytes, in 20.006 seconds

[right][post=“343641”]<{POST_SNAPBACK}>[/post][/right][/quote]

Le pb avec ton test c’est que le max parallel est tres faible, ce qui veut dire que le serveur est trop a l’aise pour que le test soit interessant. Faut viser un load serveur > 10 pour que tu puisses comparer apache+php precompile par rapport a un apache+php optimise.

[quote name=‘AntoineViau’ date=’ 23 Mar 2005, 16:53’]Bon alors, les dernières news :
après interruption d’Apache puis relance, mes httpd sont de nouveaux propres (environ 8 Mo). Reste à observer le comportement sur les jours/semaines/mois à venir.
Là comme ça, tout de suite, je dirais : memory leak.

Antoine
[right][post=“343645”]<{POST_SNAPBACK}>[/post][/right][/quote]

Normalement c’est impossible d’avoir des memory leak avec apache sous unix. Il marche par folk, donc les processus sont detruits tres frequemment.

Bon, unreal, t’es bete.

[quote name=‹ unreal › date=’ 23 Mar 2005, 14:05’][quote]
6599 fetches, 1020 max parallel, 1.26617e+07 bytes, in 180 seconds
1918.74 mean bytes/connection
36.661 fetches/sec, 70342.9 bytes/sec
msecs/connect: 8523.26 mean, 54825.7 max, 28.945 min
msecs/first-response: 4850.07 mean, 58228.2 max, 48.429 min
3461 timeouts
3289 bad byte counts
HTTP response codes:
  code 200 – 3500[/quote]
Les « bad byte », ca veut rien dire, je crois que c’est parce que le soft a du mal avec le html 1.1. Par contre, les timeout, c’est pas bien.
[/quote]
On va revenir sur ton interpretation des bad byte, c’est fun aussi.

Mais d’abord, j’aimerais savoir ce qui te permet de dire que le serveur de GB a pas bien tenu le coup.
Effectivement, on apprend qu’il ya eu 3461 timeout. My My. En general, en reseau, quand ca timeout, c’est que le cable est coupe - cas d’ecole.
Donc ca serait pas mal de savoir, deja, quelle est la taille de la page:

[quote]$ ./http_load -rate 1 -seconds 10 url
9 fetches, 1 max parallel, 33417 bytes, in 10 seconds
3713 mean bytes/connection
0.899996 fetches/sec, 3341.68 bytes/sec
msecs/connect: 0.23 mean, 0.286 max, 0.166 min
msecs/first-response: 2.761 mean, 6.102 max, 1.938 min
HTTP response codes:
  code 200 – 9[/quote]
On apprend ici que la page fait 3713 octets en moyenne, et vu le rate peu eleve qu’on a mis, ca doit etre la taille reelle. (la page peut etre plus petite quand on sauvegarde avec un navigateur, attention au texte dos/texte unix et aux headers http)
On apprend aussi qu’il y a un fetch manquant, et le probleme se repete quelque soit le nombre de seconde ou le rate: Quand ca roule, fetch = (rate * sec)-1

Mais revenons a nos 3713 octets. Ca nous fait donc 185650 octets qui devront etre transfere en une seconde. 180ko/s. Huuum… GB, il a une connexion freebox, ca plafonne a 100ko/s ces trucs la, nan?

Oh mais donc, le test, il a pas marche, parce que la BP etait pas suffisante, pas parce que le serveur etait sur les genoux. roooooh c’est dingue.

Et c’est ca qui m’eclate: Tu interprete a la volee les valeurs sans te poser de questions. Genre parallel max, je sais pas ce que c’est, c’est pas marque dans le manpage et franchement, ton interpretation ne me parait pas convaincante.
En revanche, pour le bad bytes count, tu aurais lu la doc, tu aurais su que c’est le nombre de page dont la taille ne matche pas avec le premier essai: CA VEUT DIRE QUELQUE CHOSE, au contraire: Si t’as des bad bytes count, c’est que ta BP est sature. (Ca peut avoir d’autres causes, mais c’est la principale: j’ai eu le probleme avec le test de phpinfo quand j’en ai demande trop par secondes: overload de la 100mb).

Pour la petite histoire, j’ai fait le test en local sur la machine de GB:

[quote]$ ./http_load -rate 200 -seconds 120 url
23999 fetches, 144 max parallel, 8.91083e+07 bytes, in 120 seconds
3713 mean bytes/connection
199.992 fetches/sec, 742569 bytes/sec
msecs/connect: 1.80602 mean, 2999.79 max, 0.077 min
msecs/first-response: 11.5233 mean, 717.114 max, 1.484 min
HTTP response codes:
  code 200 – 23999[/quote]
(dingue non)
Au dela de 200, le soft de test s’emballe et raconte nawak (plus de fetch que de requetes, c’est louche), je pense que c’est parce que je fais le test sur la machine qui a le serveur.
Sinon, j’ai regarde la page de GB. En fait, http_load ne fait qu’execute la page d’index, il ne lance pas les requetes pour les images autogenere en GD: c’est comme si on chargeait la page PHP sans demander les images que se generent a la volee. (pour voir ca, faites le avec lynx, c’est pareil)

[quote name=‹ unreal › date=’ 23 Mar 2005, 19:07’]Normalement c’est impossible d’avoir des memory leak avec apache sous unix. Il marche par folk, donc les processus sont detruits tres frequemment.
[right][post=« 343669 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Oui oui, That’s all foLks, je vais etre trop cool et considerer que c’est une faute de frappe. BOUARF!

LoneWolf
Putain unreal, comment t’as deconne la :stuck_out_tongue:

Je vois pas ce qui fun. Mais on s’amuse comme on peut. C’est encore un resultat sans interet que le logiciel renvoit (la preuve, tu en tires une conlusion fausse avec, cf → plus loin dans ce post).

Je me base sur le fait qu’en meme temps que le test, j’avais son site dans mon browser, et le site ne repondait pas (je pensais meme que le serveur etait plante a un moment). 50 requetes par seconde ne suffisent pas pour faire une attaque DOS pour saturer sa bande passante au point ou le serveur ne peut plus repondre, par manque de bande passante. Si ca repondait pas, c’est parce que le load de son serveur etait bien trop important.

La ligne qui compte c’est ca : msecs/first-response: msecs/connect: 8523.26 mean, 54825.7 max, 28.945 min. C’est cette ligne qui permet d’estimer le temps de generation des pages cote serveur. Je veux bien croire que t’as une obsession pour le nombre de requetes effectuees et que t’as ete super content de trouver que ca fait n-1 par rapport a ce qu’on attend, mais comment ca fait avancer le schmilblik ?

Finalement, tu nous fais 10 pages de bla bla bla pour dire que le nombre de pages reellement genere est inferieur aux 50 en parametre. Bien joue. Fort fort. Surtout que c’est indique dans les resultats :

Perdu. Tous les tests effectues sur mes serveurs ont ete effectues en local sur des pages petites et j’ai tjs eu des bad bytes count. As-tu pense que ca pouvait etre simplement du a des pages dynamiques qui generent jamais la meme page exactement ?

Merci Lone, t’es le plus fort. A ton avis, pour quoi j’ai demande si la page de good_boy etait reellement du dynamique ?

Ca doit etre tres chiant d’avoir tjs raison, non ?