36 votos

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

Actualmente estoy usando un Acelerador de Joyent para alojar mi webapps, y funciona bien, sin embargo, tengo la necesidad de reducir costos, así que estoy degradar mi plan actual, y que impone algunos de los nuevos límites de memoria (256 MB de rss, 512 mb de swap). Yo no estaba demasiado lejos más que ayer, pero después de reiniciar Apache varias veces hoy, ahora estoy 411M rss, 721M swap (prstat-Z-s de la cpu).

La búsqueda en el Servidor de error sólo me da un montón de maneras y herramientas específicas para supervisar el servidor, pero no hay consejos sobre cómo reducir los/optimizar el uso de memoria. También he visto esta pregunta, pero creo que no es bueno para esta particular (o puede que yo digo genérico?) situación.

El servidor se está ejecutando Solaris en un compartidos de la CPU, y estoy usando un Apache + MySQL + PHP pila.

Estoy interesado en saber los pasos que se pueden tomar para detectar y solucionar problemas de este y resolver los problemas. Sin embargo, también estoy acabando el tiempo para bajar mi memoria impresión del pie y degradar el plan antes de la actual termina, así que cualquier cosa que se puede hacer de la magia y salvar el día es bienvenida :)

23voto

saturdayplace Puntos 1438

Gracias a todos por sus respuestas! Siguiendo sus sugerencias he sido capaz de reducir mi uso de la memoria a 195M de INTERCAMBIO y 108M RSS, sin tocar el código (definitivamente, voy a optimizar pronto, pero se suponía que esto iba a ser una solución para sacarme de un apuro rápido).

Aquí está la lista de cosas que hice:

Se deshizo de el comodín utilizado en las entradas de host virtual. En lugar de *:80 y *:443, he utilizado el real IP de mi servidor.

Cambiado de Apache MPM prefork. Estos son los valores que terminó con:

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

Estos no son números mágicos. He pasado algún tiempo probando diferentes valores y la combinación y, a continuación, ponerlos a prueba en contra de la utilización real de mi servidor y todo el mundo debería hacer lo mismo en su entorno. Para el registro, mi servidor recibe cerca de 2M pvs/mes, que sirve tanto a las páginas dinámicas y activos a una tasa regular - no digg efecto. La intención, de nuevo, fue la reducción de la huella de memoria, no para mejorar el rendimiento o HA.

Referencia:

Atentos abajo Apache KeepAlive. Estableciendo KeepAliveTimeout a un valor inferior (2 en mi caso) se puede esperar menos de servidor de procesos esperando en las conexiones con los clientes inactivos que no puede solicitar más contenido.

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

Eliminado MySQL no utilizado de su módulo. He añadido skip-innodb MySQL de mi.cnf. Masiva de la memoria de reducción de consumo.


También hay algunas notables buenas sugerencias que yo no podía hacer personalmente:

  • Quitar módulos PHP no es necesario. El PHP en mi servidor tiene la mayoría de los mods ya compilado, probablemente voy a intentar mi propia mínima de PHP en otros VPS.
  • Cambiar a nginx con php-fastcgi. Ese es otro buen consejo que voy a intentar pronto, pero ahora mismo no puedo riesgo de tiempo de inactividad.

6voto

Jeremy Puntos 1287

Encontré este artículo sobre configuraciones de baja memoria de Apache y MySQL

Ser muy útil en la colocación de los cambios de configuración necesarios para configuraciones de memoria baja. Les pellizqué para mi situación, pero deben dar las herramientas necesarias para encontrar el mejor ajuste para su entorno

4voto

Karl Katzke Puntos 2293

Usted va a necesitar para limitar la cantidad de un servidor apache procesos se están ejecutando, y estando tan cerca del límite como eres, no vas a ser capaz de manejar muy picos de tráfico. Tener un servidor web al que llegado al máximo en condiciones normales de uso es generalmente una Mala Idea (tm), como el tráfico de la web es agradable y bajos para la mayor parte, hasta llegar slashdotted o abierto, o fireballed o lo que sea.

Los principales problemas son el número de apache procesos que se están ejecutando en un momento dado, asumiendo prefork aquí, ya que sólo he implementado las aplicaciones de PHP y PHP no es seguro para subprocesos. No tengo experiencia en dimensionamiento de la MPM worker. Hay algunos elementos que están en la memoria compartida, y algunos elementos que hay en cada proceso de la memoria.

Usted puede reducir el total de la huella de memoria dejando los módulos compartidos que usted no necesita. Básicamente, Apache viene configurado de la mayoría de los ejércitos para hacer casi todo bajo el sol. Si no estás usando mod_userdir, a continuación, un comentario de su configuración de apache. Sólo tenga cuidado de cómo mucho de quitar, porque algunas de las cosas que necesita, o sus dependencias no son intuitivos! Todos los módulos deben ser documentados en la apache.org sitio web. El proceso de la huella es más difícil conseguir más pequeños; la mayoría de las configuraciones de apache en estos días vienen solo con los cuatro módulos fundamentales compilado en. Más allá de los cuatro módulos, la mayoría del uso de la memoria proviene de cualquiera de las fugas o la aplicación de RAM que no es basura que se recoge de manera efectiva, que es la razón por la que usted podría desear para establecer el número de las solicitudes tramitadas por cada proceso de baja.

Usted realmente quiere mantener su uso de memoria en RAM y no ir en swap. Swap medio de e/s. e/S es lento y la unidad de su uso de la CPU a través del techo como de los procesos de bloque, mientras que a la espera de algo para obtener aleatorio de intercambio.

2voto

zdan Puntos 207

Para apache, quitar los módulos que no uso, ya que sólo el uso de memoria adicional. Para MySQL, quitar innodb/bbdb si no los usan, y quitar módulos PHP no es necesario.

A continuación, debe configurar apache MaxClients basado en el tamaño de un único proceso y la cantidad de memoria que desea dar de apache. Lo mismo va para max conexiones de MySQL (recomiendo el excelente MySQL Optimización de Cebadores de secuencia de Comandos.

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

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

Una última cosa - usted realmente no quiere cambiar en un servidor web. Sólo un poco, para eliminar los innecesarios cosas, pero el intercambio con regularidad en un servidor web se traducirá en una falta de respuesta del sitio web.

2voto

Pawel Pabich Puntos 818

Puesto que usted ya ha cumplido con su objetivo, he aquí unos cuantos:

Desde quita todos los unnecessery módulos php, usted puede a la misma para apache. Por defecto (dependiendo de la instalación tú) apache cargas bastante un montón de módulos adicionales y la mayoría de ellos no son realmente necesarios para el día a día de uso. Por ejemplo, hay montón de módulos de autenticación que siempre se cargan. desinflar no suele ser necesaria, a menos que usted está tratando de limitar su uso de ancho de banda. Autoindex y el estado va también son cuestionables.

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

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: