Pergunta

Gostaria de saber como referência um php / mysql site.

Temos uma aplicação web quase concluído e pronto para ir ao vivo, sabemos quantas pessoas vão usá-lo em um anos, mas não tem absolutamente nenhuma idéia de quanto largura de banda do usuário médio leva, a quanto tempo eles queimam -se no banco de dados etc. precisamos determinar os servidores corretos para compra.

Existe linux lado do servidor algo que pode monitorar essas estatísticas por usuário? Para que possamos, em seguida, levar esses dados e extrapolar isso?

Se eu vou sobre isso completamente errado por favor me avise, mas acredito que esta é uma atividade frequente para novos aplicativos da web.

EDIT: I pode ter pedido para a informação incorreta. Podemos ver quanto tempo as consultas de banco de dados tomar e quanto tempo leva para carregar a página, mas não têm idéia do que carga é colocada no servidor. A pergunta que eu estou pedindo é que podemos lidar com 100 usuários de uma só vez, em média ... 1000? Que tipo de requisitos de servidor são necessários para atingir usuários 1M. Etc.

Obrigado por sua ajuda.

Foi útil?

Solução

Uma ferramenta que eu acho bastante útil é jmeter que permite que (pelo que é mais básico) você configurar seu navegador para uso jmeter como um proxy, em seguida, você vagueia em todo o seu site e ele irá gravar tudo que você faz.

Uma vez que você está feliz que é um teste decente de mais de seu site, então você pode salvar o teste na jmeter e diga a ele para executar o teste com um determinado número de tópicos e uma série de loops por thread para carga simular no seu website.

Por exemplo, você pode executar 50 clientes cada um executando o testplan 10 vezes.

Você pode então rampa os números para cima e para baixo para ver o impacto no desempenho que tem sobre o site, ele representa graficamente o tempo de resposta para você.

Isso permite que você ajustar parâmetros diferentes, experimentar diferentes estratégias de cache e verificar o impacto do mundo real dessas alterações.

Outras dicas

Você pode usar ApacheBench ferramenta (ab, geralmente uma parte do apache pacote de web-server) para (1k pedidos com 10 clientes = ab -c 10 -n 1000 http: // url ) do roteiro, que você suspeitar que poderia ser suficiente lento. Ela vai mostrar a distribuição de tempos de resposta (em 90% dos casos pedido processado em menos de 200 ms).

Do que você também pode pegar SQL-consultas executadas por esse script em particular e fazer "explicar plano" para eles para ter uma idéia como ele irá degradar quando haverá 10-100-10mln vezes mais registros em tabelas.

Em relação quantos usuários ele pode servir - você pode usar seu navegador favorito e imitar uma visita usuário típico, tomar arquivo access_log e soma enviada bytes (um dos últimos números na linha de log). Por exemplo, era 5kb text / html + 50kb png / jpg / etc = 55kb por visita do usuário. Além disso cabeçalhos / etc digamos 60kb por visita * 1m = 60GB de tráfego por dia. É a sua largura de banda suficientemente bom para isso? (60 GB / 86.4ksec = 700kb / seg).

A menos que você estiver usando uma href="http://talks.php.net/show/froscon08/" quadro pesado ou algo parecido , as consultas de banco de dados são susceptíveis para ser a parte mais lenta do seu aplicativo.

O que eu faço para o monitoramento é tempo de execução medida para cada consulta no meu objeto de abstração DB. Então, para cada consulta que demora mais do que milissegundos X (preencha seu próprio X), eu escrevo uma linha para o meu arquivo de log consulta que identifica o arquivo de script PHP e número da linha em que a consulta apareceu (uso debug_backtrace() para encontrar essa informação) em conjunto com outros dados de contexto relevante (por exemplo, identidade do utilizador, data-hora, etc.).

Este arquivo de log podem ser analisados ??estatisticamente mais tarde para várias informações.

Por exemplo, você pode descobrir qual de suas consultas estão tomando o maior tempo total (relevantes para a carga do servidor). Ou que sejam o mais lento (relevante para a experiência do usuário). Ou o usuário que está a carregar o sistema mais (possivelmente abuso ou robôs).

Eu também traçar gráficos de Pareto para identificar onde melhor para passar os meus esforços de otimização de consulta.

A maioria importanly, você precisa definir o que você quer que o desempenho seja: você pode sempre encontrar áreas para otimizar. No entanto, melhorar o tempo de resposta de 750ms a 650ms pode não valer a pena o tempo.

Como FSB disse, seus gargalos será, provavelmente, suas consultas de banco de dados. No entanto, eu também estipulam que os seus gargalos nem sempre (ou até mesmo provável) são onde você pensa que são. Gostaria de sugerir a leitura este primeiro lugar, e fazer um teste mundial do seu site.

Se for a sua aplicação, o uso xdebug ao perfil seu código PHP. Em seguida, use WinCacheGrind ou kcachegrind para analisar a saída. Isto pode surpreendê-lo.

Para questões do banco de dados de endereços, ele é específico do banco de dados bonita. Para o MySQL, ligo log de consultas lentas, as consultas de log não usar índices, permitir consulta de log, e usar kits de ferramentas como Maatkit para analisar as consultas e encontrar os gargalos.

Eu já desenvolveu recentemente um componente PHP facilmente testar e construir um relatório, para o seu teste de benchmark. Eu também publicou um artigo sobre a importância dos testes de benchmark, que indicam a importância dos testes devido à tensão não testar pode causar no seu servidor web. testes de benchmark é extremamente importante, mas acho que neste dia e idade as pessoas tendem a esquecer que, quando na realidade deveria estar no topo da lista de verificação. verificação Bug, verificação de segurança, em seguida, testes de benchmark.

Em que ordem.

http://www.binpress.com/app/ ? benchmark testes-estrutura / 534 ad = 1,229 - O quadro que eu desenvolvi http: // www. binpress.com/blog/2011/08/04/the-important-of-benchmark-testing/?ad=1229 - O artigo que eu escrevi

Eu não tenho nenhuma experiência com ferramentas de benchmarking, mas em alguns casos, criar uma tabela simples com os campos id, ipaddress, parsetime, queries. Basta inserir uma nova linha de cada vez que uma página é atualizada ou é chamado (em Ajax situações). Em seguida, analisar os dados coletados em uma semana / mês / trimestre / ano. A sua não é a sua situação preferido, mas uma maneira simples de obter algumas estatísticas em curto prazo.

Alguns resultados em benchmarks PHP: http://www.google.nl/search ? hl = nl & source = hp & q = php + referência & meta = & aq = f & oq =

Tente isto:

<?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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top