performance - the - el servidor apache alcanzó la configuración de MaxClients, considere aumentar la configuración de MaxClients
server reached maxclients setting, consider raising the maxclients setting (4)
Estoy ejecutando centos 5.5 con 768 mb ram. sigo haciendo que el server reached MaxClients setting, consider raising the MaxClients setting
en los registros y apache se ejecuta realmente lento. cuando miro los gráficos de cactus, muestra que el servidor ni siquiera está usando todos los recursos ... aquí está la configuración actual
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 10
ServerLimit 1024
MaxClients 768
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
free -m
total used free shared buffers cached
Mem: 768 352 415 0 0 37
-/+ buffers/cache: 315 452
Swap: 0 0 0
top - 11:03:54 up 41 days, 11:53, 1 user, load average: 0.05, 0.03, 0.00
Tasks: 35 total, 1 running, 34 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.3%st
Mem: 786432k total, 389744k used, 396688k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 38284k cached
He intentado lo siguiente, pero el servidor responde muy lentamente
<IfModule worker.c>
#StartServers 2
#MaxClients 150
#MinSpareThreads 25
#MaxSpareThreads 75
#ThreadsPerChild 25
#MaxRequestsPerChild 0
StartServers 20
MaxClients 1024
ServerLimit 1024
MinSpareThreads 128
MaxSpareThreads 768
ThreadsPerChild 64
MaxRequestsPerChild 0
</IfModule>
free -m
total used free shared buffers cached
Mem: 768 324 443 0 0 37
-/+ buffers/cache: 286 481
Swap: 0 0 0
@regilero
He actualizado a
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 50
MaxRequestsPerChild 300
</IfModule>
usando la parte superior veo
Tasks: 36 total, 1 running, 35 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 786432k total, 613180k used, 173252k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 76488k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 10364 92 60 S 0.0 0.0 1:09.53 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/808
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper/808
124 root 16 -4 12620 8 4 S 0.0 0.0 0:00.00 udevd
533 root 20 0 95504 5692 228 S 0.0 0.7 4:02.94 memcached
546 root 20 0 5924 332 276 S 0.0 0.0 6:54.51 syslogd
557 root 20 0 101m 1456 868 S 0.0 0.2 13:18.64 snmpd
570 root 20 0 62640 316 208 S 0.0 0.0 2:39.56 sshd
579 root 20 0 21656 24 20 S 0.0 0.0 0:00.00 xinetd
589 root 20 0 12072 12 8 S 0.0 0.0 0:00.05 mysqld_safe
940 mysql 20 0 559m 164m 3832 S 0.3 21.5 209:33.88 mysqld
1015 root 20 0 20880 200 132 S 0.0 0.0 0:10.48 crond
1023 root 20 0 46748 4 0 S 0.0 0.0 0:00.00 saslauthd
1024 root 20 0 46748 4 0 S 0.0 0.0 0:00.00 saslauthd
3605 root 20 0 62832 2168 636 S 0.0 0.3 0:02.58 sendmail
3613 smmsp 20 0 57712 1648 504 S 0.0 0.2 0:00.01 sendmail
17610 root 20 0 85932 3312 2600 S 0.0 0.4 0:00.02 sshd
17612 mcmap 20 0 86072 1760 1012 S 0.0 0.2 0:00.17 sshd
17613 mcmap 20 0 12076 1656 1292 S 0.0 0.2 0:00.01 bash
17637 root 20 0 45052 1432 1120 S 0.0 0.2 0:00.00 su
17638 root 20 0 12180 1800 1324 S 0.0 0.2 0:00.08 bash
17740 root 20 0 246m 9264 4516 S 0.0 1.2 0:00.19 httpd
18264 apache 20 0 282m 43m 4940 S 0.0 5.7 0:00.56 httpd
18514 apache 20 0 279m 40m 4832 S 0.0 5.3 0:01.47 httpd
18518 apache 20 0 273m 36m 4396 S 0.0 4.7 0:00.45 httpd
18528 apache 20 0 251m 13m 3660 S 0.0 1.8 0:00.41 httpd
18529 apache 20 0 278m 40m 4340 S 0.0 5.3 0:00.99 httpd
18530 apache 20 0 278m 40m 4268 S 0.0 5.3 0:00.67 httpd
18548 apache 20 0 272m 33m 3516 S 0.0 4.4 0:00.28 httpd
18552 apache 20 0 280m 42m 3684 S 0.0 5.5 0:00.48 httpd
18553 apache 20 0 271m 33m 3768 S 0.0 4.3 0:00.45 httpd
18555 apache 20 0 274m 36m 3672 S 0.0 4.7 0:00.58 httpd
18572 apache 20 0 247m 9020 2856 S 0.0 1.1 0:00.01 httpd
18578 apache 20 0 280m 42m 3684 S 0.0 5.6 0:00.76 httpd
18589 apache 20 0 246m 5452 676 S 0.0 0.7 0:00.00 httpd
18588 root 20 0 12624 1216 932 R 0.0 0.2 0:00.06
free -m
total used free shared buffers cached
Mem: 768 578 189 0 0 74
-/+ buffers/cache: 504 263
Swap: 0 0 0
Acabo de agregar la imagen actual del resultado de cactus últimas 4 horas. los períodos ocupados son lunes martes. Así que esperaré hasta la próxima semana para ver más resultados del cambio de configuración. pero parece una mejora ya que antes solo tenía un máximo de 10 hilos disponibles. Al ver esto, ¿crees que puedo hacer más mejoras?
free -m
total used free shared buffers cached
Mem: 768 619 148 0 0 49
-/+ buffers/cache: 570 197
Swap: 0 0 0
NUEVA PRUEBA
En una caja Ram VPS de 2GB ahora he configurado prefork para
StartServers 20
MinSpareServers 20
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
Hoy por la mañana mi servidor memcache murió de
Nov 20 09:28:40 vps22899094 kernel: Out of memory: Kill process 12517 (memcached) score 81 or sacrifice child
Nov 20 09:28:40 vps22899094 kernel: Killed process 12517, UID 497, (memcached) total-vm:565252kB, anon-rss:42940kB, file-rss:44kB
¿Cuáles deberían ser los valores óptimos para establecer en apache?
# / etc / sysconfig / memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="1024"
OPTIONS="-l 127.0.0.1"
/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
bind-address=127.0.0.1
#script
thread_concurrency=2
query_cache_size = 16M
query_cache_type=1
query_cache_limit=5M
# MyISAM #
#key-buffer-size = 32M
#myisam-recover = FORCE,BACKUP
# SAFETY #
#max-allowed-packet = 16M
#max-connect-errors = 1000000
# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
#query-cache-type = 0
#query-cache-size = 0
max-connections = 50
thread-cache-size = 16
#open-files-limit = 65535
#table-definition-cache = 1024
#table-open-cache = 2048
# INNODB #
#innodb-flush-method = O_DIRECT
#innodb-log-files-in-group = 2
#innodb-log-file-size = 5M
#innodb-flush-log-at-trx-commit = 1
#innodb-file-per-table = 1
#innodb-buffer-pool-size = 921M
# LOGGING #
log-error = /var/log/mysqld.log
log-queries-not-using-indexes = 1
slow-query-log = 1
slow-query-log-file = /var/log/mysqld-slow.log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
¿Consideró usar nginx (u otro servidor web basado en eventos) en lugar de apache?
nginx permitirá una mayor cantidad de conexiones y consumirá muchos menos recursos (ya que está basado en eventos y no crea procesos separados por conexión). De todos modos, necesitará algunos procesos, haciendo un trabajo real (como servidores WSGI más o menos) y si permanecen en el mismo servidor que el servidor web front-end, solo cambiará el problema de rendimiento a un lugar un poco diferente.
La última versión de Apache permitirá una solución similar (configurarla en función de los eventos), pero esta no es mi área de especialización.
Aquí hay un enfoque que podría resolver su problema, y si no, ayudaría con la solución de problemas.
Cree un segundo servidor virtual Apache idéntico al actual
Enviar todo el tráfico de usuario "normal" al servidor virtual original
Enviar tráfico especial o de larga duración al nuevo servidor virtual
El tráfico especial o de larga duración puede generar informes, operaciones de mantenimiento o cualquier otra cosa que no espere completar en << 1 segundo. Esto puede suceder sirviendo API, no solo páginas web.
Si su utilización de recursos es baja pero aún supera a MaxClients, la respuesta más probable es que tenga conexiones nuevas que lleguen más rápido de lo que pueden ser atendidas. Poner cualquier operación lenta en un segundo servidor virtual ayudará a probar si este es el caso. Use los registros de acceso de Apache para cuantificar el efecto.
Cuando utiliza Apache con mod_php apache se aplica en modo prefork
, y no en worker
. Como, incluso si se sabe que php5 admite multihilo, también se sabe que algunas bibliotecas php5 no se comportan muy bien en entornos de subprocesos múltiples (por lo que tendría una llamada local en un entorno local que altera el hilo en otros hilos php, por ejemplo) .
Entonces, si php no se está ejecutando de la misma manera que con php-fpm tienes mod_php dentro de apache y apache en modo prefork. En sus pruebas, simplemente ha comentado las configuraciones de prefork y ha aumentado las configuraciones de los trabajadores, lo que ahora tiene son los valores predeterminados para la configuración de prefork y algunos valores alterados para los compartidos:
StartServers 20
MinSpareServers 5
MaxSpareServers 10
MaxClients 1024
MaxRequestsPerChild 0
Esto significa que le pedirá a apache que comience con 20 procesos, pero le dirá que, si hay más de 10 procesos sin hacer nada, debería reducir esta cantidad de hijos, para mantenerse entre 5 y 10 procesos disponibles. La velocidad de aumento / disminución de Apache es de 1 por minuto. Tan pronto volverá a la situación clásica donde tiene un número bastante bajo de procesos apache gratuitos (promedio 2). El promedio es bajo porque generalmente tiene algo así como 5 procesos disponibles, pero tan pronto como el tráfico crece todos se utilizan, por lo que no hay ningún proceso disponible, ya que apache es muy lento en la creación de nuevas horquillas. Esto se ve incrementado por el hecho de que sus solicitudes PHP parecen ser bastante largas, no terminan temprano y las apache no se lanzan lo suficientemente pronto como para tratar otra solicitud.
¿Ves en el último gráfico la pequeña cantidad de verde antes del pico rojo? Si pudiera graficar esto en 1 minuto en lugar de 5 minutos, vería que esta cantidad verde no era lo suficientemente grande como para recibir el tráfico entrante sin ningún mensaje de error.
Ahora configura 1024
MaxClients
. Supongo que el gráfico de cactus no se toma después de esta modificación de la configuración, ya que con dicha modificación, cuando ya no hay más procesos disponibles, apache continuará bifurcando nuevos hijos, con un límite de 1024 hijos ocupados. Tome algo como 20MB de RAM por niño (o tal vez tenga un gran límite de memoria en PHP y permita 64MB o 256MB y estas solicitudes de PHP realmente están usando más RAM), tal vez un servidor de BD ... su servidor ahora se está desacelerando porque tienes solo 768MB de RAM. Tal vez cuando apache esté tratando de iniciar los primeros 20 niños, ya alcanzará el límite de RAM disponible.
Asi que. una forma clásica de manejo es verificar la cantidad de memoria utilizada por una horquilla apache (hacer algunos comandos superiores mientras se está ejecutando), luego encontrar la cantidad de solicitudes paralelas que puede manejar con esta cantidad de RAM (que significa apache paralelo para niños en modo prefork). Digamos que son 12 , por ejemplo. Ponga este número en la configuración de Apache mpm de esta manera:
<IfModule prefork.c>
StartServers 12
MinSpareServers 12
MaxSpareServers 12
MaxClients 12
MaxRequestsPerChild 300
</IfModule>
Eso significa que no mueve la cantidad de horquillas mientras aumenta o disminuye el tráfico, porque siempre quiere usar toda la RAM y estar preparado para los picos de tráfico. El 300
significa que recicla cada tenedor después de 300 solicitudes, es mejor que 0, significa que no tendrá posibles problemas de pérdida de memoria. MaxClients está configurado en 12 25 o 50, que es más de 12 para manejar la cola (se eliminó esta extraña sentencia, no recuerdo Por qué dije eso, si hay más de 12 solicitudes entrantes, la siguiente será presionada en la cola Backlog, pero debe establecer MaxClient para su número objetivo de procesos. ListenBacklog
, lo que puede poner en cola algunas solicitudes, puede tomar una cola más grande, pero podría obtener algunos tiempos de espera tal vez
Y sí, eso significa que no puede manejar más de 12 solicitudes paralelas.
Si quieres manejar más solicitudes:
- comprar un poco más de RAM
- intente usar apache en modo trabajador , pero elimine mod_php y use php como daemon paralelo con sus propias configuraciones de pooler (esto se llama php-fpm ), conéctelo con fastcgi. Tenga en cuenta que sin duda necesitará comprar algo de RAM para permitir una gran cantidad de procesos paralelos de php-fpm, pero quizás menos que con mod_php.
- Reduzca el tiempo pasado en su proceso php . Desde sus gráficos de cactus, tiene problemas potenciales: un pico de tráfico real alrededor de las 11: 25-11: 30 o un código de php que se vuelve muy lento. Las solicitudes rápidas reducirán la cantidad de solicitudes paralelas.
Si su problema es realmente picos de tráfico, las soluciones podrían estar disponibles con cachés, como un servidor proxy-caché. Si el problema es una lentitud aleatoria en PHP, entonces ... es un problema de aplicación, ¿realiza alguna consulta HTTP a otro sitio desde PHP, por ejemplo?
Y finalmente, como dice @Jan Vlcinsky, podrías probar nginx , donde php solo estará disponible como php-fpm . Si no puede comprar RAM y debe manejar un gran tráfico, definitivamente se merece una prueba.
Actualización: Acerca de las conexiones ficticias internas (si es su problema, pero tal vez no).
Mira este enlace y esta respuesta previa . Esto es ''normal'', pero si no tiene un host virtual simple, estas solicitudes pueden estar afectando a su aplicación pesada principal, generando consultas http lentas y evitando que los usuarios habituales accedan a sus procesos de apache. Se generan con recarga graciosa o gestión de niños.
Si no tiene una base simple de "Funciona", el Virtualhost predeterminado evita estas solicitudes en su aplicación mediante algunas reescrituras:
RewriteCond %{HTTP_USER_AGENT} ^.*internal/ dummy/ connection.*$ [NC]
RewriteRule .* - [F,L]
Actualizar:
Tener solo un Virtualhost no lo protege de las conexiones ficticias internas, es peor, ahora está seguro de que estas conexiones se realizan en su Virtualhost exclusivo. Entonces, realmente debe evitar los efectos secundarios en su aplicación mediante el uso de las reglas de reescritura.
Al leer sus gráficos de cactus, parece que su apache no está en el modo prefork en modo trabajador. Ejecute httpd -l
o apache2 -l
en debian, y verifique si tiene worker.c o prefork.c. Si está en modo trabajador, puede encontrar algunos problemas de PHP en su aplicación, pero debe verificar la configuración del trabajador, aquí hay un ejemplo:
<IfModule worker.c>
StartServers 3
MaxClients 500
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
Comienzas 3 procesos, cada uno con 25 hilos (por lo que 3 * 25 = 75 solicitudes paralelas disponibles por defecto), permites que 75 hilos no hagan nada, tan pronto como se utiliza un hilo, se bifurca un nuevo proceso y se agregan 25 hilos más. Y cuando tienes más de 250 hilos sin hacer nada (10 procesos), se mata algún proceso. Debe ajustar estas configuraciones con su memoria. Aquí permite 500 procesos paralelos (es decir, 20 procesos de 25 hilos). Tu uso es tal vez más:
<IfModule worker.c>
StartServers 2
MaxClients 250
MinSpareThreads 50
MaxSpareThreads 150
ThreadsPerChild 25
MaxRequestsPerChild 300
</IfModule>
Recomiendo usar la fórmula siguiente sugerida en Apache:
MaxClients = (RAM total - RAM para OS - RAM para programas externos) / (RAM por proceso httpd)
Encuentra mi script aquí que se ejecuta en Rhel 6.7. puede hacer cambios de acuerdo a su sistema operativo.
#!/bin/bash
echo "HostName=`hostname`"
#Formula
#MaxClients . (RAM - size_all_other_processes)/(size_apache_process)
total_httpd_processes_size=`ps -ylC httpd --sort:rss | awk ''{ sum += $9 } END { print sum }''`
#echo "total_httpd_processes_size=$total_httpd_processes_size"
total_http_processes_count=`ps -ylC httpd --sort:rss | wc -l`
echo "total_http_processes_count=$total_http_processes_count"
AVG_httpd_process_size=$(expr $total_httpd_processes_size / $total_http_processes_count)
echo "AVG_httpd_process_size=$AVG_httpd_process_size"
total_httpd_process_size_MB=$(expr $AVG_httpd_process_size / 1024)
echo "total_httpd_process_size_MB=$total_httpd_process_size_MB"
total_pttpd_used_size=$(expr $total_httpd_processes_size / 1024)
echo "total_pttpd_used_size=$total_pttpd_used_size"
total_RAM_size=`free -m |grep Mem |awk ''{print $2}''`
echo "total_RAM_size=$total_RAM_size"
total_used_size=`free -m |grep Mem |awk ''{print $3}''`
echo "total_used_size=$total_used_size"
size_all_other_processes=$(expr $total_used_size - $total_pttpd_used_size)
echo "size_all_other_processes=$size_all_other_processes"
remaining_memory=$(($total_RAM_size - $size_all_other_processes))
echo "remaining_memory=$remaining_memory"
MaxClients=$((($total_RAM_size - $size_all_other_processes) / $total_httpd_process_size_MB))
echo "MaxClients=$MaxClients"
exit