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