문제

php/mysql 사이트를 벤치마킹하는 방법을 알고 싶습니다.

우리는 웹 앱이 거의 완성되어 출시 준비가 되어 있습니다. 우리는 몇 년 안에 얼마나 많은 사람들이 그것을 사용할지 알고 있지만 평균 사용자가 얼마나 많은 대역폭을 사용하는지, 얼마나 많은 시간을 소모하는지 전혀 모릅니다. 데이터베이스 등구매할 올바른 서버를 결정해야 합니다.

사용자별로 이러한 통계를 모니터링할 수 있는 서버 측 Linux가 있습니까?그럼 우리는 이 데이터를 가져와서 추정할 수 있을까요?

제가 이 문제에 대해 완전히 잘못 생각하고 있다면 알려주세요. 하지만 저는 이것이 새로운 웹 앱에서 자주 발생하는 활동이라고 생각합니다.

편집하다:제가 잘못된 정보를 요청했을 수도 있습니다.데이터베이스 쿼리에 걸리는 시간과 페이지를 로드하는 데 걸리는 시간을 확인할 수 있지만 서버에 어떤 로드가 가해지는지는 알 수 없습니다.제가 묻는 질문은 평균적으로 100명의 사용자를 한 번에 처리할 수 있느냐는 것입니다...1000명?1백만 명의 사용자를 달성하려면 어떤 유형의 서버 요구 사항이 필요합니까?등.

당신의 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

제가 상당히 유용하다고 생각하는 도구는 다음과 같습니다. jmeter (가장 기본적으로) jmeter를 프록시로 사용하도록 브라우저를 설정한 다음 웹사이트를 돌아다니면 모든 작업이 기록됩니다.

대부분의 웹 사이트에 대한 적절한 테스트라는 점에 만족하면 jmeter에 테스트를 저장하고 웹 사이트의 로드를 시뮬레이션하기 위해 설정된 스레드 수와 스레드당 루프 수를 사용하여 테스트를 실행하도록 지시할 수 있습니다.

예를 들어, 각각 테스트 계획을 10회 실행하는 50개의 클라이언트를 실행할 수 있습니다.

그런 다음 숫자를 늘리거나 줄여 사이트에 미치는 성능 영향을 확인할 수 있으며 응답 시간이 그래프로 표시됩니다.

이를 통해 다양한 매개변수를 조정하고, 다양한 캐싱 전략을 시도하고, 해당 변경 사항이 실제 영향을 미치는지 확인할 수 있습니다.

다른 팁

스트레스 테스트(클라이언트 10개에 대한 1k 요청 = ab -c 10 -n 1000)를 위해 ApacheBench 도구(ab, 일반적으로 Apache 웹 서버 패키지의 일부)를 사용할 수 있습니다. http://url) 스크립트의 속도가 충분히 느릴 수 있다고 생각됩니다.응답 시간 분포를 보여줍니다(90%의 경우 요청이 200msec 미만으로 처리됨).

또한 특정 스크립트에 의해 실행된 SQL 쿼리를 잡고 "계획 설명"을 수행하여 테이블에 10-100-10mln 배 더 많은 레코드가 있을 때 성능이 어떻게 저하될 것인지 대략적인 아이디어를 얻을 수도 있습니다.

얼마나 많은 사용자에게 서비스를 제공할 수 있는지에 관해 - 선호하는 브라우저를 사용하고 일반적인 사용자 방문을 에뮬레이션하고, access_log 파일을 가져와서 보낸 바이트 수를 합산할 수 있습니다(로그 줄의 마지막 숫자 중 하나).예를 들어 사용자 방문당 5kb text/html+50kb png/jpg/etc.=55kb였습니다.헤더/등을 더해 방문당 60kb*1m=일일 트래픽 60gb를 가정해 보겠습니다.귀하의 대역폭이 그렇게 하기에 충분합니까?(60GB/86.4ksec=700kb/초).

당신이 사용하지 않는 한 헤비급 프레임워크나 그런 것, DB 쿼리는 앱에서 가장 느린 부분일 가능성이 높습니다.

모니터링을 위해 내가 하는 일은 DB 추상화 개체의 모든 쿼리에 대한 실행 시간을 측정하는 것입니다.그런 다음 X 밀리초(직접 X 입력)보다 오래 걸리는 모든 쿼리에 대해 쿼리 로그 파일에 쿼리가 나타난 PHP 스크립트 파일과 줄 번호를 식별하는 줄을 작성합니다(사용 debug_backtrace() 해당 정보를 찾기 위해)와 기타 관련 컨텍스트 데이터(예:사용자 신원, 날짜-시간 등).

이 로그 파일은 나중에 다양한 정보를 통계적으로 분석할 수 있습니다.

예를 들어, 서버 로드와 관련하여 총 시간이 가장 많이 소요되는 쿼리를 찾을 수 있습니다.또는 가장 느린 것(사용자 경험과 관련됨)입니다.또는 어떤 사용자가 시스템을 가장 많이 로드하고 있는지(남용 또는 로봇).

또한 쿼리 최적화 노력을 어디에 투자하는 것이 가장 좋은지 파악하기 위해 파레토 차트를 구성합니다.

가장 중요한 것은 원하는 성능을 정의해야 한다는 것입니다.당신은 할 수 있습니다 언제나 최적화할 영역을 찾으세요.그러나 응답 시간을 750ms에서 650ms로 개선하는 것은 시간을 투자할 가치가 없을 수 있습니다.

fsb가 말했듯이 병목 현상은 아마도 데이터베이스 쿼리일 것입니다.그러나 나는 또한 병목 현상이 당신이 생각하는 곳에 항상(또는 가능성이) 있는 것은 아니라고 규정하고 싶습니다.나는 독서를 제안하고 싶습니다 이것 먼저 사이트에 대한 글로벌 테스트를 수행하세요.

애플리케이션인 경우 xdebug를 사용하여 PHP 코드를 프로파일링하세요.그런 다음 WinCacheGrind 또는 KCacheGrind를 사용하여 출력을 분석합니다.이것은 당신을 놀라게 할 수 있습니다.

데이터베이스 문제를 해결하는 것은 데이터베이스에 따라 다릅니다.MySQL의 경우 느린 쿼리 로그를 켜고, 인덱스를 사용하지 않는 쿼리를 기록하고, 쿼리 로깅을 활성화하고, Maatkit과 같은 툴킷을 사용하여 쿼리를 분석하고 병목 현상을 찾습니다.

저는 최근 벤치마크 테스트를 위해 쉽게 테스트하고 보고서를 작성하기 위해 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 - 내가 쓴 글

벤치마킹 도구에 대한 경험이 없지만 어떤 경우에는 필드가 포함된 간단한 테이블을 만듭니다. id, ipaddress, parsetime, queries.페이지가 새로 고쳐지거나 호출될 때마다(Ajax 상황에서) 새 행을 삽입하기만 하면 됩니다.그런 다음 주/월/분기/년 단위로 수집된 데이터를 분석합니다.선호하는 상황은 아니지만 짧은 시간에 통계를 얻을 수 있는 간단한 방법입니다.

PHP 벤치마크의 일부 결과:http://www.google.nl/search?hl=nl&source=hp&q=php+benchmark&meta=&aq=f&oq=

이 시도:

<?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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top