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 :)
Respuestas:
¡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:
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
KeepAliveTimeout
un 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-innodb
a my.cnf de MySQL. Reducción masiva del consumo de memoria.También hay algunas buenas sugerencias notables que no pude hacer personalmente:
fuente
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.Encontré este artículo sobre configuraciones de poca memoria para Apache y MySQL
Para ser muy útil en el diseño de los cambios de configuración necesarios para configuraciones con poca memoria. Los modifiqué para mi propia situación, pero deberían darte las herramientas necesarias para encontrar la mejor opción para tu entorno
fuente
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.
fuente
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.
fuente
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
fuente
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.
fuente
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.
fuente
No tengo experiencia con Solaris, pero lo mejor que puede hacer es no usar Apache / mod_php.
fuente