VPS de 1 GB - Apache Worker MPM - FCGID - Máx. Conexiones simultáneas - RAM CAP

9

Pasé una o dos semanas investigando y configurando mi servidor para ejecutar Apache con Worker MPM y FCID. Estoy tratando de optimizarlo para permitir las conexiones más concurrentes posibles. Ha sido una pesadilla encontrar buena información sobre el Worker MPM.

Servidor: VPS con 1 GB de RAM (con Apache apagado, solo usa unos 150 MB de RAM) Me gustaría que Apache tuviera un CAP de uso de memoria de aproximadamente 750 MB, para que mi servidor nunca se quede sin RAM.

He estado ejecutando el servidor durante aproximadamente 2 años sin ningún problema, pero recientemente hemos comenzado a transmitir MP3 y esto requiere más conexiones concurrentes. El servidor también ha tenido algunos ataques DDOS menores, por lo que reduje la configuración una tonelada para evitar que el servidor se quede sin memoria, también agregué algunas reglas de firewall para limitar la velocidad.

La configuración que tengo ahora parece que funciona bien, pero recibo algunos errores de falla de segmentación

[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 ***

Y algunos errores de falta de memoria

Out of memory during array extend.

Esta es mi configuración actual, realmente agradecería algunos consejos.

Configuración de 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>
#####################

Y luego algunas configuraciones en fcgid.conf

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

Según lo solicitado mi salida para /etc/my.cnf

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

# skip-innodb

connect_timeout = 10
max_ connections = 300
enlaces simbólicos = 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]
error de registro = / var / log / mysqld.log
pid-file = / var / run / mysqld / mysqld.pid

Y PHP memory_limit = 64M

usuario1287874
fuente
¿Alguna idea de alguien?
user1287874
1
entonces, de los 1 GB que tiene, si Apache toma 750 MB, ¿cómo imagina que se distribuirán otros 250? Esto es realmente importante ... Lo pregunto porque 750 es una expectativa poco realista y poco saludable. De este 1 GB de manera realista si desea un sistema con buen rendimiento ~ 200 - 250 MB es probablemente el valor máximo
Hrvoje Špoljar

Respuestas:

0

Estas configuraciones tienen que ver con el equilibrio, qué tan alto puede obtenerlas sin correr el riesgo de quedarse sin memoria y bloquear el servidor, o que sus procesos sean eliminados por el padre vps, lo que es posible por eso está obteniendo SegFaults.

Por lo general, cuando estoy optimizando un servidor, ejecutaré el script mysql tuning-primer.sh para tener una idea de cuánta memoria puede usar MySQL al máximo:

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

Luego, para prefork, multiplicaría MaxClients por php memory_limit para tener una idea de cuánta memoria puede usar Apache + PHP al máximo. Estas son estimaciones aproximadas, pero una vez que lo ha hecho mucho, puede sentirlo.

Intento mantener el total de esos 2 alrededor de la memoria máxima del servidor, si su VPS no tiene una partición de intercambio, definitivamente trataría de mantenerlo más bajo que el máximo ram por un par de razones:

1) Los otros procesos en el servidor usarán memoria

2) Algunos scripts php en el servidor pueden estar usando ini_set para cambiar el límite de memoria por sí mismos.

Si puede proporcionar /etc/my.cnf y php memory_limit, puedo encontrar algunas buenas configuraciones para usted.


editar: solo quería mencionar que sé que está utilizando trabajador y no prefork, se aplican los mismos conceptos, pero trabajador tiene que lidiar con subprocesos y no solo con MaxClients, por lo que prefork fue un mejor ejemplo. Tendría que buscar en la configuración después de obtener la información solicitada para darle buenos consejos

Michael Wineland
fuente
Hola Michael, desde entonces actualicé mi configuración (después de recibir algunos consejos de la gente), desde entonces bajé Serverlimit a 8 Maxclients a 200 y FCGID a 10, lo vigilaré y veré cómo funciona. Publicaré los resultados en la publicación original pronto
user1287874
¿Que tan pronto? ¿abril?
Eddie