web load testing tool ด้วย curl และ ruby

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

เมื่อวานว่าง ผมเลยได้ลงมือเขียนของที่อยากเขียนเสียที

ผมต้องการจะทดสอบว่าเว็บที่ทำขึ้นรับโหลดได้มาก/น้อยแค่ไหน ตอนแรกหา tool อยู่ โชคดีคุณ sirn แนะนำให้ลองใช้ siege ก็ใช้งานได้ดี แต่ว่าเวลาจะทำอะไรที่มันยุ่งขึ้นอีกนิด เช่นจะ post ไฟล์ มันจะยุ่งมาก (เท่าที่ผมลองดู) ผมก็เลยอยากได้ tool ที่มันง่ายสักหน่อย หา ๆ ดูไม่เห็น (อาจจะมีก็ได้) ทีนี้ ลอง ๆ เล่น cURL ดูก็พบว่าแทบจะทำงานได้อย่างที่ต้องการแล้ว ขาดก็แต่หน้าฉากที่ใช้ง่าย ๆ หน่อย ก็เลยลองนั่งเขียนเล่น ๆ ดู

ตอนแรก ก่อนจะทดสอบ เราก็จะเขียนลักษณะของผู้เยี่ยมชมเสียก่อน ว่าเขาจะเข้าดูหน้าไหน ทำอะไรบ้าง เขียนประมาณนี้

visitor "Viewer" do            # Visitor type should be Capitalized. It will be used as class name later.
  stores_cookies
 
  site_url "http://mysite"
 
  get "/"
  post "/login", {:login => 'guest', :password => 'hello-world'}
  post "/list"
  get "/"
end
 
visitor "Poster" do
  stores_cookies
 
  site_url "http://mysite"
 
  get "/"
  post "/login", {:login => 'user', :password => 'hello'}
  post "/list"
  post "/submit", {
    :image => {:type => :file, :data => 'picture.png'},
    'category' => 58
  }, :multipart => true
end

สังเกตว่านี่เป็น dsl บน Ruby นะครับ

เขียนเสร็จ สมมติว่าเซฟในแฟ้ม my_visitors.rb นะครับ ก็มาเรียกตัว runner

ruby runner.rb my_visitors Poster 10 Viewer 20 -t 60

เป็นการบอกว่าเราจะใช้ Poster 10 thread แล้วก็ Viewer 20 thread แล้วให้ทำงาน 60 วินาที เรียกแล้ว มันก็จะเริ่มทำงาน

Having 30 visitors
1: get /
2: get /
...
8: post /login
10: post /submit
5: post /login

Total time = 61.083966 sec.
Total requests = 1195
Trans. per sec = 19.5632353013883

ตอนนี้เวลารัน มันจะ system ไปเรียกใช้ Curl ผ่านทาง command line เลย ผมพยายามใช้ curb แต่ว่ามัน block thread ทำให้รันหลาย ๆ ตัวแล้วมันก็จะช้าเหมือนรัน thread เดียว ดู ๆ แล้วถ้าจะให้เรียก libcurl แล้วทำงานได้หลาย ๆ thread เลยคงต้องใช้ Curl::Multi ซึ่งท่าจะใช้ยากอยู่ ตอนนี้ก็เลยเรียก curl ผ่านทาง command line ตรง ๆ เอาก่อน

ปัญหาอีกอย่างที่เจอ (เกิดจากการต้องไปเรียก curl ด้วย command line โดยแท้) ก็คือเวลา thread มันตายแล้ว ผมต้องไปลบไฟล์ cookies กับ output ของมัน ทีนี้ บางทีมัน sync กันยังไงไม่ทราบ คือมันจะลบไม่ได้ (เหมือนว่าที่สั่ง system ไปเรียก curl ยังไม่จบการทำงาน) ผมเลยจัดการด้วยการ sleep 2 ไป ให้มันรอ (ตอนแรก sleep 1 มันไม่พอ) ตอนนี้ยังไม่ทราบว่าจะแก้อย่างไร

ลองดาวน์โหลดได้ที่นี่นะครับ: load_testing_0.01.tgz
ส่วน document มีคร่าว ๆ ที่ เว็บนี้นะครับ

sirn's picture

DSL ดูเข้าใจง่ายดีครับ เดี๋ยวไว้ลองดู :D

ขอบคุณครับ ;)

ตอนนี้ยังไม่ได้ทำให้แต่ละ visitor ใช้ id ได้ เดี๋ยวจะลองทำ สงสัยว่าตรง string คงต้องให้ใส่เป็นประมาณ “user${id}” เอา แล้วตอนทำงานค่อย replace กับ @id อีกที เพราะว่าตอนประกาศ get, post มันเป็น class method หมด อ้างถึง @id ตรง ๆ ไม่ได้

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น