Tengo un servidor web en un Linode 1024 VPS basado en
- Ubuntu 11.10
- Nginx 1.0.5
- PHP 5.3.6 (con PHP-FPM, APC)
- Barniz 3.0.2
Y un par de blogs allí basados en WordPress 3.3.1. Uno de ellos es un blog simple, con la configuración predeterminada, el tema y solo la publicación "Hello World", para probar el servidor. El otro es un blog clonado desde otro servidor con casi 10k publicaciones y más de 10k comentarios. Este blog tiene alrededor de 5k únicos por día.
El servidor da buenos números en una prueba ab para el blog de prueba , pero la misma prueba con el blog clonado es imposible de hacer: la prueba ab carga demasiado el servidor y tengo que detener el proceso, lo que de todos modos hace que ab muestre Este resultado realmente pobre .
El htop muestra también una carga "normal" cuando está en funcionamiento normal , pero una carga anormalmente grande durante la prueba de ab.
Está sucediendo otra cosa extraña (la más importante para mí): el tiempo hasta el primer byte es extremadamente alto , pero después de eso, el sitio se carga muy rápido. Esto se puede probar fácilmente con servicios como tools.pingdom.com, que proporciona este resultado . Por favor, preste atención a esa región amarilla que significa "tiempo de espera".
¿Por qué está pasando esto? Posibles ideas:
- Mala configuración de PHP-FPM
- El tiempo de respuesta de DNS de Linode es horrible. Tonterías: el blog de prueba resuelve DNS bien, TTFB es fantástico
- Mala configuración de Nginx
En caso de que alguien necesite más información,
- Aquí tiene el archivo de configuración de nginx del blog clonado actual ( /etc/nginx/sites-available/muycomputerpro.com )
- Aquí tienes la configuración actual de my.cnf ( /etc/mysql/my.cnf ) (lo sé, por el momento no almacena en caché, esto no ha hecho una diferencia en TTFB en el pasado)
- Aquí tiene la configuración actual de PHP-FPM ( /etc/php5/fpm/pool.d/www.conf )
if -f
directiva que está utilizando en ellocation
contenedor en la configuración de nginx. Basado en lo que estoy leyendo aquí wiki.nginx.org/Pitfalls , tengo la sensación de que-f
está haciendo una búsqueda ineficiente del archivo que podría causar un problema de Tiempo al primer byte, especialmente si tiene directorios con una gran cantidad de archivos.ab -n 1000 -c 100 -H 'Host: mysite.com' http://127.0.0.1/
Dicho esto, la diferencia en los resultados en caché (barniz) frente a los no almacenados en caché es suficiente para validar la posición de que el problema no está relacionado con la red, dns, etc. y radica en el procesamiento, como se esperaba.Respuestas:
En primer lugar, esta no es una respuesta, sino un enfoque de diagnóstico.
Esto de ninguna manera es exhaustivo, o incluso algo cercano, es solo un punto de partida.
Tiempo hasta el primer byte
El tiempo hasta el primer byte (TTFB) tiene varios componentes:
Cuando mira una salida de ApacheBench, también ve:
Comparaciones para eliminar componentes
Con pocas excepciones, su problema radicará en el procesamiento de back-end, que generalmente se reduce a código demasiado complejo / ineficiente, o MySQL mal configurado.
Una buena manera de abordar este problema es a través de una serie de comparaciones que eliminarán varios aspectos de su configuración. Una buena comparación debe ser lo más constante posible para ayudar a reducir el problema. Actualmente, ha proporcionado las siguientes comparaciones:
La prueba ideal sería duplicar su sitio completo, pero luego eliminar todo el contenido, excepto un artículo y los comentarios asociados. El objetivo de esta prueba sería determinar de manera concluyente si la gran cantidad de contenido es el problema o si otros aspectos de su configuración (plugins de WordPress, tema, etc.) son la causa. Básicamente, compararía el rendimiento de sitios idénticos, en el mismo (nuevo) servidor, cargando la misma página (misma longitud, etc.), con la única diferencia de ser el contenido total del sitio (por ejemplo, existe una buena posibilidad de que algún complemento no funcione). escalar bien con mayor contenido).
Sin cambiar nada, hay algunas otras comparaciones que puede hacer:
Afinando tu Backend
En este punto, ya debería haber encontrado el problema o concluido que se encuentra en su backend. Eso te deja Nginx, PHP o MySQL.
(Debo mencionar aquí, que es siempre útil para saber si su cuello de botella es la CPU, RAM, o E / S - entre
sar
,top
,iostat
,vmstat
,free
., Etc usted debe ser capaz de llegar a una conclusión sobre este tema)Nginx
Nginx solo acepta solicitudes y sirve contenido estático o cambia las solicitudes a PHP-FPM; por lo general, no hay mucho que optimizar con Nginx.
Idealmente, su blog de prueba y su blog clonado tienen configuraciones idénticas, en cuyo caso, efectivamente ha eliminado Nginx como el problema.
Solicitud
En el caso en que intente identificar un problema en su código (por ejemplo, un complemento lento, etc.), los registros lentos son el lugar para comenzar.
MySQL
PHP
PHP-FPM
Vale la pena señalar que los resultados de htop muestran que php-fpm consume la mayor parte de la CPU, y su problema parece estar directamente relacionado con esto.
Almacenamiento en caché
Una vez que haya optimizado cada posible cuello de botella, comience a almacenar en caché.
A veces, dadas las limitaciones de su aplicación y hardware, es posible que no pueda mejorar tanto el rendimiento del backend, sin embargo, ese es el punto del almacenamiento en caché, para minimizar el uso del backend.
Otras lecturas
fuente
memory_limit
, se señaló en otra publicación que no ayuda con el rendimiento.