如何基准php / mysql网站

时间:2009-12-02 15:52:35

标签: php mysql benchmarking load-testing

我想知道如何对php / mysql网站进行基准测试。

我们有一个网络应用程序差不多完成并准备上线,我们知道有多少人会在几年内使用它,但绝对不知道普通用户需要多少带宽,他们烧多少时间我们需要确定要购买的正确服务器。

服务器端linux是否可以监控每个用户的这些统计信息?那么我们就可以获取这些数据并进行推断呢?

如果我对此完全出错,请告诉我,但我相信这是新网络应用的常用活动。

编辑:我可能要求提供不正确的信息。我们可以看到数据库查询需要多长时间以及加载页面所需的时间,但不知道服务器上放置了什么负载。我问的问题是我们可以同时处理100个用户...... 1000?命中1M用户需要什么类型的服务器要求。等

感谢您的帮助。

7 个答案:

答案 0 :(得分:16)

我认为非常有用的工具是jmeter,它允许(最基本的)你设置你的浏览器使用jmeter作为代理,然后你在你的网站四处闲逛,它会记录你所做的一切。

如果您对您的大多数网站都进行了不错的测试,那么您可以将测试保存在jmeter中并告诉它使用一定数量的线程和每个线程的多个循环运行测试以模拟您的负载网站。

例如,您可以运行50个客户端,每个客户端运行10次测试计划。

然后,您可以上下调整数字以查看它对网站的性能影响,它会为您显示响应时间。

这使您可以调整不同的参数,尝试不同的缓存策略并检查这些更改对现实世界的影响。

答案 1 :(得分:8)

您可以使用ApacheBench工具(ab,通常是apache web-server软件包的一部分)进行压力测试(10个客户端的1k请求= ab -c 10 -n 1000 http://url)脚本,怀疑可能够慢。 它将显示响应时间的分布(在90%的情况下,请求处理的时间少于200毫秒)。

您还可以获取由该特定脚本执行的SQL查询,并为他们执行“解释计划”,以便大致了解当表中的记录数量增加10-100-10亿次时,它将如何降级。

关于它可以提供多少用户 - 您可以使用自己喜欢的浏览器并模拟典型的用户访问,获取access_log文件并汇总发送的字节(日志行中的最后一个数字之一)。例如,每用户访问量为5kb text / html + 50kb png / jpg / etc. = 55kb。加上标题/等让我们说每次访问60kb * 1m =每天60gb流量。你的带宽是否足够好? (60GB / 86.4ksec = 700KB /秒)。

答案 2 :(得分:5)

除非您使用heavyweight framework or something like that,否则数据库查询可能是您应用中最慢的部分。

我为监控做的是测量数据库抽象对象中每个查询的执行时间。然后,对于每个花费超过X毫秒的查询(填写您自己的X),我在查询日志文件中写一行,用于标识查询出现的PHP脚本文件和行号(使用debug_backtrace()到找到该信息)以及其他相关的上下文数据(例如用户身份,日期时间等)。

此日志文件可以在以后进行统计分析,以获取各种信息。

例如,您可以找到哪些查询占用了最长的总时间(与服务器负载相关)。或者哪个是最慢的(与用户体验相关)。或者哪个用户最多加载系统(可能是滥用或机器人)。

我还绘制了Pareto图表,以确定最适合我的查询优化工作的位置。

答案 3 :(得分:2)

最重要的是,您需要定义您想要的性能:您可以始终找到要优化的区域。但是,将响应时间从750毫秒提高到650毫秒可能不值得。

正如fsb所说,你的瓶颈可能就是你的数据库查询。但是,我还会规定你的瓶颈并不总是(甚至可能)你认为它们在哪里。我建议先阅读this,然后对您的网站进行全面测试。

如果是您的应用程序,请使用xdebug来分析您的PHP代码。然后使用WinCacheGrind或KCacheGrind分析输出。这可能会让你大吃一惊。

为解决数据库问题,它非常适合数据库。对于MySQL,我打开慢查询日志,不使用索引记录查询,启用查询日志记录,并使用Maatkit等工具包来分析查询并找出瓶颈。

答案 4 :(得分:1)

我最近开发了一个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 - 我写的文章

答案 5 :(得分:0)

我对基准测试工具没有任何经验,但在某些情况下,我创建了一个包含字段idipaddressparsetimequeries的简单表格。每次页面刷新或调用时都会插入一个新行(在ajax情况下)。然后分析一周/月/季/年收集的数据。它不是您的首选情况,而是在短时间内获得一些统计数据的简单方法。

PHP基准测试的一些结果: http://www.google.nl/search?hl=nl&source=hp&q=php+benchmark&meta=&aq=f&oq=

答案 6 :(得分:0)

试试这个:

<?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;
}