Как тестировать сайт php / mysql - PullRequest
23 голосов
/ 02 декабря 2009

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

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

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

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

РЕДАКТИРОВАТЬ: Возможно, я попросил неверную информацию. Мы можем видеть, сколько времени занимают запросы к базе данных и сколько времени занимает загрузка страницы, но мы не знаем, какая нагрузка на сервер. Вопрос, который я задаю, заключается в том, можем ли мы одновременно обрабатывать 100 пользователей ... 1000? Какой тип требований к серверу нужен, чтобы поразить пользователей 1M. И т.д.

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

Ответы [ 7 ]

16 голосов
/ 03 декабря 2009

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

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

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

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

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

8 голосов
/ 03 декабря 2009

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

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

Относительно того, сколько пользователей он может обслуживать - вы можете использовать свой любимый браузер и эмулировать обычное посещение пользователя, взять файл access_log и сумму отправленных байтов (одно из последних чисел в строке журнала). Например, это было 5 КБ текста / HTML + 50 КБ PNG / JPG / и т. Д. = 55 КБ за посещение пользователя. Плюс заголовки и т.д., скажем, 60 КБ за посещение * 1 м = 60 ГБ трафика в день. Ваша пропускная способность достаточно хороша для этого? (60GB / 86.4ksec = 700kb / сек).

5 голосов
/ 02 декабря 2009

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

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

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

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

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

2 голосов
/ 02 декабря 2009

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

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

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

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

1 голос
/ 16 августа 2011

Недавно я разработал компонент 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 - статья, которую я написал

0 голосов
/ 18 сентября 2016

Попробуйте это:

<?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;
}
0 голосов
/ 02 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...