Cómo crecer desde la configuración de un solo servidor

8

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:

mysql UPC memoria

Jon M
fuente
Lo comprobaré, Erik, gracias. ¿Alguien piensa que aumentar la cantidad de RAM tendría un gran efecto? Sin embargo, creo que es costoso en Rackspace, £ 50 / GB / mes IIRC.
¿Estás haciendo lecturas y escrituras de MySQL o es una más importante que la otra?
wag2639
No estoy convencido de que esto debería haberse movido de SO. Escalar más allá de una sola caja es tanto un problema de programación como un problema de hardware. Más aún, en realidad. Comprar hardware es fácil. Escribir código que lo utiliza de manera horizontalmente escalable es difícil.
Frank Farmer
wag2639 la gran mayoría de las consultas son seleccionadas. De acuerdo con mi gráfico munin, los éxitos de caché son aproximadamente el 50% del total ... ¿hay alguna manera de publicar una imagen? Máximo a 2,160 QPS, promedio 522 QPS.
Jon M

Respuestas:

3

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).

MarkR
fuente
32G no es terriblemente asequible cuando alquilas hardware. Y alquilar hardware es generalmente más económico cuando solo tiene una o dos cajas.
Frank Farmer
MarkR / Frank, ¿puede ofrecer más información basada en los gráficos que he publicado anteriormente? ¡Mi última cotización para RAM adicional fue de ~ £ 50 / GB / mes!
Jon M
1

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 SELECTsintaxis 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.

Vegard Larsen
fuente
Gracias Vegard Sí, consulto regularmente el registro lento de consultas y explico el comando en mis consultas. El servidor prácticamente ejecuta instancias de apache y MySQL, pero también hacemos algunas cosas como la conversión de video, que estoy en el proceso de pasar a un servidor en la nube.
Si su problema realmente se está quedando sin hilos de apache, puede quitar algo de carga trivialmente instalando nginx (u otro proxy inverso liviano) frente a apache. Entonces, Nginx puede servir contenido estático y asumir la tarea de alimentar con bytes bytes de clientes lentos, liberando a apache para hacer lo que realmente necesita: actuar como un contenedor de aplicaciones PHP. Para obtener una descripción más completa de este concepto, consulte: modperlbook.org/html/…
Frank Farmer
Gracias Frank, esto ciertamente parece razonable, me he movido todo lo que puedo a Amazon S3, inicialmente solo era UGC, pero ahora trato de poner todos los elementos gráficos y CSS también. Estoy seguro de que hay algunos ajustes de Apache y MySQL por hacer.
Jon M
1

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:

  • pila de red
  • pila de memoria
  • disco io
  • capa de aplicación
  • capa os

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:

  • bases de datos de memoria amor memoria
  • el disco io cualquier cosa menos la incursión 10 puede matar el rendimiento de la base de datos
  • optimizaciones incorrectas: los grandes valores no se traducen en un gran rendimiento
  • aplicación: culpar al servidor por un diseño deficiente de la aplicación

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.

jeffatrackaid
fuente
0

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.

serg
fuente
Gracias por su consejo, Serg, ya estoy almacenando en caché HTML en varios lugares y utilizo algunas consultas de base de datos durante la noche para completar algunas tablas de "búsqueda rápida".
0

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
Si tiene suficiente RAM libre y mysql tarda en responder consultas de lectura, no tiene mysql sintonizado correctamente. use el ram para la base de datos en su lugar. El almacenamiento en caché de MySQL será completamente transparente para la aplicación, no introducirá errores y nunca devolverá datos obsoletos.
MarkR
El caché de consultas mysql se invalida, para muchas cargas de trabajo, de forma demasiado agresiva como para que valga la pena. Actualizar una sola fila en una tabla invalida cada consulta en esa tabla.
Frank Farmer
0

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.

TomTom
fuente