Domanda

Vorrei sapere come punto di riferimento un / mysql sito php.

Abbiamo una web app quasi completato e pronto per andare a vivere, sappiamo quante persone stanno per essere utilizzato in un tempo di anni, ma non hanno assolutamente idea di quanta banda l'utente medio prende, per quanto tempo si bruciano sul database, ecc Abbiamo bisogno di determinare i server corretti per l'acquisto.

C'è qualcosa server Linux lato in grado di monitorare queste statistiche per utente? In modo da poter poi prendere questi dati ed estrapolare esso?

Se io vado su questo completamente sbagliato per favore fatemelo sapere, ma credo che questa è un'attività frequente per nuove applicazioni web.

EDIT: forse ho chiesto per le informazioni errate. Possiamo vedere quanto tempo le query di database assumere e per quanto tempo ci vuole per caricare la pagina, ma non hanno idea di ciò che il carico viene immesso sul server. La domanda che mi sto chiedendo è: possiamo gestire 100 utenti contemporaneamente, in media ... 1000? Che tipo di requisiti del server sono necessari per colpire gli utenti 1M. Ecc.

Grazie per il vostro aiuto.

È stato utile?

Soluzione

Uno strumento che trovo abbastanza utile è jmeter che permette (al suo più fondamentale) di impostare il browser per utilizzare JMeter come proxy allora si può passeggiare in tutto il tuo sito e registrerà tutto quello che fai.

Una volta che siete felici che si tratta di una prova decente di più del tuo sito web è possibile salvare il test in jmeter e dirgli di eseguire il test con un determinato numero di thread e un certo numero di cicli per thread per simulare il carico sul vostro sito web.

Per esempio è possibile eseguire 50 clienti ogni esecuzione del testplan 10 volte.

È possibile quindi rampa i numeri su e giù per vedere l'impatto sulle prestazioni che ha sul sito, che rappresenta graficamente il tempo di risposta per voi.

In questo modo ci si sintonizza diversi parametri, provare diverse strategie di caching e verificare il reale impatto di questi cambiamenti mondo.

Altri suggerimenti

È possibile utilizzare ApacheBench strumento (ab, di solito una parte del pacchetto di web-server apache) per lo stress-testing (1K richieste con 10 client = ab -c 10 -n 1000 http: // URL ) dello script, che si sospetta potrebbe essere abbastanza lento. Vi mostrerà la distribuzione dei tempi di risposta (nel 90% dei casi trattati richiesta in meno di 200 msec).

Che è anche possibile afferrare SQL-query eseguite da quel particolare script e fare "spiegano piano" per loro di ottenere una vaga idea di come sarà lo degrada quando ci saranno momenti 10-100-10mln più record nelle tabelle.

Per quanto riguarda il numero di utenti può che servire - è possibile utilizzare il vostro browser preferito e di emulare una visita tipico utente, prendere il file access_log e somma inviati byte (uno degli ultimi numeri in linea di registro). Per esempio è stato il testo 5kb / html + 50kb png / jpg / ecc = 55kb per visita dell'utente. Inoltre intestazioni / etc diciamo 60kb per visita * traffico 1m = 60gb al giorno. È la larghezza di banda sufficiente per questo? (60GB / 86.4ksec = 700KB / sec).

Se non si utilizza un quadro pesante o qualcosa di simile , le query DB sono probabili per essere la parte più lenta della vostra applicazione.

Quello che faccio per il monitoraggio è la misura del tempo di esecuzione per ogni query nel mio oggetto DB astrazione. Poi, per ogni query che richiede più tempo di millisecondi X (inserire la tua X), scrivo una riga al mio file di log delle query che identifica il file di script PHP e numero di linea su cui è apparsa la query (uso debug_backtrace() di scoprire che le informazioni) insieme ad altri dati di contesto rilevanti (ad esempio l'identità dell'utente, data e ora, ecc.).

Questo file di registro può essere analizzato statisticamente più tardi per varie informazioni.

Ad esempio, è possibile trovare quale delle vostre domande stanno prendendo il maggior tempo totale (rilevante per il carico del server). O che sono il più lento (rilevante per l'esperienza degli utenti). O quale utente sta caricando il sistema più (possibilmente abuso o robot).

Ho anche tracciare diagrammi di Pareto per identificare dove migliore per spendere i miei sforzi di ottimizzazione delle query.

La maggior parte importanly, è necessario definire ciò che si desidera che la prestazione sia: è possibile sempre trovare aree per ottimizzare. Tuttavia, migliorando i tempi di risposta da 750ms a 650ms non può valere il tempo.

Come ha detto fsb, i vostri colli di bottiglia sarà probabilmente le query di database. Tuttavia, vorrei anche stipulare che i colli di bottiglia non sono sempre (o addirittura probabile) in cui si pensa che sono. Vorrei suggerire la lettura di questo prima, e fare un test globale del tuo sito.

Se è la vostra applicazione, utilizzare xdebug al profilo il codice PHP. Quindi utilizzare WinCacheGrind o KCachegrind per analizzare l'output. Questo potrebbe sorprendervi.

Per risolvere i problemi di database, è abbastanza specifico database. Per MySQL, accendo il log delle query lente, accedere query che non utilizzano gli indici, attivare la registrazione query e utilizzare toolkit come Maatkit per analizzare le query e trovare i colli di bottiglia.

Recentemente ho sviluppato un componente PHP per testare facilmente, e costruire un rapporto, per il test benchmark. Ho anche pubblicato un articolo circa l'importanza del test di benchmark, che indico l'importanza del test a causa del ceppo non prova può causare sul vostro server web. test di benchmark è estremamente importante, ma credo che in questo giorno di età e le persone tendono a dimenticare che, quando in realtà dovrebbe essere in cima alla lista di controllo. controllo Bug, verifiche di sicurezza, quindi il test di riferimento.

In questo ordine.

http://www.binpress.com/app/ punto di riferimento-test-framework / 534 annuncio = 1229 -? Il quadro che ho sviluppato http: // www. binpress.com/blog/2011/08/04/the-important-of-benchmark-testing/?ad=1229 - L'articolo che ho scritto

Non ho alcuna esperienza con strumenti di benchmarking ma in alcuni casi ho creare una semplice tabella con i campi id, ipaddress, parsetime, queries. Basta inserire una nuova riga ogni volta che una pagina viene aggiornata o viene chiamato (in situazioni di Ajax). Poi analizzare i dati raccolti in una settimana / mese / trimestre / anno. La sua non è la vostra situazione preferita, ma un modo semplice per ottenere alcune statistiche a breve termine.

Alcuni risultati sui parametri di riferimento PHP: http://www.google.nl/search ? hl = nl & source = HP & q = php + punto di riferimento e meta = & aq = f & oq =

Prova questo:

<?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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top