Thursday, 30 August 2007

วัดประสิทธิภาพของ Web Application ด้วย JMeter

jmeterเคยสงสัยกันไหมครับว่า web applciation ที่เราพัฒนาขึ้นมานั้นมีประสิทธิภาพมากน้อยแค่ไหน? ผมเองก็คนนึงละครับที่สงสัยว่าเราจะวัดประสิทธิภาพออกมาอย่างไร?

ถ้าถามว่าแล้วมันสำคัญยังไง?
เมื่อเราออกไปพัฒนาระบบ web application ให้กับลูกค้า เราเป็นนักพัฒนา แค่เขียน web application ตามที่ลูกค้าต้องการก็เพียงพอแล้วแล้ว ไม่ต้องสนใจเรื่องประสิทธิภาพอะไรทั้งนั้น ถ้าคิดอย่างนี้กันอยู่ก็ผิดแล้วละครับ

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

หลายคนอาจจะละเลยแล้วก็โทษไปที่ server ช้าบ้างละ โทษที่ database tuning ไม่ดีบ้างละ โทษที่ระบบ network ออกแบบมาไม่ดีบ้างละ แล้วในที่สุดแล้วลูกค้าก็จะมาสงสัยที่ web application ที่เราพัฒนาครับ
(โดนจนได้ งานเข้าละครับ -_-'')

แล้วถ้ามันเกิดขึ้นเราจะมีวิธีป้องกันตัวเองยังไง? ถ้าเราจะบอกว่าไม่เกี่ยวกับ web application ของเราลูกค้าจะเชื่อหรอครับ ดังนั้นเราจึงต้องมีการ protect ตัวเองเหมือนกัน

เห็นรึยังครับว่ามันสำคัญครับ ว่าเราพัฒนา web application ออกมาได้ดีแค่ไหน? รองรับปริมาณ request ต่างๆได้มากน้อยแค่ไหน? รวมถึงยังวัดประสิทธิภาพของ server สามารถในการรองรับปริมาณ traffic ที่เข้าออกมาน้อยแค่ไหน? ก่อนที่เราจะนำไปใช้งานจริง

แล้วเราจะวัดประสิทธิภาพของ web application อย่างไร?
ผมเลยหา software ที่จะช่วยเรื่องทดสอบประสิทธิภาพของ application ที่สำคัญต้องฟรีด้วยครับเพื่อให้ผู้ใช้งาน หรือนักพัฒนาทั้งหลายสามารถนำไปใช้ได้อย่างสบายใจ แล้วผมก็เจออยู่ตัวนึง ที่ใช้งานง่าย (มากๆ) เป็น opensource และฟรีด้วย ประสิทธิภาพของตัว software ดีในระดับนึงเลยทีเดียว software ตัวนี้ชื่อว่า JMeter

Software ตัวนี้เป็นหนึ่งในหลาย ๆ project ของ Apache พัฒนาโดยใช้ภาษา java 100% (project ที่น่าสนใจของ Apache มีที่น่าสนใจอยู่หลายตัวครับ ก่อนหน้านี้ก็เพิ่ง review project อีกตัวนึงของ Apache ที่ทำหน้าที่เป็น O/R Mapping ที่ชื่อ iBATIS หรือก่อนหน้านี้ Struts Framework ที่เป็น J2ee Framework)
แต่อย่าเข้าใจผิดนะครับว่า web application จะต้องพัฒนาด้วย JSP servlet เท่านั้น มันใช้งานได้กับทุกภาษาครับที่ทำงานอยู่บน HTTP server

ด้วยเหตุผลต่างๆที่กล่าวมาข้างต้น ผมจึง Review JMeter software load test ตัวนี้ครับ

1. เตรียม web application ที่จะทำการทดสอบให้เรียบร้อย จากนั้น download JMeter เวอร์ชั่นล่าสุดได้ที่ JMeter website และเราต้องมี JDK ในเครื่องด้วยตั้งแต่ JDK 1.4 เป็นต้นไป

2. แตกไฟล์ที่โหลดมาก่อนจากนั้นเข้าไปที่ directory /bin แล้ว run JMeter สำหรับ windows ให้เรียกไฟล์ jmeter.bat แต่ถ้าเป็น linux ให้เรียก jmeter.sh

jmeter main windowsรูปที่ 1 JMeter main window

  • Functional Test Mode ถ้าเรา checkbox ที่นี่ หมายความว่า JMeter จะเก็บ record ข้อมูลต่างๆที่ return จาก server ของแต่ละการทดสอบ

3. ถัดมาให้เรา add Thread Group โดยคลิกขวาที่ Test Plan > Add > Thread Group ซึ่ง Thread Group เปรียบเสมือน users ที่เราจะจำลองพฤติกรรมการทำงานขึ้นมาครับ

jmeter thread groupรูปที่ 2 JMeter Thread Group

  • Name หมายถึงชื่อของ thread group เราสามารถตั้งได้ที่ตรงนี้ครับ ในที่นี้ผมตั้งจำนวน users ไว้ 2
  • Number of Threads (users) หมายถึงจำนวน users ที่เราต้องการจะทำการทดสอบ
  • Ramp-Up Period (inseconds) หมายถึงค่าความเร็ว(วินาที)ที่เราต้องการให้สร้าง Number of Threads (users) ขึ้นมาใหม่ ตัวอย่างเช่นถ้าเราใส่ Number of Thread (users):10 และใส่ Ramp-Up Period:20 ลงไปหมายความว่าอีก 20 วินาที JMeter จะสร้าง users ขึ้นมา 10 threads หรือถ้าตั้งเป็น 0 หมายความว่าจะสร้าง user ทั้งหมดทันทีที่ start หรือจบจาก loop
  • Loop Count หมายถึงจำนวนรอบที่ต้องการทำการทดสอบ ในที่นี้ผมตั้งไว้ 3 หมายความว่าผมมี user 2 คนและต้องการให้วนการทำงานซ้ำกัน 3 ครั้ง รวมเป็น 2x3=6
4. จากนั้นให้ add Http Request Defaults โดยคลิกขวาที่ Thread Group > Add > Config Element > HTTP Request Defaults สร้าง Http Request ซึ่งตรงนี้สร้างเป็นต้นแบบให้ทุก request
ที่เราจะสร้างขึ้นต่อจากนี้ใช้ค่าต้นแบบตามนี้

jmeter http request defaultsรูปที่ 3 JMeter Http Request Defaults

  • Server Name or IP ตรงนี้ให้เราใส่ ip หรือ url ของ server ที่เราจะทำการทดสอบ ในที่นี้ผมจะทดสอบกับ server ของเครื่องตัวเองครับ
  • Port Number ให้ใส่หมายเลข port ของ http server พอดีผมจะทดสอบกับ tomcat เลยใส่ 8080

5. จากนั้น add Http Request โดยคลิกขวาที่ Thread Group > Add > Sampler > HTTP Request ตรงนี้เป็นการเพิ่ม request ที่เราต้องการจะทำการทดสอบ

jmeter http requestรูปที่ 4 JMeter Http Request
  • Path หมายถึง Path ที่เราจะทำการเรียกหรือเข้าถึง page ที่ต้องการทำการทดสอบ
  • Send Parameters With the Request หมายถึง parameter ต่างๆที่เราต้องการส่งไปตอนที่เราเรียกหน้า page ที่จะทดสอบด้วยซึ่งเราสามารถ Add เข้าไปเพิ่มได้เลย
  • Method หมายถึงวิธีการส่งค่า parameter ต่างๆมีทั้งแบบ get และแบบ post
6. จากนั้น add Graph Results โดยคลิกขวาที่ Thread Group > Add > Listener > Graph Results เพื่อใช้แสดงผลลัพธ์ของการทำงาน่ในรูปแบบ graph ซึ่งตรงนี้เราสามารถ add ผลลัพธ์ที่เราต้องการ
ในรูปแบบต่างซึ่งมีทั้งเป็น text, table และ graph

jmeter graph resultsรูปที่ 5 ผลลัพธ์ที่ได้หลังจากทำการวัดประสิทธิภาพ

ซึ่งผลลัพธ์ที่ได้เราจะนำไปวิเคราะห์ตามที่เราต้องการ ซึ่งค่าที่ได้ออกมามีดังนี้
  • Average msค่าเฉลี่ยเวลาโดยรวม ที่ส่ง request ไปหา server
  • Median ms ค่าเวลากึ่งกลาง
  • Deviation ms การกระจายตัวถ้ากระจายตัวไม่มากแสดงว่าดีง่ายต่อการควบคุม
  • Throughput ms ค่าประมวลผล request ต่อนาทีของ Server
เมื่อทดสอบแล้วเราสามารถ save รูปผลลัพธ์ที่ได้ออกมานี้เป็นไฟล์รูปได้โดยการคลิกขวาที่ Graph Results > Save Node As Image ต่อจากนี้คุณอาจจะเพิ่ม View Results Tree เอาไว้เพื่อดูผลลัพธ์หน้า page ที่คุณทำการทดสอบได้ครับว่าเพจนั้นโหลดขึ้นมาแล้วหรือยัง

jmeter result treeรูปที่ 6 JMeter View Results Tree

จริงๆแล้ว JMeter สามารถวัดประสิทธิภาพของ web application เราได้ละเอียดและลึกกว่านี้เช่นสามารถวัดประสิทธิภาพของ web application ขณะเชื่อมต่อกับ database ได้ แต่ผมไม่มีเวลามากพอที่จะอธิบายจนหมดได้ ยังไงถ้าสนใจลองอ่านเพิ่มเติมกันได้นะครับที่ JMeter User Manual

นอกจาก JMeter แล้วยังมี loadtest tools ตัวอื่นๆอีกนะครับ
  • e-TEST suite http://www.empirix.com
  • Autobench http://www.xenoclast.org/autobench
  • Grinder http://grinder.sourceforge.net
  • LoadRunner http://www.mercury.com/us/products/performance-center/loadrunner
  • Micrisoft Stress Test http://support.microsoft.com/kb/231282
  • QEngine http://www.adventnet.com/products/qengine/index.html
  • Badboy http://www.badboy.com.au
  • InFraRED http://infrared.sourceforge.net/versions/latest
  • OpenSTA http://www.opensta.org

8 comments:

OHM said...

ดีครับ เดี๋ยววันหลังจะได้ลองดูมั่ง

blogger said...

ใช้กับภาษาอื่นที่ไม่ใช่ java ได้มั้ยครับ?

tofu said...

ohm : ลองเลยครับ JMeter ยังมี function ที่น่าสนอีกเยอะครับ
blogger :ได้ครับจะเขียนภาษาอะไรก็ได้ php, asp ฯลฯ ขอแค่ใช้งานอยู่บน http

Anonymous said...

หลายคนอาจจะละเลยแล้วก็โทษไปที่ server ช้าบ้างละ โทษที่ database tuning ไม่ดีบ้างละ โทษที่ระบบ network ออกแบบมาไม่ดีบ้างละ แล้วในที่สุดแล้วลูกค้าก็จะมาสงสัยที่ web application ที่เราพัฒนาครับ
(โดนจนได้ งานเข้าละครับ -_-'')


ผมขัดใจตรงข้อความนี้นิดนึงครับ

การวัดประสิทธิภาพโดยภาพรวมของ JMeter เนี่ย ผลที่ได้มันต้องขึ้นอยู่กับ performance ของ Server , Database Server แบะ Network และ I/O อีกมาหมาย

คำถามคือ เราจะวัดอะไร ถ้าวัดแค่ เว็บเดียว ?

เหมือนที่ผมเคยทำคือวัด performance ของ Web Service ที่พัฒนาด้วย .net และ java เพื่อหา ผลพัพท์แล้วเอามาคำนวนทางสถิติ เป็นต้น ครับ

youdome.org

tofu said...
This comment has been removed by the author.
tofu said...

dome: การวัดประสิทธิภาพเรามาวัดกันแค่ web application ของเราอย่างเดียวคงไม่ได้หรอกครับ ถ้าอยากทดสอบอย่างละเอียดเราคงต้องมาดูกันทุกจุดที่ integrate กัน
ที่ตอบตรงกับสิ่งที่ dome ต้องการรึป่าวเพราะไม่ค่อยเข้าใจคำถาม

ปล. เห็นหายไปนานที่แท้ไปสร้างเว็บใหม่นี่เอง :P

aoi said...

หวัดดีค่ะ
อยากขอความรู้เรื่อง jmeter เพิ่มหน่อยค่ะเพราะว่าที่แผนกกะลังสนใจเจ้าตัวนี้ คือว่านอกจาก test web application แล้วสามารถที่จะนำเข้า CSV file เข้ามาตรวจสอบได้ไหมค่ะ ถ้าได้ทำยังไง คือแบบว่าไม่เคยใช้โปรแกรมพวกนี้มาก่อนเลยคะ

ขอบคุณคะ

Sirotron Chounchom said...

ขอบคุณมากๆค่ะพี่
มีเรื่องอยากถามด้วยเช่นกันค่ะ
คือมี web service แล้วแหละมี request file ประเภท xml ประมาณ 100 file ใน 1 โฟลเดอร์ อยากจะทราบว่า ให้มัน run รวดทีเดียวได้รึเปล่าคะ เพื่อเก็บค่า response

ขอบคุณค่ะ