Estoy ajustando mi página de inicio para el rendimiento, actualmente maneja alrededor de 200 solicitudes / segundo en 3.14.by que come 6 consultas SQL, y 20 req / segundo en 3.14.by/forum que es el foro phpBB.
Por extraño que parezca, los números son casi iguales en algunos VPS y servidores Atom 330 dedicados.
El software del servidor es el siguiente: Apache2 + mod_php prefork 4 childs (probamos diferentes números aquí), php5, APC, nginx, memcached para el almacenamiento de sesiones PHP.
MySQL está configurado para consumir aproximadamente el 30% de la RAM disponible (~ 150Mb en VPS, 700Mb en un servidor dedicado)
Parece que hay un cuello de botella en algún lugar que no me permite ir más alto, ¿alguna sugerencia? (es decir, sé que hacer menos de 6 SQL lo haría más rápido, pero esto no parece ser un factor limitante, ya que sqld no come más que unos pocos% en la parte superior debido a consultas en caché)
¿Alguien ha probado que patear apache2 preformado y dejar solo nginx + php es mucho más rápido?
Algunos puntos de referencia más
Small 40-byte static file: 1484 r/s via nginx+apache2, 2452 if we talk to apache2 directly.
Small "Hello world" php script: 458 r/s via ngin+apache2.
Actualización: Parece que el cuello de botella es el rendimiento de MySQL en los datos en caché. La página con SQL único muestra 354req / sec, con 6 SQL's - 180 req / sec ¿Qué crees que puedo modificar aquí? (Puedo desembolsar 100-200Mb para MySQL)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
default-character-set=cp1251
collation-server=cp1251_general_cs
skip-character-set-client-handshake
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 16M
max_allowed_packet = 8M
thread_stack = 64K
thread_cache_size = 16
sort_buffer_size = 8M
read_buffer_size = 1M
myisam-recover = BACKUP
max_connections = 650
table_cache = 256
thread_concurrency = 10
query_cache_limit = 1M
query_cache_size = 16M
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 8M
[mysql]
[isamchk]
key_buffer = 8M
!includedir /etc/mysql/conf.d/
fuente
Respuestas:
Obviamente, hay muchas cosas que puedes probar. Su mejor opción es perseguir sus registros en busca de consultas que no usen índices (habilitar registros para esos) y otras consultas no optimizadas. He compilado una gran lista de opciones relacionadas con el rendimiento a lo largo de los años, por lo que he incluido un pequeño subconjunto aquí para su información, espero que ayude. Aquí hay algunas notas generales sobre cosas que puede probar (si aún no lo ha hecho):
MySQL
apache
PHP
Ajustes del sistema operativo
fuente
Si el cuello de botella no es CPU, entonces es IO, ya sea red o disco. Entonces ... necesitas ver cuánto está pasando IO. No hubiera pensado que es la red (a menos que esté en un enlace half-duplex de 10 Mbps, pero vale la pena verificar el interruptor en caso de que la detección automática no esté haciendo su trabajo correctamente).
Eso deja el disco IO, que puede ser un factor importante, especialmente en los VPS. Use sar o iostat para echar un vistazo a los discos, luego busque en Google cómo encontrar más detalles si su disco se está usando mucho.
fuente
Buscaría el almacenamiento en caché con Nginx ( memcached ) o Varnish .
Por lo menos, debe servir archivos estáticos con Nginx como SaveTheRbtz, dijo.
fuente
Como el servidor no parece ser un problema, quizás lo sea el generador de carga. Intenta ejecutarlo en varias máquinas.
fuente
Me parece que podría estar alcanzando la cantidad máxima de conexiones que permite Apache. Eche un vistazo a su configuración de Apache. El aumento del límite del servidor y los clientes máximos debería ayudar si aún no está sujeto a algún otro límite, como E / S o memoria. Mire los valores presentes para mpm_prefork_module o mpm_worker_module y ajústelos de acuerdo a sus necesidades.
fuente
¿Es esta carga generada por una herramienta o cargas del mundo real?
Es posible que desee verificar memcached. He visto problemas con altas tasas de conexión que causan latencia en la aplicación.
Si usa un generador de carga, ¿qué obtiene al golpear una pequeña página estática?
Durante las cargas, es posible que desee comprobar la pila de red para las condiciones TIME_WAIT. Quizás esté completando su cola de conexión.
Hay alrededor de 100 razones más y elementos que puede ver, pero sin más información, solo estoy haciendo conjeturas en este momento.
fuente
El 99% de las veces, problemas como este se remontan a la base de datos. Asegúrate de que tus índices de bateo sean los primeros. Si eso no funciona, comienza a almacenar en caché todo lo que puedas.
fuente
Le recomiendo que use (si es posible) un agrupador de conexiones para mantener la base de datos conectada a sus aplicaciones web (no es necesario volver a conectarse en cada solicitud). Eso puede hacer una gran diferencia de velocidad.
Además, intente analizar todas sus consultas con EXPLAIN (y ¿por qué no perfilar sus consultas con SHOW PROFILE?).
fuente