การเตรียมการทดสอบไดนามิกเพจ

ในบทนี้เราจะเข้าใจการเตรียมการที่จำเป็นสำหรับการทดสอบไดนามิกเพจ เว็บเพจไดนามิกฝั่งเซิร์ฟเวอร์คือหน้าเว็บที่ถูกควบคุมโดยแอ็พพลิเคชันเซิร์ฟเวอร์ที่ประมวลผลสคริปต์ฝั่งเซิร์ฟเวอร์ apache bench สามารถโหลดทดสอบได้เฉพาะเว็บเพจไดนามิกฝั่งเซิร์ฟเวอร์เท่านั้น

ระดับการทำงานพร้อมกันและจำนวนคำขอทั้งหมด

ระดับการทำงานพร้อมกันควรต่ำกว่าจำนวนคำขอทั้งหมด

$ ab -l -r -n 30 -c 80 -k -H "Accept-Encoding: gzip, deflate"  http://127.0.0.1:8000/

Output

ab: Cannot use concurrency level greater than total number of requests
Usage: ab [options] [http[s]://]hostname[:port]/path

การใช้ธง

ในส่วนนี้เราจะอธิบายการใช้แฟล็กที่สำคัญกับคำสั่ง ab เราจะใช้เงื่อนไขตัวเลือกและแฟล็กสลับกัน

Verbose -v

สามารถใช้อ็อพชัน verbose เพื่อวิเคราะห์และดีบักหากมีคำขอที่ล้มเหลวหลายรายการ ข้อบ่งชี้ทั่วไปของความล้มเหลวของการทดสอบโหลดคือการทดสอบเสร็จสิ้นเร็วมากและให้ตัวเลขที่ดีสำหรับการร้องขอต่อวินาที แต่มันจะเป็นเกณฑ์มาตรฐานที่ผิด ในการระบุความสำเร็จหรือความล้มเหลวคุณสามารถใช้ไฟล์-v 2ตัวเลือกซึ่งจะถ่ายโอนเนื้อหาและส่วนหัวของการตอบสนองแต่ละรายการไปยังเอาต์พุตเทอร์มินัล คำสั่งต่อไปนี้แสดงถึงกรณีการใช้งาน -

$ ab -n 1 -v 2 http://www.generic-example-URL.com/

Output

LOG: header received:
HTTP/1.0 200 OK
…
Content-Length: 2548687

แน่นอนว่าหากคุณกำลังทดสอบการตอบสนองของตัวแปรหรือส่งคืนรหัส HTTP ที่ไม่ใช่ 200 ในกรณีที่เกิดข้อผิดพลาดใด ๆ คุณควรละเว้นการตรวจสอบความยาวด้วย -lตัวเลือก อีกไม่นานเราจะเห็น HTTP ที่ไม่ใช่ 200 เมื่อเราจะเปิดตัวแอปพลิเคชัน web2py ในบทต่อ ๆ ไป

รักษาชีวิต -k

เมื่อไคลเอนต์ส่งคำขอ HTTP การเชื่อมต่อจะถูกสร้างขึ้นไปยังเซิร์ฟเวอร์เซิร์ฟเวอร์จะส่งการตอบสนองและการเชื่อมต่อจะถูกปิดหลังจากที่ส่งคำขอแล้ว วงจรนี้ดำเนินต่อไปตามคำขอแต่ละครั้ง อย่างไรก็ตามด้วยการตั้งค่า keep-alive (หรือที่เรียกว่าการเชื่อมต่อแบบต่อเนื่อง) ไคลเอ็นต์จะรักษาการเชื่อมต่อ TCP พื้นฐานไว้เพื่ออำนวยความสะดวกในการร้องขอและตอบสนอง ซึ่งจะช่วยลดเวลาในการเริ่มต้นการเชื่อมต่อที่ช้าและเสียค่าใช้จ่ายซึ่งอาจมีอยู่

ความยาวเอกสารแปรผัน -l

หากหน้าเว็บมีความยาวผันแปรคุณควรใช้ตัวเลือกนี้ -l. Apache Bench จะไม่รายงานข้อผิดพลาดหากความยาวของการตอบกลับไม่คงที่ สิ่งนี้มีประโยชน์สำหรับไดนามิกเพจ

การใช้ตัวเลือก -r

วิธีบังคับไม่ให้ ab ออกจากการได้รับข้อผิดพลาด? คุณควรใช้ตัวเลือก-r. หากไม่มีตัวเลือกนี้การทดสอบของคุณอาจพังทันทีที่คำขอใด ๆ เกิดข้อผิดพลาดของซ็อกเก็ต อย่างไรก็ตามด้วยตัวเลือกนี้ข้อผิดพลาดจะถูกรายงานในหัวข้อข้อผิดพลาดที่ล้มเหลว แต่การทดสอบจะดำเนินต่อไปจนจบ

การใช้ตัวเลือก -H

ตัวเลือกนี้ใช้เพื่อเพิ่มบรรทัดส่วนหัวโดยพลการ โดยทั่วไปอาร์กิวเมนต์จะอยู่ในรูปแบบของบรรทัดส่วนหัวที่ถูกต้องซึ่งมีคู่ค่าฟิลด์ที่คั่นด้วยโคลอน (กล่าวคือ“ ยอมรับการเข้ารหัส: zip / zop; 8 บิต”)

การใช้ตัวเลือก -C

ในส่วนต่อไปนี้เราจะเรียนรู้โดยละเอียดเกี่ยวกับการใช้ตัวเลือกข้างต้นร่วมกับตัวเลือกในการใช้ค่าคุกกี้นั่นคือ -Cตัวเลือก โดยทั่วไปตัวเลือก -C จะอยู่ในรูปของไฟล์name = valueคู่. ฟิลด์นี้สามารถทำซ้ำได้

การใช้ Session Cookie กับ Apache Bench

เพื่อให้เข้าใจวิธีใช้คุกกี้กับ Apache Bench เราจำเป็นต้องมีหน้าเว็บที่พยายามตั้งค่าคุกกี้ ตัวอย่างที่ดีมากคือแอปพลิเคชัน web2py ซึ่งเป็นเฟรมเวิร์กเว็บหลาม

การติดตั้ง web2py

เรากำลังจะติดตั้ง web2py app python อื่นอย่างรวดเร็ว คุณสามารถอ่านเพิ่มเติมเกี่ยวกับวิธีการที่จะใช้ในweb2py กรอบภาพรวม

โดยทั่วไปแล้ว Python จะถูกติดตั้งโดยค่าเริ่มต้นบนเซิร์ฟเวอร์ Ubuntu และ Debian ดังนั้นจึงมีคุณสมบัติตรงตามข้อกำหนดหนึ่งเพื่อเรียกใช้ web2py ได้สำเร็จ

อย่างไรก็ตามเราจำเป็นต้องติดตั้งแพคเกจคลายซิปเพื่อแยกไฟล์ต้นฉบับของ web2py จากไฟล์ zip ที่เราจะดาวน์โหลด -

$ sudo apt-get update
$ sudo apt-get install unzip

ให้เราได้รับ web2py framework จากเว็บไซต์ของโครงการ เราจะดาวน์โหลดลงในโฟลเดอร์บ้านของเรา -

$cd ~
$ wget http://www.web2py.com/examples/static/web2py_src.zip

ตอนนี้เราสามารถคลายซิปไฟล์ที่เราเพิ่งดาวน์โหลดและย้ายเข้าไปข้างใน -

$ unzip web2py_src.zip
$ cd web2py

ในการเรียกใช้ web2py คุณไม่จำเป็นต้องติดตั้ง เมื่อคุณอยู่ในไดเร็กทอรี web2py คุณสามารถเรียกใช้งานได้โดยพิมพ์คำสั่งต่อไปนี้ -

$python web2py.py

หากทุกอย่างสำเร็จคุณจะเห็นผลลัพธ์ต่อไปนี้ซึ่งคุณจะถูกขอให้เลือกรหัสผ่านสำหรับ UI การดูแลระบบ -

web2py Web Framework
Created by Massimo Di Pierro, Copyright 2007-2017
Version 2.14.6-stable+timestamp.2016.05.10.00.21.47
Database drivers available: sqlite3, imaplib, pymysql, pg8000
WARNING:web2py:GUI not available because Tk library is not installed
choose a password:

please visit:
        http://127.0.0.1:8000/
use "kill -SIGTERM 23904" to shutdown the web2py server

อย่างไรก็ตามคุณต้องทราบว่าเว็บอินเทอร์เฟซที่เปิดตัวนั้นสามารถเข้าถึงได้บนเครื่องภายในเท่านั้น

จากผลลัพธ์คุณสามารถเข้าใจได้ว่าหากต้องการหยุดเว็บเซิร์ฟเวอร์คุณจะต้องพิมพ์“ CTRL-C” ในเทอร์มินัลทันที ในทางกลับกันหากต้องการหยุดเซิร์ฟเวอร์ web2py บนเทอร์มินัลอื่นที่เกี่ยวข้องกับ VPS เดียวกันคุณสามารถแทรกคำสั่ง kill -SIGTERM <PID> โดยที่ <PID> เป็น ID กระบวนการสำหรับเซิร์ฟเวอร์ web2py ซึ่งในกรณีนี้คือ 23904.

คุกกี้เซสชันจาก web2py

หากหน้าสามารถเข้าถึงได้โดยผู้ใช้ที่ลงชื่อเข้าใช้ไม่สามารถเข้าถึงได้โดยตรงจากหน้าเข้าสู่ระบบในกรณีนี้คุณสามารถใช้ -Cธง. แฟล็กนี้กำหนดคุกกี้สำหรับคำสั่ง ab แต่คุณต้องได้รับค่าของคุกกี้ตัวระบุเซสชันจากเซสชันที่ถูกต้อง จะไปได้อย่างไร? บทช่วยสอนออนไลน์ต่างๆจะนำคุณไปสู่เครื่องมือสำหรับนักพัฒนาเบราว์เซอร์ Chrome (หรือ Mozilla) แต่ในกรณีทดสอบของเราเนื่องจากแอปพลิเคชันพร้อมใช้งานบนบรรทัดคำสั่งเท่านั้นเราจะใช้เบราว์เซอร์ lynx เพื่อรับค่า

ให้เราได้รับค่าคุกกี้ของเซสชันก่อน เปิดเทอร์มินัลอื่นแล้วพิมพ์คำสั่งต่อไปนี้ -

$ lynx http://127.0.0.1:8000/

เพื่อตอบสนองต่อคำสั่งดังกล่าว lynx จะขออนุญาตจากคุณเพื่อยอมรับคุกกี้จากเซิร์ฟเวอร์ web2py ดังที่แสดงในภาพด้านล่าง

จดค่าคุกกี้ก่อนพิมพ์ yเพื่อยอมรับคุกกี้ ตอนนี้เทอร์มินัลจะมีลักษณะคล้ายกับภาพต่อไปนี้ - เว็บไซต์บนเทอร์มินัล!

เมื่อได้รับค่าคุกกี้แล้วเราจะทำการทดสอบ ab เพื่อที่เราจะต้องเปิดเทอร์มินัลที่สาม (ดูภาพด้านล่าง) -

ตอนนี้ให้เราใช้แฟล็ก -C ในเทอร์มินัลที่สาม -

$ ab -n 100 -c 10 -C session_name = 127.0.0.1-643dad04-3c34  http://127.0.0.1:8000/

เอาต์พุต

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done


Server Software:        Rocket
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /
Document Length:        66 bytes

Concurrency Level:      10
Time taken for tests:   0.051 seconds
Complete requests:      100
Failed requests:        0
Non-2xx responses:      100
Total transferred:      27700 bytes
HTML transferred:       6600 bytes
Requests per second:    1968.12 [#/sec] (mean)
Time per request:       5.081 [ms] (mean)
Time per request:       0.508 [ms] (mean, across all concurrent requests)
Transfer rate:          532.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    2   0.9      2       4
Processing:     0    3   0.9      3       5
Waiting:        0    2   1.1      2       4
Total:          4    5   0.7      5       7

Percentage of the requests served within a certain time (ms)
  50%      5
  66%      5
  75%      5
  80%      6
  90%      6
  95%      6
  98%      7
  99%      7
 100%      7 (longest request)

จากผลลัพธ์ด้านบนเราสังเกตเห็นหลายประเด็น อันดับแรก web2py ใช้เว็บเซิร์ฟเวอร์Rocket นอกจากนี้เรายังทราบด้วยว่าเราได้รับ 'คำตอบที่ไม่ใช่ 2xx' นอกเหนือจากหัวข้อที่กล่าวถึงก่อนหน้านี้ในผลลัพธ์ โดยทั่วไปโปรโตคอล Http จะตอบสนองต่อคำขอโดยใช้รหัสตอบกลับและสิ่งใดก็ตามที่อยู่ในช่วง 200 วินาทีหมายถึง 'โอเค' และส่วนที่เหลือสอดคล้องกับปัญหาบางอย่าง ตัวอย่างเช่น 400s เป็นข้อผิดพลาดเกี่ยวกับทรัพยากรเช่นไม่พบไฟล์ 404 500s สอดคล้องกับข้อผิดพลาดของเซิร์ฟเวอร์ ในกรณีของเราทันทีไม่มีข้อผิดพลาดใด ๆ ยกเว้นเมื่อเราใช้ตัวเลือก -C สามารถระงับได้โดยใช้ตัวเลือก -l ตามที่อธิบายไว้แล้ว

กำลังตรวจสอบหน้าผู้ดูแลระบบ

ในส่วนนี้เราจะเข้าใจวิธีการตรวจสอบหน้าผู้ดูแลระบบ เพื่อจุดประสงค์ในการเปรียบเทียบให้เราทดสอบ URL อื่นของแอปพลิเคชัน web2py -

$ ab -n 100 -c 10 session_name = 127.0.0.1-643dad04-3c34  http://127.0.0.1:8000/admin

เอาต์พุต

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done


Server Software:        Rocket
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /admin
Document Length:        8840 bytes

Concurrency Level:      10
Time taken for tests:   2.077 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      926700 bytes
HTML transferred:       884000 bytes
Requests per second:    48.14 [#/sec] (mean)
Time per request:       207.749 [ms] (mean)
Time per request:       20.775 [ms] (mean, across all concurrent requests)
Transfer rate:          435.61 [Kbytes/sec] received

Connection Times (ms)
          min  mean[+/-sd] median   max
Connect:        0    1   3.2      0      12
Processing:    62  204  52.2    199     400
Waiting:       61  203  52.0    199     400
Total:         62  205  54.3    199     411

Percentage of the requests served within a certain time (ms)
  50%    199
  66%    211
  75%    220
  80%    226
  90%    264
  95%    349
  98%    381
  99%    411
 100%    411 (longest request)

โดยเฉพาะอย่างยิ่งคุณควรสังเกตสถิติที่เกี่ยวข้องในส่วน "เวลาในการเชื่อมต่อ" และ "เปอร์เซ็นต์ของคำขอที่ให้บริการ ... " ของ http://127.0.0.1:8000/ และ http://127.0.0.1:8000/admin. มีความแตกต่างกันอย่างมาก

ใช้ Timelimit Option

โดยทั่วไปตัวเลือก Timelimit เป็นตัวเลือกที่ยุ่งยาก ให้เราเข้าใจสิ่งนี้จากคู่มือของ abซึ่งค่อนข้างอธิบายได้ -

-t timelimit
Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally.
Use this to benchmark the server within a fixed total amount of time.
Per default there is no timelimit.

ให้เราทำการทดสอบด้วยตัวเลือกนี้ เราจะสังเกตข้อสังเกตของเราหลังจากผ่านผลลัพธ์ -

$ ab -n 100 -c 10 -t 60   http://127.0.0.1:8000/

เอาต์พุต

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:        Rocket
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /
Document Length:        66 bytes

Concurrency Level:      10
Time taken for tests:   22.547 seconds
Complete requests:      50000
Failed requests:        0
Non-2xx responses:      50000
Total transferred:      13850000 bytes
HTML transferred:       3300000 bytes
Requests per second:    2217.61 [#/sec] (mean)
Time per request:       4.509 [ms] (mean)
Time per request:       0.451 [ms] (mean, across all concurrent requests)
Transfer rate:          599.88 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   0.8      2       8
Processing:     0    2   3.2      2     218
Waiting:        0    2   3.2      2     218
Total:          2    4   3.1      4     220

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      4
  80%      5
  90%      5
  95%      5
  98%      7
  99%      8
 100%    220 (longest request)

โปรดสังเกตว่าเอาต์พุตจะแสดงอ็อพชันนี้แทนที่จำนวนคำร้องขอที่ระบุโดย -nตัวเลือกและดำเนินการต่อไม่เกินคำขอ 50K อย่างไรก็ตามเนื่องจากคำขอได้รับการจัดการอย่างรวดเร็ว ab จึงยุติทันทีที่ทำเครื่องหมาย 50k ได้ - ภายใน 22 วินาที (ดูหัวข้อเวลาที่ใช้สำหรับการทดสอบ) ในกรณีทันที

คุณสามารถทดสอบคำสั่งเดียวกันแทนที่ http://127.0.0.1:8000/ ด้วย http://127.0.0.1:8000/admin (สมมติว่าเป็นแอปพลิเคชัน web2py ของเรา) หรือเว็บไซต์ของบุคคลภายนอกเช่น https://www.apache.org/ สังเกตความแตกต่างของสถิติ

รายการตรวจสอบก่อนทำการทดสอบโหลด

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

  • ตรวจสอบให้แน่ใจว่าไม่มีการโหลดโมดูล python เพิ่มเติม

  • เพื่อหลีกเลี่ยงการหมดพอร์ต TCP / IP โดยทั่วไปคุณควรรอ 2-3 นาทีก่อนที่จะย้ายไปทดสอบ ab อื่น

  • ตรวจสอบให้แน่ใจว่าจำนวนการเชื่อมต่อพร้อมกันต่ำกว่า Apache Worker Threads

  • คุณควรรีบูตเซิร์ฟเวอร์ก่อนทำการทดสอบอีกครั้งหาก Apache หรือ python ขัดข้อง