การทดสอบโหลด ab


194

มีคนช่วยแนะนำขั้นตอนการทดสอบโหลดเว็บไซต์ด้วยapache bench tool ( ab) ได้ไหม?

ฉันต้องการทราบสิ่งต่อไปนี้:

ไซต์สามารถจัดการคนได้กี่คนต่อนาที

โปรดแนะนำฉันผ่านคำสั่งที่ฉันควรใช้เพื่อคิดเรื่องนี้

ฉันลองทุกบทช่วยสอนและพวกเขาก็สับสน

คำตอบ:


315

เครื่องมือเปรียบเทียบอาปาชเป็นพื้นฐานมากและในขณะที่มันจะให้ความคิดที่มั่นคงของประสิทธิภาพการทำงานบางอย่างมันเป็นความคิดที่ดีที่จะขึ้นอยู่กับมันหากคุณวางแผนที่จะให้เว็บไซต์ของคุณเผชิญกับความเครียดที่รุนแรงในการผลิต

ต้องบอกว่านี่เป็นพารามิเตอร์ที่พบได้บ่อยและง่ายที่สุด:

-c: ("การทำงานพร้อมกัน") ระบุจำนวนลูกค้า (คน / ผู้ใช้) ที่จะเข้าชมเว็บไซต์ในเวลาเดียวกัน ในขณะที่abทำงานจะมี-cลูกค้าเข้าชมเว็บไซต์ นี่คือสิ่งที่จะตัดสินจำนวนความเครียดที่ไซต์ของคุณจะประสบในระหว่างการวัดประสิทธิภาพ

-n: ระบุจำนวนคำขอที่จะทำ สิ่งนี้จะกำหนดความยาวของเกณฑ์มาตรฐาน -nค่าสูงที่มี-cค่าที่เซิร์ฟเวอร์ของคุณสามารถรองรับได้นั้นเป็นความคิดที่ดีเพื่อให้แน่ใจว่าสิ่งต่าง ๆ จะไม่เกิดความเครียดภายใต้ความกดดันที่ยั่งยืน

-k: วิธีนี้จะทำให้เบราว์เซอร์ funcionality "KeepAlive" ทำโดยธรรมชาติ คุณไม่จำเป็นต้องส่งค่า-kเพราะมันเป็น "บูลีน" (ความหมาย: มันบ่งบอกว่าคุณต้องการให้การทดสอบของคุณใช้ส่วนหัว Keep Alive จาก HTTP และรักษาการเชื่อมต่อ) เนื่องจากเบราว์เซอร์ทำสิ่งนี้และคุณมีแนวโน้มที่จะจำลองความเครียดและการไหลที่ไซต์ของคุณจะได้รับจากเบราว์เซอร์ขอแนะนำให้คุณทำการเปรียบเทียบกับสิ่งนี้

อาร์กิวเมนต์สุดท้ายเป็นเพียงโฮสต์ โดยค่าเริ่มต้นมันจะกด http: // โปรโตคอลหากคุณไม่ได้ระบุไว้

ab -k -c 350 -n 20000 example.com/

โดยการออกคำสั่งด้านบนคุณจะกดhttp://example.com/พร้อมการเชื่อมต่อ 350 พร้อมกันจนกว่าจะถึง 20,000 คำร้อง มันจะเสร็จสิ้นโดยใช้ส่วนหัว keep alive

หลังจากกระบวนการเสร็จสิ้นการร้องขอ 20,000 ครั้งคุณจะได้รับข้อเสนอแนะเกี่ยวกับสถิติ สิ่งนี้จะบอกคุณว่าไซต์ทำงานได้ดีเพียงใดภายใต้ความกดดันที่คุณวางไว้เมื่อใช้พารามิเตอร์ด้านบน

สำหรับการค้นหาว่ามีกี่คนที่ไซต์สามารถจัดการได้ในเวลาเดียวกันเพียงดูว่าเวลาตอบสนอง (หมายถึงเวลาตอบสนองขั้นต่ำและสูงสุดคำขอที่ล้มเหลว ฯลฯ ) เป็นตัวเลขที่ไซต์ของคุณสามารถยอมรับได้ (ไซต์ต่างๆอาจต้องการความเร็วที่แตกต่างกัน) คุณสามารถเรียกใช้เครื่องมือที่มีค่า -c ที่แตกต่างกันจนกว่าคุณจะไปถึงจุดที่คุณพูดว่า "ถ้าฉันเพิ่มมันมันจะเริ่มรับคำขอที่ล้มเหลวและมันแตก"

ขึ้นอยู่กับเว็บไซต์ของคุณคุณจะคาดหวังจำนวนคำขอโดยเฉลี่ยต่อนาที สิ่งนี้แตกต่างกันมากคุณจะไม่สามารถจำลองสิ่งนี้ด้วย ab อย่างไรก็ตามคิดอย่างนี้: หากผู้ใช้โดยเฉลี่ยของคุณจะได้รับการร้องขอ 5 ครั้งต่อนาทีและเวลาตอบสนองโดยเฉลี่ยที่คุณพบว่าถูกต้องคือ 2 วินาทีนั่นหมายความว่า 10 วินาทีจากหนึ่งนาทีผู้ใช้ 1 คนจะร้องขอ 1/6 ของเวลาที่มันจะเข้าชมไซต์ นอกจากนี้ยังหมายความว่าหากคุณมีผู้ใช้ 6 คนที่กดปุ่ม ab พร้อมกันคุณมีแนวโน้มที่จะมีผู้ใช้ 36 คนในการจำลองแม้ว่าระดับการทำงานพร้อมกันของคุณ (-c) เพียง 6

ขึ้นอยู่กับพฤติกรรมที่คุณคาดหวังจากผู้ใช้ของคุณที่ใช้เว็บไซต์ แต่คุณสามารถรับได้จาก "ฉันคาดว่าผู้ใช้ของฉันจะได้รับการร้องขอ X ต่อนาทีและฉันคิดว่าเวลาตอบสนองโดยเฉลี่ยจะใช้ได้ถ้า 2 วินาที" จากนั้นเพียงแค่ปรับเปลี่ยนระดับ -c ของคุณจนกว่าคุณจะกดปุ่มเวลาตอบสนองเฉลี่ย 2 วินาที (แต่ต้องแน่ใจว่าเวลาตอบสนองสูงสุดและ stddev ยังคงใช้ได้) และดูว่าคุณสามารถสร้าง -c ได้ขนาดไหน

ฉันหวังว่าฉันอธิบายสิ่งนี้ชัดเจน :) ขอให้โชคดี


5
คำตอบที่ตรงและชัดเจน! คุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหมว่าทำไมคุณถึงได้รับ "นี่หมายความว่าหากคุณมีผู้ใช้ 6 คนที่กดปุ่ม ab พร้อมกันกับเว็บไซต์คุณมีแนวโน้มที่จะมีผู้ใช้ 36 คนในการจำลองแม้ว่าระดับการทำงานพร้อมกัน (-c) เท่านั้น 6."
kbariotis

3
เพียงเตือนความจำคุณอาจต้องการเพิ่ม-lตัวเลือกถ้าหน้านั้นมีเนื้อหาแบบไดนามิกวิธีที่คุณจะไม่ได้รับคำขอที่ล้มเหลวเนื่องจากความยาวของเนื้อหานั้นแตกต่างกันระหว่างคำขอ
JCM

73

โปรดแนะนำฉันผ่านคำสั่งที่ฉันควรใช้เพื่อคิดเรื่องนี้

การทดสอบที่ง่ายที่สุดที่คุณสามารถทำได้คือดำเนินการ 1,000 คำขอ 10 ครั้ง (ซึ่งจำลองผู้ใช้ที่ทำงานพร้อมกัน 10 คนโดยได้รับ 100 หน้าแต่ละหน้า - ตามความยาวของการทดสอบ)

ab -n 1000 -c 10 -k -H "Accept-Encoding: gzip, deflate" http://www.example.com/

-n 1000 คือจำนวนคำขอที่จะทำ

-c 10 บอกให้ AB ทำการร้องขอ 10 ครั้งต่อครั้งแทนที่จะทำการร้องขอ 1 ครั้งต่อครั้งเพื่อจำลองผู้เยี่ยมชมที่เกิดขึ้นพร้อมกันได้ดีกว่า (เทียบกับผู้เข้าชมตามลำดับ)

-kส่งKeepAliveส่วนหัวซึ่งขอให้เว็บเซิร์ฟเวอร์ไม่ได้ปิดการเชื่อมต่อหลังจากทำแต่ละคำขอเสร็จ แต่จะกลับมาใช้ซ้ำ

ฉันยังส่งส่วนหัวพิเศษAccept-Encoding: gzip, deflateเพราะ mod_deflate มักจะใช้ในการบีบอัดข้อความ / html เอาท์พุท 25% -75% - ผลกระทบที่ไม่ควรยกเลิกเนื่องจากมันส่งผลกระทบต่อประสิทธิภาพโดยรวมของเว็บเซิร์ฟเวอร์ (เช่น สามารถถ่ายโอนข้อมูลได้ 2 เท่าในเวลาเดียวกัน ฯลฯ )

ผล:

Benchmarking www.example.com (be patient)
Completed 100 requests
...
Finished 1000 requests


Server Software:        Apache/2.4.10
Server Hostname:        www.example.com
Server Port:            80

Document Path:          /
Document Length:        428 bytes

Concurrency Level:      10
Time taken for tests:   1.420 seconds
Complete requests:      1000
Failed requests:        0
Keep-Alive requests:    995
Total transferred:      723778 bytes
HTML transferred:       428000 bytes
Requests per second:    704.23 [#/sec] (mean)
Time per request:       14.200 [ms] (mean)
Time per request:       1.420 [ms] (mean, across all concurrent requests)
Transfer rate:          497.76 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:     5   14   7.5     12      77
Waiting:        5   14   7.5     12      77
Total:          5   14   7.5     12      77

Percentage of the requests served within a certain time (ms)
  50%     12
  66%     14
  75%     15
  80%     16
  90%     24
  95%     29
  98%     36
  99%     41
 100%     77 (longest request)

สำหรับการตีความที่ง่ายที่สุดให้ละเว้นทุกสิ่ง แต่บรรทัดนี้:

Requests per second:    704.23 [#/sec] (mean)

คูณด้วย 60 และคุณมีคำขอของคุณต่อนาที

เพื่อให้ได้ผลลัพธ์ในโลกแห่งความเป็นจริงคุณจะต้องทดสอบ Wordpress แทนไฟล์ HTML หรือ index.php บางส่วนเนื่องจากคุณจำเป็นต้องรู้ว่าทุกอย่างทำงานร่วมกันอย่างไร: รวมถึงโค้ด PHP ที่ซับซ้อนและแบบสอบถาม MySQL หลายรายการ ...

ตัวอย่างเช่นนี่คือผลลัพธ์ของการทดสอบการติดตั้ง Wordpress ใหม่บนระบบเดียวกันและสภาพแวดล้อมของ WAMP (ฉันใช้ WampDeveloper แต่ยังมี Xampp, WampServer และอื่น ๆ ) ...

Requests per second:    18.68 [#/sec] (mean)

นั่นคือ 37x ช้าลงในขณะนี้!

หลังจากการทดสอบโหลดมีหลายสิ่งที่คุณสามารถทำได้เพื่อปรับปรุงประสิทธิภาพโดยรวม (คำขอต่อวินาที) และทำให้เว็บเซิร์ฟเวอร์มีเสถียรภาพมากขึ้นภายใต้การโหลดที่มากขึ้น (เช่นการเพิ่ม-nและ-cแนวโน้มที่จะทำให้ Apache ขัดข้อง) คุณสามารถอ่านเกี่ยวกับที่นี่:

โหลดการทดสอบ Apache กับ AB (Apache Bench)


9

ขั้นตอนในการตั้งค่า Apache Bench (AB) บน windows (IMO - แนะนำ)

ขั้นตอนที่ 1 - ติดตั้ง Xampp
ขั้นตอนที่ 2 - เปิด CMD
ขั้นตอนที่ 3 - ไปที่ปลายทางที่ม้านั่ง apache ( cd C:\xampp\apache\bin) จาก CMD
ขั้นตอนที่ 4 - วางคำสั่ง ( ab -n 100 -c 10 -k -H "Accept-Encoding: gzip, deflate" http://localhost:yourport/)
ขั้นตอนที่ 5 - รอมัน คุณทำเสร็จแล้ว


มันไม่ทำงาน ... ฉันได้รับข้อผิดพลาดนี้: การเปรียบเทียบ localhost (อดทน) ... apr_socket_recv: การเชื่อมต่อถูกปฏิเสธ (111)
Vijaysinh Parmar

แทนที่ localhost โดย 127.0.0.1
akshaynagpal

3

ฉันยังอยากรู้อยากเห็นถ้าฉันสามารถวัดความเร็วของสคริปต์ของฉันด้วย apache abs หรือสคริปต์วัด php ที่สร้าง / ทำลายหรือส่วนขยาย php

สองรายการสุดท้ายล้มเหลวสำหรับฉัน: มันเป็นค่าประมาณ หลังจากนั้นฉันคิดว่าจะลอง "ab" และ "abs"

คำสั่ง "ab -k -c 350 -n 20000 example.com/" สวยงามเพราะมันง่ายกว่า!

แต่มีใครคิดที่จะ "localhost" บนเซิร์ฟเวอร์ apache ใด ๆ เช่น www.apachefriends.org?

คุณควรสร้างโฟลเดอร์เช่น "bench" ใน root ที่คุณมี 2 ไฟล์: ทดสอบ "bench.php" และการอ้างอิง "void.php"

และจากนั้น: เปรียบเทียบมัน!

bench.php

<?php

for($i=1;$i<50000;$i++){
    print ('qwertyuiopasdfghjklzxcvbnm1234567890');
}
?>

void.php

<?php
?>

บนเดสก์ท็อปของคุณคุณควรใช้ไฟล์. bat (ใน Windows) ดังนี้:

bench.bat

"c:\xampp\apache\bin\abs.exe" -n 10000 http://localhost/bench/void.php
"c:\xampp\apache\bin\abs.exe" -n 10000 http://localhost/bench/bench.php
pause

ตอนนี้ถ้าคุณใส่ใจอย่างใกล้ชิด ...

สคริปต์ช่องว่างไม่ได้ให้ผลลัพธ์เป็นศูนย์ !!! บทสรุปคือ: จากผลลัพธ์ที่สองผลลัพธ์แรกควรลดลง !!!

ที่นี่ฉันได้รับ:

c:\xampp\htdocs\bench>"c:\xampp\apache\bin\abs.exe" -n 10000 http://localhost/bench/void.php
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache/2.4.33
Server Hostname:        localhost
Server Port:            80

Document Path:          /bench/void.php
Document Length:        0 bytes

Concurrency Level:      1
Time taken for tests:   11.219 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2150000 bytes
HTML transferred:       0 bytes
Requests per second:    891.34 [#/sec] (mean)
Time per request:       1.122 [ms] (mean)
Time per request:       1.122 [ms] (mean, across all concurrent requests)
Transfer rate:          187.15 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       1
Processing:     0    1   0.9      1      17
Waiting:        0    1   0.9      1      17
Total:          0    1   0.9      1      17

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      1
  95%      2
  98%      2
  99%      3
 100%     17 (longest request)

c:\xampp\htdocs\bench>"c:\xampp\apache\bin\abs.exe" -n 10000 http://localhost/bench/bench.php
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache/2.4.33
Server Hostname:        localhost
Server Port:            80

Document Path:          /bench/bench.php
Document Length:        1799964 bytes

Concurrency Level:      1
Time taken for tests:   177.006 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      18001600000 bytes
HTML transferred:       17999640000 bytes
Requests per second:    56.50 [#/sec] (mean)
Time per request:       17.701 [ms] (mean)
Time per request:       17.701 [ms] (mean, across all concurrent requests)
Transfer rate:          99317.00 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       1
Processing:    12   17   3.2     17      90
Waiting:        0    1   1.1      1      26
Total:         13   18   3.2     18      90

Percentage of the requests served within a certain time (ms)
  50%     18
  66%     19
  75%     19
  80%     20
  90%     21
  95%     22
  98%     23
  99%     26
 100%     90 (longest request)

c:\xampp\htdocs\bench>pause
Press any key to continue . . .

90-17 = 73 ผลลัพธ์ที่ฉันคาดหวัง!


2

โหลดการทดสอบ API ของคุณโดยใช้เพียง ab ไม่เพียงพอ อย่างไรก็ตามฉันคิดว่ามันเป็นเครื่องมือที่ยอดเยี่ยมที่จะให้ความคิดพื้นฐานแก่คุณว่าไซต์ของคุณมีประสิทธิภาพอย่างไร

หากคุณต้องการใช้คำสั่ง ab ในการทดสอบหลายปลายทาง API ด้วยข้อมูลที่แตกต่างกันทั้งหมดในเวลาเดียวกันในพื้นหลังคุณต้องใช้คำสั่ง "nohup" มันรันคำสั่งใด ๆ แม้ว่าคุณจะปิดเทอร์มินัล

ฉันเขียนสคริปต์อย่างง่ายที่ทำให้กระบวนการทั้งหมดเป็นอิสระอย่าลังเลที่จะใช้: http://blog.ikvasnica.com/entry/load-test-multiple-api-endpoints-concurrently-use-this-simple-shell-script

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.