Estoy buscando recursos sobre cómo hacer crecer la configuración de nuestro servidor.
Actualmente tenemos un servidor dedicado con Rackspace en el Reino Unido con las siguientes especificaciones:
HPDL385_G2_PrevGen
HP Single Dual Core Opteron 2214 (2.2Ghz)
4GB RAM
2x 10,000 unidades SCSI en RAID 1
Nuestro tráfico es de hasta 550,000 UV por mes.
El sitio se ejecuta con una configuración de PHP y MySQL. La base de datos obtiene un martilleo absoluto, tenemos muchas consultas complejas que unen tablas multilpe.
Estamos utilizando APC para el almacenamiento en caché de PHP.
Estoy llegando a la etapa en la que he hecho tanta optimización de DB y consultas como puedo y me pregunto cuál debería ser el siguiente paso ...
He visto Memcache, pero tengo la impresión de que requiere una gran cantidad de RAM e idealmente una caja dedicada ...
Entonces, el siguiente paso es tener dos cajas; uno para la base de datos, uno para Apache? ¿O hay un paso que he pasado por alto?
Nuestra carga generalmente está alrededor de la marca 2, ¡pero ahora está en 20!
Algunas gráficas de Munin:
fuente
Respuestas:
Compre algo de hardware, pero póngalo en su laboratorio de pruebas, no en el centro de datos. Luego enfatice su aplicación en varias combinaciones de hardware / software hasta que encuentre una razonable que haga lo que desea.
Por supuesto, tendrá que diseñar algo que pueda crear tráfico falso contra una base de datos de producción que ejecute una copia de prueba de su aplicación. Pero quién dijo que sería fácil.
Si no hace esto y simplemente hace algunas cosas en la producción, no tiene idea de si va a funcionar o no, y puede haber invertido MUCHO esfuerzo de ingeniería implementando cosas como cachés (que vendrán con su parte justa de errores!) en algo que no ayuda.
Prueba, prueba y prueba más. No arroje cambios de hardware / software a la producción hasta que tenga buenos datos de rendimiento que demuestren que es probable que mejore las cosas significativamente. El esfuerzo de ingeniería es costoso, el hardware de prueba no lo es (particularmente).
Memcached es solo una opción, y probablemente no necesite considerarlo hasta que la caché de la base de datos funcione de manera óptima. Esto significa ponerlo en una caja dedicada (64 bits, por supuesto) con una cantidad razonable de RAM (no 4G, las computadoras portátiles tienen eso hoy en día; 32G es definitivamente asequible) y ajustarlo adecuadamente.
No ha mencionado qué tan grande es su base de datos, pero si es factible, querrá tratar de obtenerla completamente en ram (o al menos los bits más activos). Obtener su base de datos completamente en ram hará que las operaciones de lectura de E / S desaparezcan por completo y, por lo tanto, deje de ser un cuello de botella.
Perfile sus consultas de base de datos. Hay herramientas para hacerlo: debe poder simular la carga de producción en su entorno de prueba. El truco consiste en evitar consultas lentas y garantizar que las ejecutadas con frecuencia sean rápidas.
Si sus problemas de rendimiento están relacionados con las sincronizaciones de E / S, debido a que solo está haciendo demasiadas transacciones para la base de datos, asegúrese de estar utilizando un controlador RAID respaldado por batería que se esté comportando correctamente (hable con su proveedor sobre ellos). Proporcionan muchas más operaciones de escritura de E / S que una sin batería (porque los datos solo necesitan llegar al caché antes de que el sistema operativo obtenga la confirmación). Alternativamente, si sus datos no importan tanto, considere relajar los parámetros de durabilidad de la base de datos (innodb sync on commit).
fuente
Al buscar soluciones de almacenamiento en caché, como muchos otros han sugerido aquí, puede esperar terminar con aproximadamente el 10% de la carga que tiene hoy, tal vez menos.
Sin embargo, esto depende del tipo de servicios que ejecute en su máquina. Puedes hacer mucho con memcached sin mucha RAM.
Debería intentar perfilar qué consultas de la base de datos demoran más, ya sea utilizando el registro de consultas lento de MySQL (o el equivalente para su base de datos), o utilizando una herramienta como mytop . Además, la
EXPLAIN SELECT
sintaxis de MySQL puede ser útil.El almacenamiento en caché de los resultados de algunas consultas MySQL seleccionadas (incluso por un corto período de tiempo) realmente puede mejorar mucho su rendimiento.
fuente
Hago mucho rendimiento y trabajo de escala y lo que he descubierto es que:
Cada carga de aplicación es única
Las respuestas genéricas, como agregar más ram, obtener otro servidor, hacer y, probar x, a menudo son lecciones de frustración y se dejan en configuraciones complicadas.
Medir las cosas correctas
Uno de los mayores desafíos es determinar qué puntos de referencia son importantes. Esto a menudo requiere un paso atrás y tienes que ponerte en el lugar de tu cliente. A veces, el diseño simplificado del sitio cambia y significa enormes beneficios para el visitante web. ¡Por eso me gustan las herramientas como YSlow! que se centran más en la experiencia del usuario final que en el nivel del servidor. Una vez que decida cuál es el punto de referencia correcto para su sitio, puede comenzar a ajustar. Los puntos de referencia pueden ser el tiempo total de carga de la página, el tamaño total de la página, la efectividad de la memoria caché, la latencia del sitio, etc. Debe elegir el que tenga sentido para su aplicación.
Tuercas y tornillos
Una vez que esté siguiendo los puntos de referencia correctos, comience en un nivel muy bajo. Me gusta usar sysstat. Puede obtener una gran cantidad de información de sysstat y ayudarlo a descubrir qué sistema puede estar limitando el rendimiento general de la aplicación. En general, hiervo problemas de rendimiento en:
Usando sysstat y otras herramientas, puede comenzar a dividir los pelos y encontrar el sistema que limita el rendimiento.
Por ejemplo, he visto fallar servidores muy cargados debido a cómo se configuró su aplicación. El almacenamiento en caché deficiente, la falta de encabezados caducados en contenido estático, el uso de HTTP frente a archivos incluidos, etc., todo contribuyó al bajo rendimiento de la aplicación. La solución de estos problemas de aplicación no requería cambios de hardware. En otros casos, he visto los discos al máximo a pesar de toneladas de almacenamiento en caché. Pasar a discos más rápidos solucionó el problema.
Enjuague y repita
A menudo, durante el ajuste de la aplicación, descorchará un cuello de botella para encontrar solo otro. Es por eso que recomiendo tratar de monitorear lo que sea que esté ajustando.
Por ejemplo, supongamos que soluciona un problema de E / S de disco pero su aplicación aún es lenta. Puede pensar que ha desperdiciado sus esfuerzos, pero lo que sucede es que simplemente está golpeando otro cuello de botella. Al monitorear el disco IO con cuidado, puede estar seguro de que está mejorando el disco IO incluso si sus importantes monitores de rendimiento de la aplicación no están cambiando.
Obtenga las herramientas adecuadas
Asegúrese de estar utilizando las herramientas adecuadas para el trabajo. El monitoreo, las pruebas, la evaluación comparativa, la creación de perfiles y otras técnicas de optimización tienen una variedad de herramientas. Encuentre la herramienta que mejor se adapte mejor a su situación.
Reglas de juego
Si bien cada aplicación es única, encuentro algunos puntos de partida estándar:
Sus próximos pasos
Si no encuentra su cuello de botella, agregar un servidor puede no ser de gran ayuda. Para resolver el disco IO puede que necesite otro servidor o SAN. Si tiene un cuello de botella de ram, otro servidor resolverá el problema solo porque agrega más RAM. Movimiento bastante costoso en comparación con solo agregar más RAM a su servidor existente.
Arreglo rapido
Sobre despliegue. Tuve que hacer esto cuando parece que la pila de aplicaciones es el problema. Básicamente carga en CPU, RAM y disco IO (RAID 10, 15K SCSI o SSD). Vaya a lo grande en el hardware y luego comience a ajustar. Esto lo mantiene a flote hasta que resuelva los problemas.
fuente
Yo diría que el siguiente paso debería ser el almacenamiento en caché (almacenamiento en caché de datos y / o almacenamiento en caché de página, dependiendo de su funcionalidad). Si memcached parece demasiado complejo, puede comenzar con soluciones simples de almacenamiento en caché de datos como PEAR Cache Lite, que requiere solo un par de líneas de código, pero podría marcar una gran diferencia. El almacenamiento en caché de páginas (o partes de página) es compatible con el motor de plantillas Smarty , por ejemplo.
Una vez que el almacenamiento en caché ya no lo corta, puede aumentar la cantidad del servidor ya que no queda nada más.
fuente
Si tiene suficiente RAM libre, memcached lo ayudará incluso en el mismo cuadro. Intente almacenar en caché varias consultas más pesadas y ver qué sucederá. Además, Apache es demasiado pesado, use nginx o lighttpd en su lugar (con la aplicación PHP trabajando a través de FastCGI, vea php-fpm ).
fuente
Comience a almacenar en caché, pero ignore MySQL por el momento. En serio.
La regla debería ser: detener una solicitud tan pronto como sea posible. Por lo tanto, un proxy inverso o el almacenamiento en caché de nivel de Apache adecuado le proporcionarán los mejores resultados, luego el almacenamiento en caché de resultados de nivel SQL DENTRO de la aplicación, luego el almacenamiento en caché de nivel SQL;)
Cuanto antes detenga una solicitud, menos gastos generales tendrá. Nivel de caché de salida: ni siquiera PHP necesita ejecutarse, por así decirlo.
fuente