9 votes

1 Go VPS - Apache Worker MPM - FCGID - Connexions simultanées maximales - Limite de RAM

J'ai passé une semaine ou deux à rechercher et à configurer mon serveur pour exécuter Apache avec le MPM Worker et FCID. J'essaie de l'optimiser pour permettre le plus de connexions concurrentes possible. Il a été un cauchemar de trouver des informations fiables sur le MPM Worker.

Serveur - VPS avec 1 Go de RAM (avec Apache éteint, il utilise seulement environ 150 Mo de RAM) Je voudrais qu'Apache ait une limite d'utilisation de la mémoire d'environ 750 Mo - afin que mon serveur ne manque jamais de RAM.

J'ai fait fonctionner le serveur pendant environ 2 ans sans aucun problème - mais nous avons récemment commencé à diffuser des MP3 et cela nécessite plus de connexions concurrentes. Le serveur a également subi quelques attaques DDOS mineures - donc j'ai réduit considérablement les paramètres pour éviter que le serveur ne manque de mémoire - j'ai également ajouté quelques règles de pare-feu pour limiter le débit.

La configuration que j'ai actuellement semble fonctionner bien - mais je rencontre quelques erreurs de segmentation.

[Sam 23 mar 2013 03:19:50] [notice] child pid 28351 signal de sortie Segmentation fault (11)
[Sam 23 mar 2013 03:56:20] [notice] child pid 29740 signal de sortie Segmentation fault (11)
*** glibc détecté *** /usr/sbin/httpd.worker: malloc(): corruption de mémoire: 0xb83abdd8 ***

Et quelques erreurs de mémoire insuffisante

Mémoire insuffisante lors de l'extension du tableau.

Voici ma configuration actuelle, j'apprécierais vraiment des conseils.

Paramètres Apache :

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
#####################
# Lancer 2 processus enfants, en lançant 25 threads pour chaque processus enfant
# Ainsi, un pool de 50 threads reste actif et en attente, prêt à servir les requêtes entrantes
# Si plus de requêtes arrivent, Apache lancera de nouveaux processus enfants, chacun lançant 25 threads
# en agrandissant le pool de threads jusqu'à ce que le nombre total de threads atteigne 50. Dans ce cas, Apache commencera
# à supprimer proprement les processus pour atteindre 25 threads
# De nouveaux processus et ses threads sont lancés en cas d'un gros pic de requêtes, jusqu'à ce que 200 connexions client
# en parallèle soient atteintes, puis Apache n'acceptera plus de nouvelles connexions.
# Lorsque la charge diminue et que les requêtes reviennent sous 200 connexions parallèles, Apache continuera
# à accepter les connexions. Après 25 000 requêtes servies par un enfant, env. 1000 par thread, le processus
# sera fermé par le père pour éviter toute fuite de mémoire

ServerLimit 16
StartServers 2
MaxClients 400
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 25
MaxRequestsPerChild 1000
ThreadLimit 64
ThreadStackSize 1048576

#####################

Puis quelques paramètres dans fcgid.conf

FcgidMinProcessesPerClass 0
FcgidMaxProcessesPerClass 8
FcgidMaxProcesses 25
FcgidIdleTimeout 60
FcgidProcessLifeTime 120
FcgidIdleScanInterval 30

Comme demandé, ma sortie pour /etc/my.cnf

\[mysqld\]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

#skip-innodb

connect\_timeout = 10
max\_connections = 300
symbolic-links=0
innodb\_file\_per\_table = 1
myisam\_sort\_buffer\_size = 8M
read\_rnd\_buffer\_size = 512K
net\_buffer\_length = 8K
read\_buffer\_size = 256K
sort\_buffer\_size = 512K
table\_cache = 32
max\_allowed\_packet = 1M
key\_buffer = 16k
query\_cache\_type = 1
query-cache-size = 32M
thread\_cache\_size = 16
net\_buffer\_length = 2K
thread\_stack = 256K
wait\_timeout = 300

slow\_query\_log

#log-slow-queries=/var/log/mysql/slow-queries.log
slow\_query\_log=/var/log/mysql/slow-queries.log
long\_query\_time = 1

\[mysqld\_safe\]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Et PHP memory_limit = 64M

0voto

Ces paramètres sont tous liés à l'équilibre, à la limite jusqu'à laquelle vous pouvez les augmenter sans risquer de manquer de mémoire et de faire planter le serveur, ou de voir vos processus tués par le parent de la vps, ce qui pourrait expliquer pourquoi vous obtenez des SegFaults.

En général, lorsque j'optimise un serveur, j'exécute le script mysql tuning-primer.sh pour avoir une idée de la quantité de mémoire que MySQL peut utiliser au maximum :

https://launchpad.net/mysql-tuning-primer

Ensuite, pour prefork, je multiplierais MaxClients par la limite mémoire php pour avoir une idée de la quantité de mémoire qu'Apache+PHP peuvent utiliser au maximum. Ce ne sont que des estimations approximatives, mais une fois que vous avez fait cela plusieurs fois, vous commencez à vous y habituer.

J'essaie de maintenir la somme de ces deux paramètres juste en dessous de la mémoire maximale du serveur. Si votre VPS n'a pas de partition swap, je vous conseillerais vraiment de la maintenir en dessous de la RAM maximale pour quelques raisons :

1) Les autres processus sur le serveur utiliseront de la mémoire

2) Certains scripts php sur le serveur peuvent utiliser ini_set pour changer la memory_limit pour eux-mêmes.

Si vous pouvez me fournir le fichier /etc/my.cnf et la memory_limit php, je pourrais vous proposer de bons paramètres.


edit : Je voulais juste préciser que je sais que vous utilisez worker et non prefork, les mêmes concepts s'appliquent mais worker doit gérer les threads et non seulement MaxClients, donc prefork était un meilleur exemple. Je devrais regarder les paramètres après avoir obtenu les informations demandées pour vous donner de bons conseils.

0voto

jmueck Points 1

Vous pouvez essayer le script apache2buddy.pl pour régler les paramètres d'apache pour votre application web et votre système.

Une autre solution pour oublier le problème est de créer un cluster docker swarm à un seul nœud et de conteneriser votre application - docker tuera le conteneur apache en cas de manque de mémoire et le redémarrera...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X