ทำไมเราจะต้อง Performance Tuning (CPUร้องไห้แน้วนะ)
สวัสดีค่ะท่านผู้อ่านทุกๆท่าน
ในบทความนี้อยากจะมาแชร์ประสบการณ์ของทีม เกี่ยวกับการปรับ Tune Performance
และเหตุผลที่ว่า ทำไมเราจะต้องทำ Performance Tuning ด้วย ทั้งๆที่ระบบของเราทำงานได้ถูกต้องตามที่ User ต้องการทุกกกกกอย่าง ผ่านทั้ง SIT, UAT กันแล้ว จะยังต้องทดสอบอะไรกันอีกหรือ???
ขอเกริ่นก่อนว่า โครงการของเราผ่านการทดสอบ UAT2 และก็ได้ดำเนินเข้าสู่การทดสอบ NFT (Non-Functional Testing) หรือเรียกว่า
การทดสอบระบบ ในส่วนที่ไม่เกี่ยวกับการใช้งานโดยตรง ไม่ว่าจะเรื่อง Speed, Response Time, Endurance, Capacity ฯลฯ
พูดง่ายๆก็คือเป็นการทดสอบว่า ระบบที่เราพัฒนาขึ้นมานั้นมัน เร็วพอมั้ย อึดพอมั้ย คนใช้งานพร้อมๆกันได้เยอะมั้ย ประมาณนั้น
เนื่องจากว่าโครงการนี้เป็นโครงการค่อนข้างใหญ่ มีจำนวนข้อมูลมากถึงกว่า 15 ล้านนน!!
ณ วันแรกที่เมื่อเราได้ Migrate Data จำนวน 15 ล้านเข้าไปในระบบ
เพียงแค่เข้าระบบเพื่อทำการ Load Page หน้าแรก ก็ใช้เวลาเกือบจะนาที!
จากตอนแรกที่เราทดสอบกันบน Environment ที่เรา Develop กันใช้เวลาเพียงแค่ไม่ถึง 1 วินาที
พอเริ่มทำ Load Test ทดสอบการ Open Web และ Login ด้วย 10 User เปิดเข้ามาทุกๆ 5 วินาทีไปเรื่อยๆ ผลปรากฎว่า เราใช้เวลามากที่สุดถึง 30 วินาที !! (ขนาดใช้จ่ายตังรอสแกน 5 วินาทียังบ่นนาน ฮ่าาๆๆ)
ผลลัพท์ในช่วงแรกก่อนที่จะเริ่มปรับ Tune Performance ถ้าหากเราเป็น User เราก็คงจะไม่อยากใช้แล้ว
เพราะรอนานจนหลับ บางทีรอนานจนมัน Time Out ระบบตายบ้าง เจ๊งบ้าง ยังไม่ทันทำอะไรเลย ค้นหาทีบางทีรอ 30 นาทียังมี!!!
หาก Monitor ดู CPU Server ช่วง 7 วัน ทั้ง Database และ Application ก็จะมีจังหวะที่ Peek มากๆถึง 100% นี่ขนาดยังไม่ได้เริ่มทำ Load Test เลยนะ
หลังจากนั้นทีม ได้มีการปรับบางส่วนเช่นการ Load Page การ Login ไปบ้าง
ผลการจับเวลา Response Time (บางส่วน ยังไม่ครบทุกหน้าจอ) ก็แทบไม่ผ่าน SLA เลย ทั้งๆที่ใช้แค่ 1 Transaction เท่านั้น … ดูผลแล้วก็เศร้าใจนัก แดงเถือกขนาดนี้ …
ผลการทดสอบจับเวลา Response Time คร่าวๆที่ได้ สามารถบอกเราได้ดังนี้
หาก User 1 คน เข้ามาใช้งานในระบบ เริ่มตั้งแต่ Login และทำ Operation ต่างๆจนครบจบงานและ Logout ออกไป User จะต้องใช้เวลาอยู่ประมาณ 4–7 นาที
แต่…. นี่แค่ 1 คนเท่านั้นนะ
ในความเป็นจริงอาจจะมี User 30–40 คน เข้ามาใช้งานพร้อมกัน นั่นแปลว่าได้ เวลาอาจจะเพิ่มขึ้นไปถึง 30 เท่า !!!!
ผลลัพธ์ที่เกิดขึ้นทั้งหมดนั่น จึงเป็นเหตุผลที่ทำให้เราต้องทำ Performance Tuning
แล้วการทำ Performance Tuning เราต้องทำอะไรบ้างล่ะ ???
สรุปบทเรียนในการทำโครงการนี้มาได้ดังนี้ค่ะ
- การหาจุดที่ช้า หรือจุดที่เป็นคอขวด list มันออกมาว่ามีจุดไหนบ้าง เช่น การใช้ Tool ต่างๆ เช่น ดู report จาก AWR (สามารถอ่านได้จาก ที่นี่คลิกเลย !!) ,การ Debug log ที่ตัว Application จับเวลาเพื่อหาจุดที่ช้า ข้อนี้สำคัญ เพราะหากเราหาจุดไม่เจอก็ไม่รู้ว่าจะปรับตรงไหน และปรับอย่างไร
- การทำ Database Tuning ปรับการ Design ให้มีความซ้ำซ้อนน้อยที่สุด เช่น การสร้าง Index (ในข้อนี้เป็นการปรับที่ง่ายและกระทบน้อยที่สุดสำหรับเคสของทีมเรา และเห็นผลลัพธ์ที่ดีขึ้นค่ะ)
- การทำ Application Tuning ไม่ว่าจะเป็นการเขียน SQL ไม่ดี ทำให้เกิดการ Full Table Scan, การ Join หลาย Table เกินไป (โดยเฉพาะระบบที่มี Table ที่ซับซ้อนมาก), การใช้ Like (ยิ่งพวกที่เป็นการค้นหาต่างๆ), การใช้ OR ฯลฯ (ในข้อนี้ แน่นอนว่ามีผลกระทบเยอะที่สุดเพราะต้องแก้ Code และอาจจะส่งผลต่อ Functional)
- การทำ Server Tuning เช่นการปรับ Configuration ต่างๆ ที่ Server ไม่ว่าจะเป็น Transaction Timeout, Heap Memory, Transaction Pool ให้เพียงพอกับการใช้งาน
- การทำ Memory Tuning เช่น การปรับ Memory ให้เพียงพอกับการใช้งาน
- การทำ OS Tuning เช่น การปรับ CPU, I/O, Memory Utilization ให้เพียงพอกับการใช้งาน
เหตุผลที่จะต้องปรับในข้อที่ 5–6 เนื่องจาก Report AWR Suggest ให้เราทำการปรับ เพราะหากเราดูผล Monitor จาก Zabbix ก่อนและหลังปรับก็จะได้ดังรูปค่ะ
แต่การที่ CPU ไม่ถึง 100% มีอีกปัจจัยนอกจากการปรับ Tune แล้ว จะมีในเรื่องของการกระจายการยิง Load Test ให้ไม่อั้นจนเกินไปในช่วงแรกของการทดสอบด้วยค่ะ
หลังจากที่ทีมเราทำการปรับทั้ง 6 ข้อด้านบนเป็นเวลาร่วม 2 เดือน
ตอนนี้ก็ผ่านการทดสอบ NFT ไปได้เป็นที่เรียบร้อยแล้ว เย้!!
จากผลการทดสอบ Load Test รอบสุดท้าย ด้วยการยิง 40 Transactions เป็นเวลา 1 ชั่วโมง ก็ผ่าน SLA ทุกข้อ (แม้จะมี Fail อยู่ บ้างแต่เนื่องจากผลลัพธ์เกิน Spec ที่กำหนดไว้อยู่ที่ประมาณ 33 Transactions)
นี่ขนาดเพิ่งจะเริ่มพัฒนายังไม่ได้ใช้จริงเลยยังข้อมูลยังขนาดนี้
เพื่อนๆ ลองคิดตามดูว่าหาก User ใช้ระบบจริง แล้วยังมี Data ใหม่ๆเข้ามาในระบบทุกๆวัน ทุกเดือน ทุกปี นานวันเข้า มันจะขนาดไหน
ทั้งหมดที่กล่าวไปนั้น จึงเป็นบทเรียนสำคัญที่ทำให้เกิดบทความนี้ขึ้นมาได้ค่ะ
ทำไมเราจะต้อง Performance Tuning
- Response Time มันนานนนนนนนนเกิน ทำอะไรก็ช้าไปหมด
- จากข้อ 1 ทำให้ระบบ Timeout หรืออาจจะหยุดทำงาน
- ระบบทำงานหนักมากเกินจนหน่วยความจำเต็ม
- สร้างความเชื่อมั่นในระบบเราให้กับลูกค้า (เพราะคงไม่มีใครอยากใช้ระบบที่ไม่เสถียร)
ซึ่งการทำให้ระบบประมวลผลดีขึ้น ในอนาคตที่หากมีข้อมูลเพิ่มขึ้นก็จะได้ไม่เกิดปัญหาด้วยค่ะ
ขอจบบทความนี้ไปแต่เพียงเท่านี้ค่ะ
ใครที่กำลังเผชิญกับการทดสอบ Performance ก็สู้ๆนะคะ
ไม่มีปัญหาไหนที่ไม่มีทางออก หากเราไม่หยุดที่จะสู้ต่อไปค่ะ :)
- Nunny — 27 May 2023