Подтвердить что ты не робот

Как оценивать сайт php/mysql

Я хотел бы знать, как тестировать сайт php/mysql.

У нас есть веб-приложение, почти завершенное и готовое к работе вживую, мы знаем, сколько людей будет использовать его через много лет, но не имеют абсолютно никакой идеи о том, сколько полосе пропускает средний пользователь, сколько времени они сжигают в базе данных и т.д. Нам нужно определить правильные серверы для покупки.

Есть ли что-то серверное Linux-приложение, которое может контролировать эти статистики для каждого пользователя? Чтобы мы могли взять эти данные и экстраполировать их?

Если я полностью ошибаюсь, сообщите мне, но я считаю, что это частая деятельность для новых веб-приложений.

EDIT: Возможно, я попросил неверную информацию. Мы можем видеть, как долго выполняются запросы к базе данных и сколько времени требуется для загрузки страницы, но они не имеют представления о том, какая загрузка размещена на сервере. Вопрос, который я задаю, - мы можем обрабатывать 100 пользователей одновременно в среднем... 1000? Какие требования к серверу необходимы, чтобы поразить пользователей 1M. Etc.

Спасибо за вашу помощь.

4b9b3361

Ответ 1

Инструмент, который я считаю довольно полезным, jmeter, который позволяет (при этом наиболее простой) настроить браузер на использование jmeter as прокси, тогда вы блуждаете по всему веб-сайту и записываете все, что вы делаете.

Как только вы счастливы, что это достойный тест на большинстве ваших веб-сайтов, вы можете сохранить тест в jmeter и сообщить ему, чтобы он запускал ваш тест с заданным количеством потоков и количеством циклов в потоке, чтобы имитировать нагрузку на ваш сайт.

Например, вы можете запускать 50 клиентов, каждый из которых запускает тестовый план 10 раз.

Затем вы можете развернуть номера вверх и вниз, чтобы увидеть влияние производительности на сайте, оно отображает время отклика для вас.

Это позволяет вам настраивать различные параметры, пробовать различные стратегии кэширования и проверять влияние этих изменений на реальный мир.

Ответ 2

Вы можете использовать инструмент ApacheBench (ab, обычно часть пакета веб-сервера Apache) для стресс-тестирования (1k запросов с 10 клиентами = ab -c 10 -n 1000 http://url) script, который, как вы подозреваете, может быть достаточно медленным. Он покажет вам распределение времени отклика (в 90% случаев запрос обрабатывается менее чем за 200 мсек).

Чем вы также можете захватить SQL-запросы, выполненные этим конкретным script, и сделать "объяснение плана", чтобы они могли получить приблизительное представление о том, как это будет ухудшаться, если в таблицах будет 10-100-10 миллионов раз больше записей.

Относительно того, сколько пользователей оно может обслуживать - вы можете использовать свой любимый браузер и эмулировать типичный пользовательский визит, взять файл access_log и суммировать отправленные байты (одно из последних номеров в строке журнала). Например, это 5kb text/html + 50kb png/jpg/etc. = 55kb за посещение пользователя. Плюс заголовки /etc позволяют сказать 60kb за посещение * 1m = 60gb трафика в день. Ваша пропускная способность достаточно хороша для этого? (60GB/86.4ksec = 700kb/сек).

Ответ 3

Если вы не используете тяжелую фрейму или что-то в этом роде, запросы БД, вероятно, будут самой медленной частью вашего приложения.

То, что я делаю для мониторинга, - это время выполнения измерений для каждого запроса в моем объекте абстракции БД. Затем для каждого запроса, который занимает больше времени, чем X миллисекунд (заполнить свой собственный X), я пишу строку в файл журнала запросов, который идентифицирует файл и номер строки PHP, на котором появился запрос (используйте debug_backtrace() to найти эту информацию) вместе с другими соответствующими данными контекста (например, идентификатор пользователя, дата-время и т.д.).

Этот файл журнала может быть статистически проанализирован позже для различной информации.

Например, вы можете найти, какие из ваших запросов занимают наибольшее общее время (относящееся к загрузке сервера). Или которые являются самыми медленными (применительно к пользовательскому опыту). Или какой пользователь загружает систему больше (возможно, злоупотребление или роботы).

Я также рисую диаграммы Парето, чтобы определить, где лучше всего тратить усилия на оптимизацию запросов.

Ответ 4

В наибольшей степени вам необходимо определить, какова должна быть производительность: вы всегда можете найти области для оптимизации. Тем не менее, улучшение времени отклика с 750 мс до 650 мс может не стоить того времени.

Как указано в fsb, ваши узкие места, вероятно, будут вашими запросами в базе данных. Тем не менее, я бы также указал, что ваши узкие места не всегда (или даже вероятны), где вы думаете. Я бы предложил сначала прочитать этот, и сделать глобальный тест вашего сайта.

Если это ваше приложение, используйте xdebug для профилирования вашего PHP-кода. Затем используйте WinCacheGrind или KCacheGrind для анализа вывода. Это может вас удивить.

Чтобы устранить проблемы с базой данных, это довольно специфичная база данных. Для MySQL я включаю журнал медленных запросов, запросы журналов, не использующие индексы, включаю ведение журнала запросов и использую инструментальные средства, такие как Maatkit, для анализа запросов и поиска узких мест.

Ответ 5

Недавно я разработал компонент PHP, который легко тестировал и создавал отчет для тестового теста. Я также опубликовал статью о важности тестового тестирования, которое я указываю на важность тестирования из-за отсутствия напряжения, которое может вызвать на вашем веб-сервере. Тестирование бенчмарков чрезвычайно важно, но я думаю, что в наши дни люди склонны забывать об этом, когда на самом деле это должно быть в верхней части контрольного списка. Проверка ошибок, проверка безопасности, а затем тестирование тестов.

В этом порядке.

http://www.binpress.com/app/benchmark-testing-framework/534?ad=1229 - Рамки, которые я разработал http://www.binpress.com/blog/2011/08/04/the-important-of-benchmark-testing/?ad=1229 - статья, которую я написал

Ответ 6

У меня нет опыта работы с инструментами бенчмаркинга, но в некоторых случаях я создаю простую таблицу с полями id, ipaddress, parsetime, queries. Просто вставляйте новую строку каждый раз, когда страница обновляется или вызывается (в ситуациях ajax). Затем проанализируйте данные, собранные в неделю/месяц/квартал/год. Это не ваша предпочтительная ситуация, а простой способ получить некоторую статистику в короткие сроки.

Некоторые результаты тестов PHP: http://www.google.nl/search?hl=nl&source=hp&q=php+benchmark&meta=&aq=f&oq=

Ответ 7

Попробуйте следующее:

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

/**
 * PHP скрипт 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;
}