tuning the reached raising optimizar maxrequestworkers maxclients example consider configurar performance apache thread-safety cacti

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.

  1. Cree un segundo servidor virtual Apache idéntico al actual

  2. Enviar todo el tráfico de usuario "normal" al servidor virtual original

  3. 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 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 (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.

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