เมื่อวานว่าง ผมเลยได้ลงมือเขียนของที่อยากเขียนเสียที
ผมต้องการจะทดสอบว่าเว็บที่ทำขึ้นรับโหลดได้มาก/น้อยแค่ไหน ตอนแรกหา 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 มีคร่าว ๆ ที่ เว็บนี้นะครับ
กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น
DSL ดูเข้าใจง่ายดีครับ เดี๋ยวไว้ลองดู :D
ขอบคุณครับ ;)
ตอนนี้ยังไม่ได้ทำให้แต่ละ visitor ใช้ id ได้ เดี๋ยวจะลองทำ สงสัยว่าตรง string คงต้องให้ใส่เป็นประมาณ “user${id}” เอา แล้วตอนทำงานค่อย replace กับ @id อีกที เพราะว่าตอนประกาศ get, post มันเป็น class method หมด อ้างถึง @id ตรง ๆ ไม่ได้