Bonjour,
J'utilise Apache2(MPM Worker)/PHP5 en mode CGI sur des VPS n'ayant pas beaucoup de mémoire (1G) avec 20G de disque.
Le VPS est installé sous Debian avec FTP/SSH/Apache2/PHP, pas de MySQL...
Je voudrais optimiser la machine, pour cela je commence par configurer : Timeout : 120 MaxClients : RAM Server disponible / Taille Processus Apache
Par contre je ne sais pas comment calculer les variables suivantes : ServerLimit ThreadsPerChild MinSpareThreads MaxSpareThreads MaxRequestsPerChild
Ensuite je me demande si en recyclant les sockets TIME WAIT cela ne serais pas plus mal : sysctl -w net.ipv4.tcp_tw_recycle=1 sysctl -w net.ipv4.tcp_tw_reuse=1
Quelles sont vos astuces pour "tuner" Apache ? Bonne journée.
Bonjour,
Le 26 déc. 2013 à 10:38, Sébastien 65 a écrit :
Bonjour,
J'utilise Apache2(MPM Worker)/PHP5 en mode CGI sur des VPS n'ayant pas beaucoup de mémoire (1G) avec 20G de disque.
Le VPS est installé sous Debian avec FTP/SSH/Apache2/PHP, pas de MySQL...
Je voudrais optimiser la machine, pour cela je commence par configurer : Timeout : 120 MaxClients : RAM Server disponible / Taille Processus Apache
Par contre je ne sais pas comment calculer les variables suivantes : ServerLimit ThreadsPerChild MinSpareThreads MaxSpareThreads MaxRequestsPerChild
Ensuite je me demande si en recyclant les sockets TIME WAIT cela ne serais pas plus mal : sysctl -w net.ipv4.tcp_tw_recycle=1 sysctl -w net.ipv4.tcp_tw_reuse=1
Quelles sont vos astuces pour "tuner" Apache ? Bonne journée.
La première optimisation à faire est remplacer PHP5 CGI par PHP-FPM. Ensuite, s'il n'y a que du php et rien de très exotique, remplacer apache par nginx...
Cordialement Emmanuel Thierry
Salut,
N'utilises pas tw_recycle. Ça ajoute plus de problème que ça n'en règle :)
+1 pour fpm et nginx si tu veux optimiser ton utilisation mémoire.
Utiliser une version récente de PHP permet aussi de réduire ta conso mémoire.
N'oublis pas de laisser de la RAM pour ton système (buffer/cache).
A+ Le 26 déc. 2013 10:41, "Emmanuel Thierry" ml@sekil.fr a écrit :
Bonjour,
Le 26 déc. 2013 à 10:38, Sébastien 65 a écrit :
Bonjour,
J'utilise Apache2(MPM Worker)/PHP5 en mode CGI sur des VPS n'ayant pas
beaucoup de mémoire (1G) avec 20G de disque.
Le VPS est installé sous Debian avec FTP/SSH/Apache2/PHP, pas de MySQL...
Je voudrais optimiser la machine, pour cela je commence par configurer : Timeout : 120 MaxClients : RAM Server disponible / Taille Processus Apache
Par contre je ne sais pas comment calculer les variables suivantes : ServerLimit ThreadsPerChild MinSpareThreads MaxSpareThreads MaxRequestsPerChild
Ensuite je me demande si en recyclant les sockets TIME WAIT cela ne
serais pas plus mal :
sysctl -w net.ipv4.tcp_tw_recycle=1 sysctl -w net.ipv4.tcp_tw_reuse=1
Quelles sont vos astuces pour "tuner" Apache ? Bonne journée.
La première optimisation à faire est remplacer PHP5 CGI par PHP-FPM. Ensuite, s'il n'y a que du php et rien de très exotique, remplacer apache par nginx...
Cordialement Emmanuel Thierry
Liste de diffusion du FRsAG http://www.frsag.org/
Salut,
Ok merci pour tw_recycle ! Je ne vais donc pas y toucher...
Si vous avez des tuyaux concernant le calcul des variables d'apache je prends :)
Merci.
Bonjour,
pour compléter ta demande : ServerLimit = MaxClients MinSpareThreads = dépend de la charge de ton site, $nbCPU si peu de client, ou plus si beaucoup de clients. C'est pour que ton serveur apache encaisse la charge en cas de restart MaxSpareThreads = MinSpareThreads MaxRequestsPerChild = ça dépend des fuites mémoire. 0 si pas de fuite, ou pas de cache genre le cache fichier de PHP. Avec PHP-FPM je choisirais 0 pour l'infini, de toute façon il redémarrera 1x / jour avec le logrotate daily.
Mais comme les autres, je conseillerais NGiNX + PHP-FPM ;)
Greg
Le 26 décembre 2013 14:36, Sébastien 65 sebastien-65@live.fr a écrit :
Salut,
Ok merci pour tw_recycle ! Je ne vais donc pas y toucher...
Si vous avez des tuyaux concernant le calcul des variables d'apache je prends :)
Merci.
Liste de diffusion du FRsAG http://www.frsag.org/
Le 27 décembre 2013 13:40, Greg greg-frsag@duchatelet.net a écrit :
MaxRequestsPerChild = ça dépend des fuites mémoire. 0 si pas de fuite, ou pas de cache genre le cache fichier de PHP. Avec PHP-FPM je choisirais 0 pour l'infini, de toute façon il redémarrera 1x / jour avec le logrotate daily.
Et ne pas oublier de fermer les connexions correctement. J'ai déjà souvent vu des problèmes avec le modules memcache de php ou les connexions sont pas fermées après l'affichage d'une page si c'est pas fait a la main dans le code.
Idem avec mysql, pg, etc, etc... Du moment que t'a une ressource externe il faut faire attention. Je pense qu'un restart toutes les 1000 requêtes (par exemple) ça ne peut faire que du bien.
Et enfin comme tout le monde, je pense que si t'a pas de .htaccess ou de conf un peu tordue, nginx+fpm c'est cool et tu y passe très souvent sans effort. Et dans le cas ou tu as quand même des conf spécifiques, nginx sait faire tout ce que sait faire apache et même plus : je pense au if qui n'était pas disponible avant apache 2.4 par exemple (et oui "if is NOT evil" dans certains cas)
Euh 1000 requêtes par process c'est beaucoup trop bas, ça doit représenter environ 750ms de vie de mes process nginx ... Par contre je suis d'accord avec la fermeture des connexions, pour celà il faut désactiver les connexions persistentes, et dans MySQL y'a la variable de config wait_timeout qui permet de fermer les connexions coté serveur.
Le 27 décembre 2013 13:58, Nathan delhaye contact@nathan-delhaye.fr a écrit :
Le 27 décembre 2013 13:40, Greg greg-frsag@duchatelet.net a écrit :
MaxRequestsPerChild = ça dépend des fuites mémoire. 0 si pas de fuite, ou
pas de cache genre le cache fichier de PHP. Avec PHP-FPM je choisirais 0 pour l'infini, de toute façon il redémarrera 1x / jour avec le logrotate daily.
Et ne pas oublier de fermer les connexions correctement. J'ai déjà souvent vu des problèmes avec le modules memcache de php ou les connexions sont pas fermées après l'affichage d'une page si c'est pas fait a la main dans le code.
Idem avec mysql, pg, etc, etc... Du moment que t'a une ressource externe il faut faire attention. Je pense qu'un restart toutes les 1000 requêtes (par exemple) ça ne peut faire que du bien.
Et enfin comme tout le monde, je pense que si t'a pas de .htaccess ou de conf un peu tordue, nginx+fpm c'est cool et tu y passe très souvent sans effort. Et dans le cas ou tu as quand même des conf spécifiques, nginx sait faire tout ce que sait faire apache et même plus : je pense au if qui n'était pas disponible avant apache 2.4 par exemple (et oui "if is NOT evil" dans certains cas)
-- Nathan Delhaye
Bonjour,
Pour le moment je n'ai pas encore le temps de me pencher sur NGINX, donc je reste sur du Apache/FCGI, par contre je ne suis pas contre de faire un test un de ces quatre...
En gros voici mon fcgid-starter : #!/bin/sh export PHPRC=/var/www/test.local/php5/php.ini export PHP_FCGI_CHILDREN=0 export PHP_FCGI_MAX_REQUESTS=1500 # ??? export PHP_FCGI_MAX_REQUESTS=5000 => /!\ FcgidMaxRequestsPerProcess exec /usr/bin/php5/php-cgi
Conf apache test.local : <IfModule mod_fcgid.c> SocketPath /var/lib/apache2/fcgid/socket FcgidMaxRequestsPerProcess 1000 FcgidBusyTimeout 300 FcgidIOTimeout 300 FcgidMaxProcesses 200 FcgidMaxProcessesPerClass 20 FcgidMinProcessesPerClass 0 FcgidMaxRequestLen 15728640 </IfModule>
Quand vous parlez de "Et ne pas oublier de fermer les connexions correctement" c'est-à-dire ??
Date: Fri, 27 Dec 2013 14:29:17 +0100 From: greg-frsag@duchatelet.net To: frsag@frsag.org Subject: Re: [FRsAG] Optimisation Apache2
Euh 1000 requêtes par process c'est beaucoup trop bas, ça doit représenter environ 750ms de vie de mes process nginx ... Par contre je suis d'accord avec la fermeture des connexions, pour celà il faut désactiver les connexions persistentes, et dans MySQL y'a la variable de config wait_timeout qui permet de fermer les connexions coté serveur.
Le 27 décembre 2013 13:58, Nathan delhaye contact@nathan-delhaye.fr a écrit :
Le 27 décembre 2013 13:40, Greg greg-frsag@duchatelet.net a écrit :
MaxRequestsPerChild = ça dépend des fuites mémoire. 0 si pas de fuite, ou pas de cache genre le cache fichier de PHP. Avec PHP-FPM je choisirais 0 pour l'infini, de toute façon il redémarrera 1x / jour avec le logrotate daily.
Et ne pas oublier de fermer les connexions correctement. J'ai déjà souvent vu des problèmes avec le modules memcache de php ou les connexions sont pas fermées après l'affichage d'une page si c'est pas fait a la main dans le code.
Idem avec mysql, pg, etc, etc... Du moment que t'a une ressource externe il faut faire attention. Je pense qu'un restart toutes les 1000 requêtes (par exemple) ça ne peut faire que du bien.
Et enfin comme tout le monde, je pense que si t'a pas de .htaccess ou de conf un peu tordue, nginx+fpm c'est cool et tu y passe très souvent sans effort. Et dans le cas ou tu as quand même des conf spécifiques, nginx sait faire tout ce que sait faire apache et même plus : je pense au if qui n'était pas disponible avant apache 2.4 par exemple (et oui "if is NOT evil" dans certains cas)
On sort du cadre d'Apache mais personne n'a abordé Varnish...
Le 27 déc. 2013 16:59, "Manuel OZAN" manuelozan@gmail.com a écrit :
On sort du cadre d'Apache mais personne n'a abordé Varnish...
Sauf que varnish c'est un serveur de cache. Son boulot c'est de faire reverse proxy devant un Apache/nginx/lighttpd/International Internet Sacrilege et non pas de traiter du http pour l'envoyer a fpm.
Oui certes on peut le faire dans la mesure ou on peut mettre du c dans les vcl, mais c'est pas conçu pour du tout.
Concernant les 1000 requêtes, c'était un exemple. C'est clair que chez certains clients il est a 1M. Mais si ton bottleneck c'est le cpu a cause de ton appli qui mange un bi-xeon pour 3req/s et qui leak dans tous les sens, c'est pas completement débile. Le tout est d'adapter au mieu a la situation spécifique de chaque serveur et chaque applicatif.
Tu as des MaxClient a 1M ?
Demain faut qu'on parle :) Le 27 déc. 2013 17:43, "Nathan delhaye" contact@nathan-delhaye.fr a écrit :
Le 27 déc. 2013 16:59, "Manuel OZAN" manuelozan@gmail.com a écrit :
On sort du cadre d'Apache mais personne n'a abordé Varnish...
Sauf que varnish c'est un serveur de cache. Son boulot c'est de faire reverse proxy devant un Apache/nginx/lighttpd/International Internet Sacrilege et non pas de traiter du http pour l'envoyer a fpm.
Oui certes on peut le faire dans la mesure ou on peut mettre du c dans les vcl, mais c'est pas conçu pour du tout.
Concernant les 1000 requêtes, c'était un exemple. C'est clair que chez certains clients il est a 1M. Mais si ton bottleneck c'est le cpu a cause de ton appli qui mange un bi-xeon pour 3req/s et qui leak dans tous les sens, c'est pas completement débile. Le tout est d'adapter au mieu a la situation spécifique de chaque serveur et chaque applicatif.
Liste de diffusion du FRsAG http://www.frsag.org/
non, pas MaxClients, MaxRequestsPerChild à 1M ;)
Le 30 décembre 2013 02:05, DjinnS DjinnS snnijd@gmail.com a écrit :
Tu as des MaxClient a 1M ?
Demain faut qu'on parle :) Le 27 déc. 2013 17:43, "Nathan delhaye" contact@nathan-delhaye.fr a écrit :
Le 27 déc. 2013 16:59, "Manuel OZAN" manuelozan@gmail.com a écrit :
On sort du cadre d'Apache mais personne n'a abordé Varnish...
Sauf que varnish c'est un serveur de cache. Son boulot c'est de faire reverse proxy devant un Apache/nginx/lighttpd/International Internet Sacrilege et non pas de traiter du http pour l'envoyer a fpm.
Oui certes on peut le faire dans la mesure ou on peut mettre du c dans les vcl, mais c'est pas conçu pour du tout.
Concernant les 1000 requêtes, c'était un exemple. C'est clair que chez certains clients il est a 1M. Mais si ton bottleneck c'est le cpu a cause de ton appli qui mange un bi-xeon pour 3req/s et qui leak dans tous les sens, c'est pas completement débile. Le tout est d'adapter au mieu a la situation spécifique de chaque serveur et chaque applicatif.
Liste de diffusion du FRsAG http://www.frsag.org/
Liste de diffusion du FRsAG http://www.frsag.org/
Je viens de monter avec mon collègue une infra lighttpd. Peu de consommation mémoire et un load maitrisé. Php5-cgi et APC c'est pas très compatible mais remplacé par memcache, ca donne une plateforme légère et robuste si on fait des choses simples.
Une idée parmi tant d'autres...
On 26/12/13 11:16, DjinnS DjinnS wrote:
Salut,
N'utilises pas tw_recycle. Ça ajoute plus de problème que ça n'en règle :)
+1 pour fpm et nginx si tu veux optimiser ton utilisation mémoire.
Utiliser une version récente de PHP permet aussi de réduire ta conso mémoire.
N'oublis pas de laisser de la RAM pour ton système (buffer/cache).
A+
Le 26 déc. 2013 10:41, "Emmanuel Thierry" <ml@sekil.fr mailto:ml@sekil.fr> a écrit :
Bonjour, Le 26 déc. 2013 à 10:38, Sébastien 65 a écrit : > Bonjour, > > J'utilise Apache2(MPM Worker)/PHP5 en mode CGI sur des VPS n'ayant pas beaucoup de mémoire (1G) avec 20G de disque. > > Le VPS est installé sous Debian avec FTP/SSH/Apache2/PHP, pas de MySQL... > > Je voudrais optimiser la machine, pour cela je commence par configurer : > Timeout : 120 > MaxClients : RAM Server disponible / Taille Processus Apache > > Par contre je ne sais pas comment calculer les variables suivantes : > ServerLimit > ThreadsPerChild > MinSpareThreads > MaxSpareThreads > MaxRequestsPerChild > > Ensuite je me demande si en recyclant les sockets TIME WAIT cela ne serais pas plus mal : > sysctl -w net.ipv4.tcp_tw_recycle=1 > sysctl -w net.ipv4.tcp_tw_reuse=1 > > Quelles sont vos astuces pour "tuner" Apache ? > Bonne journée. > La première optimisation à faire est remplacer PHP5 CGI par PHP-FPM. Ensuite, s'il n'y a que du php et rien de très exotique, remplacer apache par nginx... Cordialement Emmanuel Thierry _______________________________________________ Liste de diffusion du FRsAG http://www.frsag.org/
Liste de diffusion du FRsAG http://www.frsag.org/
Le Thu, Dec 26, 2013 at 10:38:08AM +0100, Sébastien 65 [sebastien-65@live.fr] a écrit:
Bonjour,
J'utilise Apache2(MPM Worker)/PHP5 en mode CGI sur des VPS n'ayant pas beaucoup de mémoire (1G) avec 20G de disque.
Le VPS est installé sous Debian avec FTP/SSH/Apache2/PHP, pas de MySQL...
Je voudrais optimiser la machine, pour cela je commence par configurer : Timeout : 120 MaxClients : RAM Server disponible / Taille Processus Apache
Par contre je ne sais pas comment calculer les variables suivantes : ServerLimit ThreadsPerChild MinSpareThreads MaxSpareThreads MaxRequestsPerChild
Les MinSpareThreads et MaxSpareThreads tu t'en fous, avec du PHP, tu vas être en prefork, pas en worker. (ou en tout cas, tu ferais mieux de...)
Pour MaxRequestsPerChild, PHP étant une énorme fuite mémoire en soi, je le mets toujours plutot bas. Entre 100 et 1000. Parfois un peu plus, si le site reçoit beaucoup de hits, et que ça génère trop de nouveaux processus. Parfois un peu plus bas, si le code est tout pourri et que le serveur reçoit assez peu de trafic [par exemple, avec un reverse-proxy-cache efficace devant]. Le mieux c'est de regarder l'évolution de la mémoire occupée (munin, zabbix, whatever)
Parmis les paramètres que tu peux ajuster, aussi, y'a les paramètres KeepAlive. Abaisser au moins le timeout.