Cómo reducir el uso de memoria en un servidor web Unix


36

Actualmente estoy usando un Acelerador Joyent para alojar mis aplicaciones web, y está funcionando bien, sin embargo, necesito reducir los costos, así que estoy bajando mi plan actual y eso impone algunos nuevos límites de memoria (256M rss, 512M swap). Ayer no estuve demasiado lejos de ellos, pero después de reiniciar Apache varias veces hoy, ahora estoy 411M rss, 721M swap (prstat -Z -s cpu).

Buscar en Server Fault solo me brinda muchas formas y herramientas específicas para monitorear el servidor, pero no hay consejos sobre cómo reducir / optimizar su uso de memoria. También he visto esta pregunta , pero no creo que sea buena para esta situación particular (¿o puedo decir genérica?).

El servidor ejecuta Solaris en una CPU compartida, y estoy usando una pila Apache + MySQL + PHP.

Estoy interesado en conocer los pasos que uno puede tomar para solucionar este problema y resolver los problemas. Sin embargo, también me estoy quedando sin tiempo para reducir la huella de mi memoria y degradar el plan antes de que finalice el actual, por lo que cualquier cosa que pueda hacer magia y salvar el día también es bienvenida :)


1
Solo quería comentar que, aunque aprendí sobre estas configuraciones yo mismo en Google, resultó que estaba cambiando las configuraciones en un archivo, ¡pero un archivo de configuración diferente que se estaba cargando más tarde en realidad anulaba mis configuraciones en silencio! Una vez que descubrí eso, establecer la configuración MPM prefork y algunas otras cosas funcionaron de maravilla para mantener el recuento de procesos y el uso de memoria bajo control, intercambiando al mínimo. Espero que esta información ayude a otros, especialmente a aquellos que ejecutan Gentoo en sus servidores.
Pistos

Respuestas:


23

¡Gracias a todos por sus respuestas! Siguiendo sus sugerencias, he podido reducir mi uso de memoria a 195M SWAP y 108M RSS, sin tocar mi código (definitivamente lo optimizaré pronto, pero se suponía que era una solución para sacarme de problemas rápidamente).

Aquí está la lista de cosas que hice:

Se deshizo del comodín utilizado en las entradas de VirtualHost. En lugar de *: 80 y *: 443, utilicé la IP real de mi servidor.

Se modificó el MPM prefork de Apache. Estos son los valores que terminé usando:

StartServers 1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
ListenBacklog 100

Estos no son en absoluto números mágicos. Pasé algún tiempo probando diferentes valores y combinaciones, y luego probándolos contra el uso real de mi servidor y todos deberían hacer lo mismo en su entorno. Para el registro, mi servidor recibe cerca de 2 millones de pvs / mes, sirviendo tanto páginas dinámicas como activos a una velocidad regular, sin efecto de digg. La intención, nuevamente, era reducir la huella de la memoria, no mejorar el rendimiento o HA.

Referencia:

Apagado KeepAlive de Apache. Al establecer KeepAliveTimeoutun valor más bajo (2 en mi caso), puedo esperar menos procesos de servidor que solo esperan conexiones con clientes inactivos que pueden no solicitar más contenido.

Referencia: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

Se eliminó el módulo no utilizado de MySQL. He añadido skip-innodba my.cnf de MySQL. Reducción masiva del consumo de memoria.


También hay algunas buenas sugerencias notables que no pude hacer personalmente:

  • Elimine los módulos PHP que no necesita. El PHP en mi servidor tiene la mayoría de los mods ya compilados, probablemente probaré mi propio PHP mínimo en otros VPS.
  • Cambie a nginx con php-fastcgi. Ese es otro buen consejo que intentaré pronto, pero en este momento no puedo arriesgar el tiempo de inactividad.

Estoy ejecutando nginx y php-fastcgi (LEMP) y tengo problemas de memoria similares ... en un servidor de 256 MB, encuentro que php-fastcgi funciona bien con PHP_FCGI_CHILDREN = 5 y PHP_FCGI_MAX_REQUESTS = 333 ... estos valores son un buen comienzo ¡punto!
farinspace

Got rid of the wildcard used in VirtualHost entries¿eso realmente ayuda de alguna manera significativa? Tenía la impresión de que eso no haría la diferencia.
Mahn

@Mahn: no ayuda con la memoria, pero mejora el uso de la CPU, lo cual es bueno en un entorno con poca memoria
jsnfwlr

"Cambie a nginx con php-fastcgi" --- Una opción menos drástica pero efectiva si desea mantener Apache2 sería: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event es similar a nginx. Use eso para conectarse a php-fpm. Ver dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston el


4

Tendrá que limitar la cantidad de procesos del servidor apache que se están ejecutando, y al estar tan cerca del límite como usted, no podrá manejar mucho tráfico pico. Tener un servidor web que esté al máximo en condiciones normales de uso es generalmente una mala idea (tm), ya que el tráfico web es bueno y bajo en su mayor parte hasta que te tapan o te cavan o disparan o lo que sea.

Los principales problemas son la cantidad de procesos de Apache que se ejecutan en cualquier punto, suponiendo que aquí se realice la prefork, ya que solo he implementado aplicaciones PHP y PHP no es seguro para subprocesos. No tengo experiencia dimensionando el MPM trabajador. Hay algunos elementos que están en la memoria compartida y algunos elementos que están en la memoria de cada proceso.

Puede reducir la huella de memoria total al omitir los módulos compartidos que no necesita. Básicamente, Apache viene configurado por la mayoría de los hosts para hacer casi todo bajo el sol. Si no está utilizando mod_userdir, coméntelo fuera de su configuración de apache. Solo tenga cuidado con la cantidad que elimina, porque algunas de las cosas que puede necesitar o sus dependencias no son intuitivas. Todos los módulos deben documentarse en el sitio web apache.org. La huella por proceso es más difícil de reducir; La mayoría de las configuraciones de Apache en estos días solo vienen con los cuatro módulos esenciales compilados. Más allá de esos cuatro módulos, la mayor parte del uso de la memoria proviene de fugas o RAM de la aplicación que no se recolecta de manera efectiva, por lo que es posible que desee establecer el número de solicitudes manejado por cada proceso bajo.

Usted realmente desea mantener su uso de memoria RAM en sí mismo y no entra en intercambio. Intercambio significa E / S. La E / S es lenta e impulsará el uso de su CPU a medida que los procesos se bloquean mientras espera que algo se elimine del intercambio.


1
Gracias por el consejo Karl! ¿Hay alguna manera de evitar que el servidor use el intercambio? Porque después de reducir el uso de la memoria, ya no uso mi RAM, pero todavía muestra que se usó la memoria SWAP.
Lima

@fandelost Realmente no importa que se esté utilizando el intercambio, lo que está mal es cuando las cosas se paginan dentro y fuera del intercambio. Su sistema operativo puede estar intercambiando instrucciones o datos de procesos que no se ejecutan muy a menudo cuando hay tiempo para hacerlo porque cree (y a menudo tiene razón) que esas instrucciones y datos están mejor allí.
Patrick James McDougle

2

Para apache, elimine los módulos que no usa, ya que solo usan memoria adicional. Para MySQL, elimine innodb / bbdb si no los usa, y elimine los módulos PHP que no necesita.

A continuación, debe configurar los MaxClients de apache en función del tamaño de un proceso y la cantidad de memoria que desea dar a apache. Lo mismo ocurre con las conexiones máximas en MySQL (recomiendo la excelente secuencia de comandos de MySQL Tuning Primer Script.

Si tiene control sobre su aplicación PHP, asegúrese de que no use demasiada memoria (por ejemplo, en variables, especialmente las estáticas).

Si desea ir más allá, puede reemplazar apache + mod_php con la configuración nginx + fcgi, lo que probablemente resultará en una mayor reducción de memoria.

Una última cosa: realmente no desea intercambiar en un servidor web. Solo un poco, para eliminar las cosas innecesarias, pero intercambiar regularmente en un servidor web dará como resultado un sitio web que no responde.


Gracias por su consejo yhager, estoy intentando tuning-primer.sh pero aparece el siguiente error: "error de sintaxis en la línea 94:` cnf_socket = $ 'inesperado ". ¿Algunas ideas?
Lima

Podría estar relacionado con el shell. Como este script probablemente esté relacionado con Linux, intente cambiar la primera línea para que apunte a bash, en lugar de / bin / sh. Espero que usted puede conseguir instalado en Solaris fiesta, pero yo no puedo ayudar con eso ...
yhager

2

Como ya cumpliste tu objetivo, aquí hay algunos adicionales:

Como eliminó todos los módulos php innecesarios, podría hacer lo mismo para apache. Por defecto (dependiendo de la instalación), Apache carga bastantes módulos adicionales y la mayoría de ellos no son realmente necesarios para el uso normal del día a día. Por ejemplo, hay un montón de módulos de autenticación que siempre se cargan. Por lo general, no se requiere desinflar a menos que esté tratando de limitar su uso de ancho de banda. El índice automático y el estado también son cuestionables.

Y otra es que puede limitar la cantidad de memoria disponible para php en php.ini: memory_limit = xxxM


0

Por supuesto, podría limitar la cantidad de procesos que apache puede bifurcar, sin embargo, esto solo funcionaría como un límite de sudo-hard en su uso de memoria. Desde un punto de vista de nivel inferior, puede usar plimit para restringir los recursos disponibles para un proceso. Aplicar esto a los procesos primarios y secundarios heredar creo.

Sin embargo, desde el punto de vista de la configuración del servidor web, ¡puede reducirse a cómo funciona realmente su código! Pero tenga en cuenta cosas pequeñas como el uso de archivos .htaccess que usan más recursos que el uso de archivos de configuración central de apache (ya que se leen cada vez que entra una solicitud, lo que genera una mayor sobrecarga), algo que es significativo en sitios web grandes.


0

Una cosa que podría ayudar al crecimiento de la memoria a lo largo del tiempo es configurar el httpd keepalive más bajo, pero lo probaría cuidadosamente en caso de que su aplicación necesite procesos de mayor duración.


0

El servidor ejecuta Solaris en una CPU compartida, y estoy usando una pila Apache + MySQL + PHP.

No tengo experiencia con Solaris, pero lo mejor que puede hacer es no usar Apache / mod_php.

  • Cambie a nginx con php-fastcgi.
  • Recompile php para usar la cantidad mínima de complementos.
  • Deshágase de procesos innecesarios como ntpd (use ntpdate), ftp (use scp), etc.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.