1 Go VPS - Apache Worker MPM - FCGID - Max connexions simultanées - RAM CAP

9

J'ai passé une semaine ou deux à rechercher et configurer mon serveur pour exécuter Apache avec Worker MPM et FCID. J'essaie de l'optimiser pour permettre les connexions les plus simultanées possibles. Ce fut un cauchemar de trouver de bonnes informations sur le MPM des travailleurs.

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

J'utilise le serveur depuis environ 2 ans sans aucun problème - mais nous avons récemment commencé à diffuser des MP3 et cela nécessite plus de connexions simultanées. Le serveur a également eu quelques attaques DDOS mineures - j'ai donc réduit les paramètres d'une tonne pour éviter que le serveur ne manque de mémoire - J'ai également ajouté quelques règles de pare-feu pour limiter la vitesse.

La configuration que j'ai maintenant semble bien fonctionner - mais je reçois des erreurs de segmentation

[Sat Mar 23 03:19:50 2013] [notice] child pid 28351 exit signal Segmentation fault (11)
[Sat Mar 23 03:56:20 2013] [notice] child pid 29740 exit signal Segmentation fault (11)
*** glibc detected *** /usr/sbin/httpd.worker: malloc(): memory corruption: 0xb83abdd8 ***

Et quelques erreurs de mémoire insuffisante

Out of memory during array extend.

C'est ma configuration actuelle, j'apprécierais vraiment quelques conseils.

Paramètres Apache:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
#####################
# Spawn 2 child processes, spawning 25 threads for each child process.
# So, a pool of 50 threads is left up and sleeping, ready to serve incoming requests.
# If more requests will come in, apache will spawn new child processes, each one spawning 25 threads,
# enlarging the thread pool until the total number of threads become 50. In that case, apache begin
# to cleanly drop processes, trying to reach 25 threads.
# New processes and its threads are spawned in case of a large spike of requests, until 200 parallel
# client requests are reached, then apache will no longer accept new incoming connections.
# When the load calm down, and requests come back under 200 parallel connections, apache will continue
# to accept connections. After 25, 000 requests served by a child, q. 1000 per thread, the process
# get closed by the father to ensure no memory leak is fired.
<IfModule worker.c>
ServerLimit      16
StartServers         2
MaxClients       400
MinSpareThreads   25
MaxSpareThreads  50 
ThreadsPerChild    25
MaxRequestsPerChild  1000
ThreadLimit          64 
ThreadStackSize      1048576
</IfModule>
#####################

Et puis certains 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
liens symboliques = 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
requête-cache-taille = 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

user1287874
la source
Des idées n'importe qui?
user1287874
1
Ainsi, sur les 1 Go dont vous disposez, si Apache prend 750 Mo, comment envisagez-vous que 250 autres soient distribués? C'est vraiment important ... Je demande parce que 750 est une attente très irréaliste et malsaine. De ce 1 Go de façon réaliste si vous voulez un système performant, ~
200-250

Réponses:

0

Ces paramètres concernent l'équilibre, la hauteur à laquelle vous pouvez les obtenir sans risquer de manquer de mémoire et de planter le serveur, ou de faire tuer vos processus par le parent vps, ce qui est possible, c'est pourquoi vous obtenez SegFaults.

Habituellement, 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 maximale que MySQL peut utiliser:

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

Ensuite, pour le préfork, je multiplierais MaxClients par le php memory_limit pour avoir une idée de la quantité de mémoire qu'Apache + PHP peut utiliser au maximum. Ce sont des estimations approximatives, mais une fois que vous avez fait beaucoup de choses, vous vous en rendez compte.

J'essaie de garder le total de ces 2 autour de la mémoire maximale du serveur, si votre VPS n'a pas de partition de swap, j'essaierais certainement de le garder plus bas que le ram max pour quelques raisons:

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

2) Certains scripts php sur le serveur peuvent utiliser ini_set pour modifier eux-mêmes la limite de mémoire.

Si vous pouvez fournir /etc/my.cnf et php memory_limit, je pourrai peut-être trouver de bons paramètres pour vous.


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

Michael Wineland
la source
Bonjour Michael, j'ai depuis mis à jour mes paramètres (après avoir reçu des conseils de personnes), j'ai depuis baissé Serverlimit à 8 Maxclients à 200 et FCGID à 10 - je garderai un œil dessus et je verrai comment ça se passe. Je publierai bientôt les sorties dans le message d'origine
user1287874
comment ça va? avril?
Eddie