2009-12-02 24 views
23

Me gustaría saber cómo comparar un sitio de php/mysql.Cómo comparar el sitio de php/mysql

Tenemos una aplicación web casi completa y lista para entrar en funcionamiento, sabemos cuántas personas van a usarla en un tiempo pero no tienen ni idea de cuánto ancho de banda toma el usuario promedio, a cuánto tiempo quemar en la base de datos, etc. Necesitamos determinar los servidores correctos para comprar.

¿Hay algo del lado del servidor Linux que pueda monitorear estas estadísticas por usuario? ¿Entonces podemos tomar esta información y extrapolarla?

Si me estoy equivocando, por favor avíseme, pero creo que esta es una actividad frecuente para las nuevas aplicaciones web.

EDITAR: Pude haber pedido la información incorrecta. Podemos ver cuánto tardan las consultas de la base de datos y cuánto tiempo lleva cargar la página, pero no tenemos idea de qué carga se coloca en el servidor. La pregunta que me hago es si podemos manejar a 100 usuarios a la vez en promedio ... ¿1000? ¿Qué tipo de requisitos del servidor se necesitan para llegar a los usuarios de 1M? Etc.

Gracias por su ayuda.

+1

Lo siento, editado mi pregunta, ya que no creo que esto era clara. – user103219

Respuesta

16

Una herramienta que me parece bastante útil es jmeter que permite (en su aspecto más básico) configurar su navegador para que use el jmeter como proxy, entonces recorre todo su sitio web y registrará todo lo que haga.

Una vez que esté satisfecho de que es una buena prueba de la mayoría de su sitio web, puede guardar la prueba en jmeter y decirle que ejecute la prueba con un número determinado de hilos y una serie de bucles por hilo para simular la carga su página web.

Por ejemplo, puede ejecutar 50 clientes cada uno ejecutando el plan de prueba 10 veces.

Puede rampar los números hacia arriba y hacia abajo para ver el impacto en el rendimiento que tiene en el sitio, grafica el tiempo de respuesta para usted.

Esto le permite ajustar diferentes parámetros, probar diferentes estrategias de almacenamiento en caché y comprobar el impacto en el mundo real de esos cambios.

0

no tengo ninguna experiencia con herramientas de evaluación comparativa, pero en algunos casos puedo crear una simple tabla con los campos id, ipaddress, parsetime, queries. Simplemente inserte una nueva fila cada vez que una página se actualice o se llame (en situaciones ajax). Luego analiza los datos recopilados en una semana/mes/trimestre/año. No es su situación preferida, sino una forma sencilla de obtener estadísticas en poco tiempo.

Algunos resultados en los puntos de referencia de PHP: http://www.google.nl/search?hl=nl&source=hp&q=php+benchmark&meta=&aq=f&oq=

+0

Sí, supongo que estoy buscando algo más "fuera" de la aplicación para rastrear lo que está haciendo. – user103219

+0

He actualizado mi respuesta y proporcioné un enlace, espero que sea algo que lo ayude aún más. – Ben

+0

¿Por qué tener un voto a favor? ¿Podría el que le está dando explicar qué está mal con esta respuesta? – Ben

5

menos que esté utilizando un heavyweight framework or something like that, las consultas de base de datos es probable que sean la parte más lenta de su aplicación.

Lo que hago para supervisar es medir el tiempo de ejecución para cada consulta en mi objeto de abstracción de base de datos. Luego, por cada consulta que tome más de X milisegundos (complete su propia X), escribo una línea en mi archivo de registro de consultas que identifica el archivo de script PHP y el número de línea en el que apareció la consulta (use debug_backtrace() para encontrar esa información) junto con otros datos de contexto relevantes (por ejemplo, identidad del usuario, fecha y hora, etc.).

Este archivo de registro se puede analizar estadísticamente más adelante para obtener más información.

Por ejemplo, puede encontrar cuál de sus consultas está tomando el mayor tiempo total (relevante para la carga del servidor). O cuáles son los más lentos (relevantes para la experiencia del usuario). O qué usuario está cargando más el sistema (posiblemente abuso o robots).

También represento gráficas de Pareto para identificar dónde invertir mejor mis esfuerzos de optimización de consultas.

+0

¡Buena respuesta! ¡Voy a implementar eso para algunos proyectos más grandes en los que estoy trabajando! – Ben

+0

¿Podría explicar brevemente cómo usa un gráfico de Pareto para identificar dónde se gasta mejor el tiempo? – user103219

+0

http://en.wikipedia.org/wiki/Pareto_chart Haga una lista del tiempo de consulta total y promedio para cada una de sus consultas y ordene la lista por una u otra métrica. Trace la tabla como se describe en el enlace de Wikipedia para visualizar cuánto de su tiempo se gasta en las consultas N más lentas y qué consultas son. Comience el trabajo de optimización en la parte superior de la lista. –

2

Lo más importante es definir qué quiere que sea el rendimiento: puede siempre buscar áreas para optimizar. Sin embargo, mejorar el tiempo de respuesta de 750 ms a 650 ms puede no valer la pena.

Como dijo fsb, sus cuellos de botella probablemente serán sus consultas de base de datos. Sin embargo, también estipularía que sus cuellos de botella no son siempre (o incluso probable) donde cree que están. Sugeriría leer this primero, y hacer una prueba global de su sitio.

Si es su aplicación, use xdebug para perfilar su código PHP. Luego use WinCacheGrind o KCacheGrind para analizar la salida. Esto puede sorprenderte

Para abordar los problemas de la base de datos, es bastante específico de la base de datos. Para MySQL, enciendo el registro lento de consultas, las consultas de registro que no usan índices, habilito el registro de consultas y uso de kits de herramientas como Maatkit para analizar las consultas y encontrar los cuellos de botella.

8

herramienta ApacheBench (ab, por lo general una parte del paquete de servidor web Apache) para pruebas de estrés Puede utilizar (1k peticiones con 10 clientes = ab -c -n 10 http://url 1000) de la escritura, que sospecha que podría ser lo suficientemente lento Le mostrará la distribución de los tiempos de respuesta (en 90% de los casos solicitados procesados ​​en menos de 200 ms).

Que también puede tomar SQL-consultas ejecutadas por ese script en particular y hacer "explicar el plan" para que tengan una idea aproximada de cómo se degradará cuando habrá 10-100-10mln más registros en las tablas.

Con respecto a cuántos usuarios puede servir, puede usar su navegador favorito y emular una visita de usuario típica, tomar el archivo access_log y sumar bytes enviados (uno de los últimos números en la línea de registro). Por ejemplo, era 5 kb de texto/html + 50 kb png/jpg/etc. = 55 kb por visita de usuario. Además de los encabezados/etc, digamos 60kb por visita * 1m = 60gb de tráfico por día. ¿Su ancho de banda es suficiente para eso? (60 gb/86.4ksec = 700kb/seg).

1

Recientemente he desarrollado un componente de PHP para probar fácilmente y crear un informe, para su prueba de referencia. También publiqué un artículo sobre la importancia de las pruebas comparativas, que indico la importancia de las pruebas debido a la tensión que las pruebas no pueden causar en su servidor web. Las pruebas de referencia son extremadamente importantes, pero creo que hoy en día la gente tiende a olvidar eso, cuando en realidad debería estar en la parte superior de la lista de verificación. Comprobación de errores, comprobación de seguridad, luego pruebas de referencia.

En ese orden.

http://www.binpress.com/app/benchmark-testing-framework/534?ad=1229 - El marco que he desarrollado http://www.binpress.com/blog/2011/08/04/the-important-of-benchmark-testing/?ad=1229 - El artículo que escribí

0

Prueba esto:

<?php 
/** 
* Created by PhpStorm. 
* User: NEO 
* Date: 9/18/2016 
* Time: 10:57 AM 
*/ 

/** 
* PHP Script to benchmark PHP and MySQL-Server 
* 
* inspired by/thanks to: 
* - www.php-benchmark-script.com (Alessandro Torrisi) 
* - www.webdesign-informatik.de 
* 
* @author odan 
* @license MIT 
*/ 
// ----------------------------------------------------------------------------- 
// Setup 
// ----------------------------------------------------------------------------- 
set_time_limit(120); // 2 minutes 
$options = array(); 
// Optional: mysql performance test 
$options['db.host'] = '127.0.0.1'; 
$options['db.user'] = 'root'; 
$options['db.pw'] = ''; 
$options['db.name'] = 'bache3'; 
// ----------------------------------------------------------------------------- 
// Main 
// ----------------------------------------------------------------------------- 
// check performance 
$benchmarkResult = test_benchmark($options); 
// html output 
echo "<!DOCTYPE html>\n<html><head>\n"; 
echo "<style> 
    table { 
     color: #333; /* Lighten up font color */ 
     font-family: Helvetica, Arial, sans-serif; /* Nicer font */ 
     width: 640px; 
     border-collapse: 
     collapse; border-spacing: 0; 
    } 
    td, th { 
     border: 1px solid #CCC; height: 30px; 
    } /* Make cells a bit taller */ 
    th { 
     background: #F3F3F3; /* Light grey background */ 
     font-weight: bold; /* Make sure they're bold */ 
    } 
    td { 
     background: #FAFAFA; /* Lighter grey background */ 
    } 
    </style> 
    </head> 
    <body>"; 
echo array_to_html($benchmarkResult); 
echo "\n</body></html>"; 
exit; 
// ----------------------------------------------------------------------------- 
// Benchmark functions 
// ----------------------------------------------------------------------------- 
function test_benchmark($settings) 
{ 
    $timeStart = microtime(true); 
    $result = array(); 
    $result['version'] = '1.1'; 
    $result['sysinfo']['time'] = date("Y-m-d H:i:s"); 
    $result['sysinfo']['php_version'] = PHP_VERSION; 
    $result['sysinfo']['platform'] = PHP_OS; 
    $result['sysinfo']['server_name'] = $_SERVER['SERVER_NAME']; 
    $result['sysinfo']['server_addr'] = $_SERVER['SERVER_ADDR']; 
    test_math($result); 
    test_string($result); 
    test_loops($result); 
    test_ifelse($result); 
    if (isset($settings['db.host'])) { 
     test_mysql($result, $settings); 
    } 
    $result['total'] = timer_diff($timeStart); 
    return $result; 
} 
function test_math(&$result, $count = 99999) 
{ 
    $timeStart = microtime(true); 
    $mathFunctions = array("abs", "acos", "asin", "atan", "bindec", "floor", "exp", "sin", "tan", "pi", "is_finite", "is_nan", "sqrt"); 
    for ($i = 0; $i < $count; $i++) { 
     foreach ($mathFunctions as $function) { 
      call_user_func_array($function, array($i)); 
     } 
    } 
    $result['benchmark']['math'] = timer_diff($timeStart); 
} 
function test_string(&$result, $count = 99999) 
{ 
    $timeStart = microtime(true); 
    $stringFunctions = array("addslashes", "chunk_split", "metaphone", "strip_tags", "md5", "sha1", "strtoupper", "strtolower", "strrev", "strlen", "soundex", "ord"); 
    $string = 'the quick brown fox jumps over the lazy dog'; 
    for ($i = 0; $i < $count; $i++) { 
     foreach ($stringFunctions as $function) { 
      call_user_func_array($function, array($string)); 
     } 
    } 
    $result['benchmark']['string'] = timer_diff($timeStart); 
} 
function test_loops(&$result, $count = 999999) 
{ 
    $timeStart = microtime(true); 
    for ($i = 0; $i < $count; ++$i) { 
    } 
    $i = 0; 
    while ($i < $count) { 
     ++$i; 
    } 
    $result['benchmark']['loops'] = timer_diff($timeStart); 
} 
function test_ifelse(&$result, $count = 999999) 
{ 
    $timeStart = microtime(true); 
    for ($i = 0; $i < $count; $i++) { 
     if ($i == -1) { 
     } elseif ($i == -2) { 
     } else if ($i == -3) { 
     } 
    } 
    $result['benchmark']['ifelse'] = timer_diff($timeStart); 
} 
function test_mysql(&$result, $settings) 
{ 
    $timeStart = microtime(true); 
    $link = mysqli_connect($settings['db.host'], $settings['db.user'], $settings['db.pw']); 
    $result['benchmark']['mysql']['connect'] = timer_diff($timeStart); 
    //$arr_return['sysinfo']['mysql_version'] = ''; 
    mysqli_select_db($link, $settings['db.name']); 
    $result['benchmark']['mysql']['select_db'] = timer_diff($timeStart); 
    $dbResult = mysqli_query($link, 'SELECT VERSION() as version;'); 
    $arr_row = mysqli_fetch_array($dbResult); 
    $result['sysinfo']['mysql_version'] = $arr_row['version']; 
    $result['benchmark']['mysql']['query_version'] = timer_diff($timeStart); 
    $query = "SELECT BENCHMARK(1000000,ENCODE('hello',RAND()));"; 
    $dbResult = mysqli_query($link, $query); 
    $result['benchmark']['mysql']['query_benchmark'] = timer_diff($timeStart); 
    mysqli_close($link); 
    $result['benchmark']['mysql']['total'] = timer_diff($timeStart); 
    return $result; 
} 
function timer_diff($timeStart) 
{ 
    return number_format(microtime(true) - $timeStart, 3); 
} 
function array_to_html($array) 
{ 
    $result = ''; 
    if (is_array($array)) { 
     $result .= '<table>'; 
     foreach ($array as $k => $v) { 
      $result .= "\n<tr><td>"; 
      $result .= '<strong>' . htmlentities($k) . "</strong></td><td>"; 
      $result .= array_to_html($v); 
      $result .= "</td></tr>"; 
     } 
     $result .= "\n</table>"; 
    } else { 
     $result = htmlentities($array); 
    } 
    return $result; 
}