php - poner - tags en wordpress
¿Mejores prácticas para optimizar los sitios LAMP para la velocidad? (8)
Quiero saber cuándo construyo un sitio típico en la pila LAMP, ¿cómo lo optimiza para obtener los mejores tiempos de carga posibles? Estoy imaginando un sitio típico impulsado por DB.
Este es un aspecto de alto nivel y probablemente podría ser cuestionado y me permitiría dividirlo en cada capa de la pila.
L - A nivel del sistema, (configuración y sistema de archivos), ¿puedes hacer para mejorar la velocidad? Una cosa que se me ocurre es el tamaño de la imagen, ¿la compresión aquí puede ayudar a optimizar cualquier cosa?
A - Debe haber un montón de configuraciones relacionadas con la velocidad del sitio aquí en el servidor web. No es mi fuerte. Probablemente depende mucho de cuántos sitios se estén ejecutando simultáneamente.
M: MySQL en un sitio basado en una base de datos, el rendimiento de la base de datos es clave. ¿Hay un mejor enfoque de normalización, es decir, utilizando tablas de enlace? Los desarrolladores web a menudo solo crean tablas monolíticas parecidas a 1NF y esto puede matar el rendimiento.
P: aparte de las configuraciones que aumentan el rendimiento, como el almacenamiento en caché, ¿qué puede hacer el programador para afectar el rendimiento a un nivel alto? Realmente me gustaría saber si los enfoques de diseño de MVC alcanzan el rendimiento más que rápido y sucio. Sería interesante conocer otros consejos simples, como sesiones más rápidas que las cookies.
Obviamente, tienes que meterte y ensuciarte en los detalles y descubrir qué código te está ralentizando. También me doy cuenta de que muchos sitios tienen muchas características de rendimiento diferentes, pero supongamos que un sitio típico que tiene más lecturas luego escribe.
Me pregunto si podemos compilar un montón de mejores prácticas y esperar que las personas vinculen otras preguntas para que podamos elaborar una lista de verificación de manera efectiva.
Mi objetivo es ver si, además de los problemas habituales en el rendimiento, podemos ver algunas cosas extrañas que quizás no piense que surjan junto con un resumen de las mejores prácticas.
Entonces, mi pregunta es, si estuviera comenzando desde cero, ¿cómo se aseguraría de que su sitio LAMP fuera rápido?
¡No te olvides de desactivar el tiempo para tu sistema de archivos!
Aquí hay algunos datos personales que siempre he configurado en mis aplicaciones LAMP.
Instale mod_deflate para apache y no use los controladores gzip de PHP. mod_deflate te permitirá comprimir contenido estático, como javascript / css / static html, así como la salida dinámica habitual de PHP, y es una cosa menos de la que debes preocuparte en tu código.
¡Cuidado con los archivos .htaccess! Habilitar los archivos .htaccess para los directorios en su aplicación significa que Apache tiene que escanear el sistema de archivos constantemente, buscando directivas .htaccess. Es mucho mejor colocar directivas dentro de la configuración principal o una configuración vhost, donde se cargan una vez. Cada vez que puede deshacerse de un archivo de acceso de nivel de directorio al moverlo a un archivo de configuración principal, ahorra tiempo de acceso al disco.
Prepare la capa de base de datos de su aplicación para utilizar un administrador de conexión de algún tipo (yo uso un Singleton para la mayoría de las aplicaciones). No es muy difícil hacerlo, y reducir la cantidad de conexiones de base de datos que abre su aplicación ahorra recursos.
Si crees que tu aplicación verá una carga significativa, memcached puede realizar milagros. Recuerda esto mientras escribes tu código ... quizás un día en lugar de crear objetos sobre la marcha, los obtendrás desde memcached. Un poco de previsión hará que la implementación sea indolora.
Una vez que la aplicación esté en funcionamiento, configure el tiempo de consulta lento de MySQL en un número pequeño y monitoree el registro de consulta lenta con diligencia. Esto le mostrará de dónde provienen sus consultas de problemas y le permitirá optimizar sus consultas e índices antes de que se conviertan en un problema.
Para ajustes de rendimiento serios, deseará compilar PHP desde la fuente. Instalar desde un paquete instala una gran cantidad de bibliotecas que nunca puede usar. Dado que los entornos PHP se cargan en cada instancia de un subproceso de Apache, incluso una sobrecarga de memoria de 5 MB de bibliotecas adicionales se convierte rápidamente en 250 MB de memoria perdida cuando hay 50 subprocesos de Apache en existencia. Mantengo una lista de mi línea ./configura estándar que uso al compilar PHP here , y encuentro que se adapta a la mayoría de mis aplicaciones. La desventaja es que si terminas necesitando una biblioteca, tienes que recompilar PHP para obtenerla. Analice su código y pruébelo en un entorno de desarrollo para asegurarse de que tiene todo lo que necesita.
Minimice su Javascript.
Prepárese para mover contenido estático, como imágenes y videos, a un servidor web no dinámico. Escriba su código para que cualquier URL para imágenes y videos se configure fácilmente para apuntar a otro servidor en el futuro. Un servidor web optimizado para contenido estático puede servir fácilmente decenas o incluso cientos de veces más rápido que un servidor de contenido dinámico.
Eso es lo que puedo pensar en la cabeza. Buscar en Google para las mejores prácticas de PHP encontrará muchos consejos sobre cómo escribir más rápido / mejor código también (por ejemplo: echo
es más rápido que print
).
En primer lugar, darse cuenta de que el rendimiento es un proceso iterativo. No crea una aplicación web en una sola pasada, la inicia y nunca vuelve a trabajar en ella. Por el contrario, comienza poco a poco y aborda los problemas de rendimiento a medida que crece su sitio.
Ahora, en detalles:
- Perfil. Identifique sus cuellos de botella. Éste es el paso más importante. Necesita enfocar su esfuerzo donde obtendrá los mejores resultados. Debe tener instalado algún tipo de solución de monitoreo (como cactus o munin), que le brinde visibilidad de lo que sucede en sus servidores.
- Caché, caché, caché. Probablemente encontrará que el acceso a la base de datos es su mayor cuello de botella en el back-end, pero debe verificarlo por su cuenta. Afortunadamente, probablemente encontrará que gran parte de su tráfico es para un pequeño conjunto de recursos. Puede almacenar esos recursos en caché en algo como memcached, ahorrándose el acierto de la base de datos y resultando en un mejor rendimiento del servidor.
- Como otros han mencionado anteriormente, eche un vistazo a las reglas de rendimiento de YDN. Considere la posibilidad de recoger el libro que lo acompaña . Esto te ayudará con el rendimiento de front-end.
- Instale PHP APC y asegúrese de que esté configurado con suficiente memoria para contener todo el código de bytes de PHP compilado. Recientemente descubrimos que nuestra instalación de APC no tenía suficiente ram; dándole suficiente para trabajar en reducir nuestro tiempo de CPU a la mitad, y la actividad del disco en un 10%
- Asegúrese de que las tablas de su base de datos estén correctamente indexadas. Esto va de la mano con la supervisión del registro de consultas lentas.
Lo anterior te llevará muy lejos. Es decir, incluso un sitio bastante pesado como base de datos debería ser capaz de sobrevivir a una página de inicio en un solo servidor con una modesta especificación si ha hecho lo anterior.
Eventualmente llegará a un punto donde la configuración de Apache predeterminada no siempre podrá mantenerse al día con las solicitudes entrantes. Cuando golpeas este muro, hay dos cosas que hacer:
- Como arriba, perfil. Supervise su actividad de apache: debe tener una idea de cuántas conexiones están activas en un momento dado, además del número máximo de conexiones activas cuando recibe ráfagas repentinas de tráfico
- Configurar apache con esto en mente. Esta es la mejor guía de configuración apache que he visto: Práctico mod_perl capítulo 11
- Saca tanta carga de apache como puedas. Apache es demasiado resistente para servir contenido estático de manera eficiente. Debería usar un proxy inverso más ligero (como el calamar) o un servidor web (lighttpd o nginx) para servir contenido estático, y asumir el trabajo de bytes de alimentación de cuchara para ralentizar a los clientes. Esto deja a Apache para hacer lo que mejor hace: ejecutar su código. Una vez más, el libro mod_perl hace un buen trabajo explicando esto .
Una vez que haya llegado hasta aquí, es en gran parte una cuestión de almacenar más caché y vigilar su base de datos. Eventualmente, superará un solo servidor. Primero, probablemente agregará más cajas front-end, todas respaldadas por un único servidor de base de datos. Entonces tendrás que comenzar a repartir la carga de tu base de datos, probablemente por fragmentación. Para una excelente visión general de este proceso de crecimiento, vea esta presentación en vivo
Para una visión más profunda de gran parte de lo anterior, visite la sección Construyendo sitios web escalables , por Cal Henderson, de la fama de Flickr. Google tiene partes del libro disponibles para vista previa
He usado MysqlTuner para el análisis de rendimiento en mis servidores mysql y me ha dado una buena idea de los problemas adicionales para la búsqueda de Google, así como para hacer sus propias recomendaciones.
No olvide el hecho de que sus usuarios estarán a miles de millas de distancia de su servidor y que descargarán docenas de archivos para representar una sola página. Esa latencia y la sobrecarga de representación de la página en sus navegadores puede ser mayor que la cantidad de tiempo que dedica a recopilar la información y a generar la página.
Vea las páginas en Yahoo Developer Network sobre Mejores prácticas para acelerar su sitio web y la herramienta YSlow para ver qué parte de la descarga del sitio lleva su tiempo.
Recomiendo comenzar con http://highscalability.com/
En cuanto a tus sugerencias:
Compresión para imágenes, definitivamente no. Tipo de ajuste de sistema de archivos, sí, eso podría tener algún efecto, pero mínimo. Pero en realidad lo mejor es usar proxy inverso en memoria, o incluso mejor CDN.
Para Apache básicamente solo cargarás los módulos que necesites. No cargues nada más. Al igual que con PHP, solo puede usar forking MPM, es importante mantenerlo delgado. En cuanto a la configuración óptima, debe ajustarlos a una aplicación específica, hardware, etc. Si tiene suficiente CPU, es recomendable que utilice mod_deflate. Cuanto más rápido el servidor puede enviar datos al cliente, más rápido puede comenzar a procesar la próxima solicitud.
Recomiendo usar Jet Profiler para MySQL para encontrar cualquier consulta incorrecta. Lo he utilizado con éxito en un par de mis sitios. Realmente útil, y mucho más fácil de digerir que el lento registro de consultas.
Un recurso que le puede resultar útil es el conjunto de reglas de rendimiento de YDN .