2009-12-02 14 views
23

Tôi muốn biết cách điểm chuẩn trang web php/mysql.Cách chuẩn bị trang web php/mysql

Chúng tôi có một ứng dụng web gần như hoàn thành và sẵn sàng phát trực tiếp, chúng tôi biết có bao nhiêu người sẽ sử dụng nó trong một năm nhưng hoàn toàn không biết băng thông người dùng trung bình bao nhiêu đốt cháy trên cơ sở dữ liệu, vv Chúng ta cần phải xác định các máy chủ chính xác để mua.

Có điều gì đó phía máy chủ Linux có thể giám sát các thống kê này cho mỗi người dùng không? Vậy thì chúng ta có thể lấy dữ liệu này và ngoại suy nó?

Nếu tôi nói về điều này hoàn toàn sai, vui lòng cho tôi biết nhưng tôi tin rằng đây là hoạt động thường xuyên cho các ứng dụng web mới.

EDIT: Tôi có thể đã yêu cầu cung cấp thông tin không chính xác. Chúng ta có thể xem các truy vấn cơ sở dữ liệu mất bao lâu và mất bao lâu để tải trang nhưng không biết tải được đặt trên máy chủ. Câu hỏi tôi hỏi là liệu chúng ta có thể xử lý 100 người dùng cùng một lúc trên trung bình ... 1000? Loại yêu cầu máy chủ nào là cần thiết để đạt được 1 triệu người dùng. Vv

Cảm ơn sự giúp đỡ của bạn.

+1

Xin lỗi tôi thay đổi nội dung câu hỏi của tôi như tôi không tin điều này là rõ ràng. – user103219

Trả lời

16

Công cụ mà tôi thấy khá hữu ích là jmeter cho phép bạn đặt trình duyệt của mình sử dụng jmeter làm proxy sau đó bạn đi quanh trang web và ghi lại mọi thứ bạn làm.

Một khi bạn hài lòng rằng đó là một thử nghiệm khá trong hầu hết trang web của bạn, bạn có thể lưu thử nghiệm trong jmeter và yêu cầu nó chạy thử nghiệm của bạn với một số chủ đề và một số vòng trên mỗi chuỗi để mô phỏng tải trên trang web của bạn.

Ví dụ: bạn có thể chạy 50 khách hàng mỗi khi chạy thử nghiệm 10 lần.

Sau đó, bạn có thể tăng số lượng lên và xuống để xem tác động hiệu suất trên trang web, nó biểu thị thời gian phản hồi cho bạn.

Điều này cho phép bạn điều chỉnh các thông số khác nhau, thử các chiến lược lưu trong bộ nhớ cache khác nhau và kiểm tra tác động thực tế của những thay đổi đó.

0

Tôi không có kinh nghiệm với các công cụ đo điểm chuẩn nhưng trong một số trường hợp, tôi tạo một bảng đơn giản với các trường id, ipaddress, parsetime, queries. Chỉ cần chèn một hàng mới mỗi lần trang làm mới hoặc được gọi (trong tình huống ajax). Sau đó phân tích dữ liệu thu thập được trong một tuần/tháng/quý/năm. Nó không phải là tình huống ưa thích của bạn mà là một cách đơn giản để có được một số thống kê về thông báo ngắn.

Một số kết quả trên các tiêu chuẩn PHP: http://www.google.nl/search?hl=nl&source=hp&q=php+benchmark&meta=&aq=f&oq=

+0

Vâng, tôi đoán tôi đang tìm thứ gì đó 'bên ngoài' của ứng dụng để theo dõi những gì nó đang làm. – user103219

+0

Tôi đã cập nhật câu trả lời của mình và cung cấp liên kết, hy vọng đó là điều giúp bạn tiếp tục. – Ben

+0

Tại sao có một downvote? Liệu người đó có thể giải thích điều gì sai với câu trả lời này? – Ben

5

Trừ khi bạn đang sử dụng một heavyweight framework or something like that, các truy vấn DB có thể sẽ là một phần chậm nhất của ứng dụng của bạn.

Điều tôi làm để giám sát là đo thời gian thực hiện cho mọi truy vấn trong đối tượng trừu tượng DB của tôi. Sau đó, đối với mỗi truy vấn mất nhiều hơn X mili giây (điền vào X của riêng bạn), tôi viết một dòng vào tệp nhật ký truy vấn xác định tệp tập lệnh PHP và số dòng mà truy vấn xuất hiện (sử dụng debug_backtrace() để tìm thông tin đó) cùng với các dữ liệu ngữ cảnh khác có liên quan (ví dụ: nhận dạng người dùng, ngày giờ vv).

Tệp nhật ký này có thể được phân tích thống kê sau này để biết thêm thông tin.

Ví dụ: bạn có thể tìm thấy truy vấn nào của bạn đang dùng tổng thời gian nhiều nhất (có liên quan đến tải trên máy chủ). Hoặc đó là chậm nhất (liên quan đến trải nghiệm người dùng). Hoặc người dùng nào đang tải hệ thống nhiều nhất (có thể là lạm dụng hoặc rô bốt).

Tôi cũng vẽ biểu đồ Pareto để xác định nơi tốt nhất để chi tiêu các nỗ lực tối ưu hóa truy vấn của tôi.

+0

Câu trả lời hay! Tôi sẽ thực hiện điều đó cho một số dự án lớn hơn mà tôi đang làm việc! – Ben

+0

Bạn có thể giải thích ngắn gọn cách bạn sử dụng biểu đồ Pareto để xác định thời gian được chi tiêu tốt nhất không? – user103219

+0

http://en.wikipedia.org/wiki/Pareto_chart Tạo danh sách tổng thời gian truy vấn trung bình cho từng truy vấn của bạn và sắp xếp danh sách theo một hoặc chỉ số khác. Vẽ biểu đồ như được mô tả trong liên kết Wikipedia để hình dung bạn đã dành bao nhiêu thời gian trong các truy vấn N chậm nhất và truy vấn nào. Bắt đầu công việc tối ưu hóa ở đầu danh sách. –

2

Hầu hết nhập, bạn cần phải xác định những gì bạn muốn hiệu suất là: Bạn có thể luôn luôn tìm các khu vực để tối ưu hóa. Tuy nhiên, việc cải thiện thời gian phản hồi từ 750ms lên 650ms có thể không đáng để dành thời gian.

Như fsb đã nói, các nút cổ chai của bạn có thể sẽ là truy vấn cơ sở dữ liệu của bạn. Tuy nhiên, tôi cũng sẽ quy định rằng các nút cổ chai của bạn không phải lúc nào (hoặc thậm chí có khả năng) mà bạn nghĩ là chúng. Tôi khuyên bạn nên đọc this trước tiên và thực hiện kiểm tra toàn cầu trang web của bạn.

Nếu đó là ứng dụng của bạn, hãy sử dụng xdebug để cấu hình mã PHP của bạn. Sau đó sử dụng WinCacheGrind hoặc KCacheGrind để phân tích đầu ra. Điều này có thể làm bạn ngạc nhiên.

Để giải quyết các vấn đề về cơ sở dữ liệu, đó là cơ sở dữ liệu khá cụ thể. Đối với MySQL, tôi bật nhật ký truy vấn chậm, truy vấn nhật ký không sử dụng chỉ mục, bật ghi nhật ký truy vấn và sử dụng bộ công cụ như Maatkit để phân tích các truy vấn và tìm thấy các tắc nghẽn.

8

Bạn có thể sử dụng công cụ ApacheBench (ab, thường là một phần của gói web-server apache) để kiểm tra căng thẳng (yêu cầu 1k với 10 máy khách = abc 10 -n 1000 http://url) của tập lệnh, mà bạn nghi ngờ có thể đủ chậm. Nó sẽ cho bạn thấy sự phân phối của thời gian phản ứng (trong 90% trường hợp yêu cầu xử lý trong vòng chưa đầy 200msec). Bạn cũng có thể lấy các truy vấn SQL được thực hiện bởi tập lệnh cụ thể đó và thực hiện "kế hoạch giải thích" để chúng có được một ý tưởng thô như thế nào nó sẽ làm suy giảm khi nào sẽ có nhiều hơn 10-100-10mln bản ghi trong bảng.

Về số lượng người dùng có thể phân phối - bạn có thể sử dụng trình duyệt yêu thích của mình và mô phỏng lượt truy cập điển hình của người dùng, lấy tệp access_log và tổng số byte đã gửi (một trong những số cuối cùng trong dòng nhật ký). Ví dụ: văn bản 5kb/html + 50kb png/jpg/v.v. = 55kb cho mỗi lượt truy cập của người dùng. Thêm tiêu đề/v.v. giả sử 60kb mỗi lượt truy cập * 1m = 60gb lưu lượng truy cập mỗi ngày. Băng thông của bạn có đủ tốt cho điều đó không? (60gb/86,4ksec = 700kb/giây).

1

Gần đây tôi đã phát triển một thành phần PHP để dễ dàng kiểm tra và tạo báo cáo cho bài kiểm tra điểm chuẩn của mình. Tôi cũng đã xuất bản một bài viết về tầm quan trọng của kiểm tra điểm chuẩn, mà tôi chỉ ra tầm quan trọng của việc thử nghiệm do sự căng thẳng không kiểm tra có thể gây ra trên máy chủ web của bạn. Thử nghiệm điểm chuẩn là cực kỳ quan trọng, nhưng tôi nghĩ rằng trong thời đại ngày nay mọi người có xu hướng quên rằng, khi thực tế nó phải ở trên cùng của danh sách kiểm tra. Kiểm tra lỗi, kiểm tra bảo mật, sau đó kiểm tra điểm chuẩn.

Theo thứ tự đó.

http://www.binpress.com/app/benchmark-testing-framework/534?ad=1229 - Khung tôi đã phát triển http://www.binpress.com/blog/2011/08/04/the-important-of-benchmark-testing/?ad=1229 - Các bài viết tôi đã viết

0

Hãy thử điều này:

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