24

php/mysqlサイトのベンチマーク方法を知りたいのですが。

Webアプリはほぼ完成し、稼働する準備ができています。これから何人の人がそれを使用するかはわかっていますが、平均的なユーザーがどれだけの帯域幅を使用し、どれだけの時間を消費するかはまったくわかりません。データベースなど。購入する正しいサーバーを決定する必要があります。

ユーザーごとにこれらの統計を監視できるサーバー側のLinuxはありますか?次に、このデータを取得して推定できるようにしますか?

私がこれについて完全に間違っている場合は、私に知らせてください。しかし、これは新しいWebアプリで頻繁に行われる活動だと思います。

編集:私は間違った情報を求めたかもしれません。データベースクエリにかかる時間とページの読み込みにかかる時間はわかりますが、サーバーにどのような負荷がかかっているかはわかりません。私が尋ねている質問は、平均して一度に100人のユーザーを処理できるかどうかです... 1000?100万人のユーザーを攻撃するには、どのような種類のサーバー要件が必要ですか。等。

ご協力いただきありがとうございます。

4

7 に答える 7

16

私がかなり便利だと思うツールはjmeterです。これにより、(最も基本的には)jmeterをプロキシとして使用するようにブラウザーを設定し、Webサイト全体を歩き回って、実行したすべてのことを記録できます。

ほとんどのWebサイトの適切なテストであることに満足したら、テストをjmeterに保存し、Webサイトの負荷をシミュレートするために、設定されたスレッド数とスレッドごとのループ数でテストを実行するように指示できます。

たとえば、それぞれがテストプランを10回実行する50のクライアントを実行できます。

次に、数値を上下に増やして、サイトに与えるパフォーマンスへの影響を確認し、応答時間をグラフ化します。

これにより、さまざまなパラメーターを調整し、さまざまなキャッシュ戦略を試し、それらの変更による実際の影響を確認できます。

于 2009-12-03T01:18:00.357 に答える
8

スクリプトのストレステスト(10クライアントでの1,000リクエスト= ab -c 10 -n 1000 http:// url )には、ApacheBenchツール(ab、通常はapache Webサーバーパッケージの一部)を使用できます。十分に遅い。応答時間の分布が表示されます(90%の場合、要求は200ミリ秒未満で処理されます)。

また、その特定のスクリプトによって実行されるSQLクエリを取得し、「計画の説明」を行って、テーブルに10〜100〜10百万倍のレコードがある場合にどのように劣化するかを大まかに把握することもできます。

何人のユーザーにサービスを提供できるかについては、お気に入りのブラウザを使用して一般的なユーザーアクセスをエミュレートし、access_logファイルを取得して、送信されたバイト数(ログ行の最後の数値の1つ)を合計できます。たとえば、ユーザーのアクセスごとに5kb text / html + 50kb png / jpg/etc。=55kbでした。さらに、ヘッダーなどは、訪問あたり60kb * 1m=1日あたり60gbのトラフィックとしましょう。あなたの帯域幅はそれに対して十分ですか?(60gb / 86.4ksec = 700kb /秒)。

于 2009-12-02T23:18:59.223 に答える
6

ヘビーウェイトフレームワークなどを使用していない限り、DBクエリはアプリの中で最も遅い部分である可能性があります。

監視のために私が行うことは、DB抽象化オブジェクト内のすべてのクエリの実行時間を測定することです。debug_backtrace()次に、Xミリ秒より長くかかるすべてのクエリ(独自のXを入力)について、クエリが表示されたPHPスクリプトファイルと行番号(その情報を見つけるために使用)を識別する行をクエリログファイルに書き込みます他の関連するコンテキストデータ(ユーザーID、日時など)を使用します。

このログファイルは、後でさまざまな情報について統計的に分析できます。

たとえば、(サーバーの負荷に関連して)合計時間が最も長いクエリを見つけることができます。または、最も遅いもの(ユーザーエクスペリエンスに関連)。または、どのユーザーがシステムを最もロードしているのか(おそらく悪用またはロボット)。

また、パレート図をプロットして、クエリ最適化の取り組みをどこに費やすのが最適かを特定します。

于 2009-12-02T16:17:13.313 に答える
2

最も重要なことは、パフォーマンスをどのようにするかを定義する必要があることです。最適化する領域をいつでも見つけることができます。ただし、応答時間を750msから650msに改善することは、時間の価値がない場合があります。

fsbが言ったように、ボトルネックはおそらくデータベースクエリでしょう。ただし、ボトルネックが常に(または可能性が高い)とは限らないことも規定します。これを最初に読んで、サイトのグローバルテストを行う ことをお勧めし ます。

アプリケーションの場合は、xdebugを使用してPHPコードのプロファイルを作成します。次に、WinCacheGrindまたはKCacheGrindを使用して出力を分析します。これはあなたを驚かせるかもしれません。

データベースの問題に対処するために、それはかなりデータベース固有です。MySQLの場合、低速のクエリログをオンにし、インデックスを使用せずにクエリをログに記録し、クエリログを有効にし、Maatkitなどのツールキットを使用してクエリを分析してボトルネックを見つけます。

于 2009-12-02T16:35:24.277 に答える
1

私は最近、ベンチマークテスト用にレポートを簡単にテストおよび作成するためのPHPコンポーネントを開発しました。また、ベンチマークテストの重要性についての記事を公開しました。これは、テストではない負担がWebサーバーにもたらす可能性があるため、テストの重要性を示しています。ベンチマークテストは非常に重要ですが、今日では、実際にはチェックリストの一番上にあるべきであるにもかかわらず、人々はそれを忘れがちだと思います。バグチェック、セキュリティチェック、そしてベンチマークテスト。

その順番で。

http://www.binpress.com/app/benchmark-testing-framework/534?ad=1229-私が開発したフレームワーク http://www.binpress.com/blog/2011/08/04/the-ベンチマークテストの重要性/?ad=1229-私が書いた記事

于 2011-08-15T22:06:03.400 に答える
1

これを試して:

<?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;
}
于 2016-09-18T15:11:04.020 に答える
0

ベンチマークツールの経験はありませんが、場合によっては、、、、のフィールドを使用して単純なテーブルを作成しidます。ページが更新または呼び出されるたびに(ajaxの状況で)新しい行を挿入するだけです。次に、週/月/四半期/年に収集されたデータを分析します。それはあなたの好ましい状況ではありませんが、急な通知でいくつかの統計を取得する簡単な方法です。ipaddressparsetimequeries

PHPベンチマークに関するいくつかの結果: http ://www.google.nl/search?hl = nl&source = hp&q = php + branchmark&meta =&aq = f&oq =

于 2009-12-02T16:00:50.810 に答える