2009-12-02 38 views
23

我想知道如何基准php/mysql站点。如何基准php/mysql站点

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

有什么服务器端的Linux可以监测每个用户的这些统计数据吗?那么我们可以把这些数据推断出来呢?

如果我正在讨论这个完全错误的问题,请让我知道,但我相信这是新Web应用程序的常见活动。

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

感谢您的帮助。

+1

对不起,我编辑我的问题,因为我不相信这是显而易见的。 – user103219 2009-12-02 22:51:18

回答

16

我发现一个相当有用的工具是jmeter,它允许(在最基本的情况下)将浏览器设置为使用jmeter作为代理,然后在所有网站上漫游,它会记录你所做的一切。

一旦你感到高兴,这是一个体面的测试你的网站的大部分,然后你可以保存在Jmeter的测试,并告诉它运行你的测试与设置数量的线程和每个线程的数量来模拟负载你的网页。

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

然后,您可以坡道的数字上下,看它的性能影响的部位,图像就会响应时间为您服务。

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

0

我没有与基准测试工具的任何经验,但在某些情况下,我创建领域idipaddressparsetimequeries一个简单的表。每次页面刷新或被调用时(在Ajax情况下),只需插入一个新行。然后分析一周/一月/一季/一年收集的数据。这不是您的首选情况,而是一种在短时间内获得一些统计数据的简单方法。

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

+0

是的,我想我正在寻找更多的“外部”的应用程序来跟踪它的行为。 – user103219 2009-12-02 16:03:15

+0

我已经更新我的回答和提供的链接,希望它的东西,进一步帮助您。 – Ben 2009-12-02 16:03:57

+0

为什么有一个downvote?能否给予解释的人解释这个答案有什么问题? – Ben 2009-12-03 08:09:39

5

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

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

此日志文件可以在以后统计分析各种信息。

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

我也绘制帕累托图来确定哪里最好花我的查询优化工作。

+0

好的答案!我将为我正在进行的一些更大的项目实施该项目! – Ben 2009-12-02 16:35:27

+0

您能否简单介绍一下如何使用帕累托图来确定最佳时间? – user103219 2009-12-03 05:20:51

+0

http://en.wikipedia.org/wiki/Pareto_chart 列出每个查询的总查询时间和平均查询时间,并按照一个或另一个度量标准对列表进行排序。根据维基百科链接中描述的图绘制图表,以查看在最慢的N个查询中花费了多少时间,以及查询了哪些查询。在列表顶部开始优化工作。 – 2009-12-12 22:09:10

2

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

正如fsb所说,你的瓶颈可能是你的数据库查询。但是,我还要规定,你认为自己的瓶颈并不总是(或者甚至是可能)。我建议先阅读this,并对您的网站进行全球测试。

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

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

8

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

比你还可以抓住特定脚本执行的SQL查询并为他们做一个“解释计划”以获得一个大概的想法,当表中将有10-100-10,100倍多的记录时,它将如何降级。

关于有多少用户可以使用 - 您可以使用自己喜欢的浏览器并模拟典型的用户访问,获取access_log文件和总结发送的字节(日志行中的最后一个数字之一)。例如,每个用户访问5kb文本/ html + 50kb png/jpg /等= 55kb。 Plus标题/等等,比如每次访问60kb * 1m =每天60GB的流量。你的带宽足够好吗? (60GB/86.4ksec = 700KB /秒)。

1

我最近开发了一个PHP组件,可以轻松测试并为基准测试构建一份报告。我还出版了关于基准测试,我表示测试的重​​要性重要性的文章,由于应变不测试可能会导致您的Web服务器上。基准测试是非常重要的,但我认为,在这个时代,人们往往忘记了,在现实中,它应该在清单的顶端。错误检查,安全检查,然后基准测试。

按此顺序。

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

试试这个文章:

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