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