ทำไมเราจะต้อง Performance Tuning (CPUร้องไห้แน้วนะ)

Nantana Rungsawasdisap
G-Able
Published in
3 min readMay 27, 2023

สวัสดีค่ะท่านผู้อ่านทุกๆท่าน

ในบทความนี้อยากจะมาแชร์ประสบการณ์ของทีม เกี่ยวกับการปรับ Tune Performance

และเหตุผลที่ว่า ทำไมเราจะต้องทำ Performance Tuning ด้วย ทั้งๆที่ระบบของเราทำงานได้ถูกต้องตามที่ User ต้องการทุกกกกกอย่าง ผ่านทั้ง SIT, UAT กันแล้ว จะยังต้องทดสอบอะไรกันอีกหรือ???

ขอเกริ่นก่อนว่า โครงการของเราผ่านการทดสอบ UAT2 และก็ได้ดำเนินเข้าสู่การทดสอบ NFT (Non-Functional Testing) หรือเรียกว่า

การทดสอบระบบ ในส่วนที่ไม่เกี่ยวกับการใช้งานโดยตรง ไม่ว่าจะเรื่อง Speed, Response Time, Endurance, Capacity ฯลฯ

พูดง่ายๆก็คือเป็นการทดสอบว่า ระบบที่เราพัฒนาขึ้นมานั้นมัน เร็วพอมั้ย อึดพอมั้ย คนใช้งานพร้อมๆกันได้เยอะมั้ย ประมาณนั้น

เนื่องจากว่าโครงการนี้เป็นโครงการค่อนข้างใหญ่ มีจำนวนข้อมูลมากถึงกว่า 15 ล้านนน!!

ณ วันแรกที่เมื่อเราได้ Migrate Data จำนวน 15 ล้านเข้าไปในระบบ

จำนวนข้อมูล Record ทั้งหมดในระบบจริง

เพียงแค่เข้าระบบเพื่อทำการ Load Page หน้าแรก ก็ใช้เวลาเกือบจะนาที!

จากตอนแรกที่เราทดสอบกันบน Environment ที่เรา Develop กันใช้เวลาเพียงแค่ไม่ถึง 1 วินาที

พอเริ่มทำ Load Test ทดสอบการ Open Web และ Login ด้วย 10 User เปิดเข้ามาทุกๆ 5 วินาทีไปเรื่อยๆ ผลปรากฎว่า เราใช้เวลามากที่สุดถึง 30 วินาที !! (ขนาดใช้จ่ายตังรอสแกน 5 วินาทียังบ่นนาน ฮ่าาๆๆ)

ผลการ Load Test ก็ Fail จ้าจะเหลือหรออ

ผลลัพท์ในช่วงแรกก่อนที่จะเริ่มปรับ Tune Performance ถ้าหากเราเป็น User เราก็คงจะไม่อยากใช้แล้ว

เพราะรอนานจนหลับ บางทีรอนานจนมัน Time Out ระบบตายบ้าง เจ๊งบ้าง ยังไม่ทันทำอะไรเลย ค้นหาทีบางทีรอ 30 นาทียังมี!!!

ผลการ Monitoring จาก Zabbix CPU ร้องไห้แน้วววว

หาก Monitor ดู CPU Server ช่วง 7 วัน ทั้ง Database และ Application ก็จะมีจังหวะที่ Peek มากๆถึง 100% นี่ขนาดยังไม่ได้เริ่มทำ Load Test เลยนะ

หลังจากนั้นทีม ได้มีการปรับบางส่วนเช่นการ Load Page การ Login ไปบ้าง

ผลการจับเวลา Response Time (บางส่วน ยังไม่ครบทุกหน้าจอ) ก็แทบไม่ผ่าน SLA เลย ทั้งๆที่ใช้แค่ 1 Transaction เท่านั้น … ดูผลแล้วก็เศร้าใจนัก แดงเถือกขนาดนี้ …

ผลลัพธ์ Load Test ในส่วนของ Client ต่อ 1 Transaction

ผลการทดสอบจับเวลา Response Time คร่าวๆที่ได้ สามารถบอกเราได้ดังนี้

หาก User 1 คน เข้ามาใช้งานในระบบ เริ่มตั้งแต่ Login และทำ Operation ต่างๆจนครบจบงานและ Logout ออกไป User จะต้องใช้เวลาอยู่ประมาณ 4–7 นาที

แต่…. นี่แค่ 1 คนเท่านั้นนะ

ในความเป็นจริงอาจจะมี User 30–40 คน เข้ามาใช้งานพร้อมกัน นั่นแปลว่าได้ เวลาอาจจะเพิ่มขึ้นไปถึง 30 เท่า !!!!

ผลลัพธ์ที่เกิดขึ้นทั้งหมดนั่น จึงเป็นเหตุผลที่ทำให้เราต้องทำ Performance Tuning

แล้วการทำ Performance Tuning เราต้องทำอะไรบ้างล่ะ ???

สรุปบทเรียนในการทำโครงการนี้มาได้ดังนี้ค่ะ

  1. การหาจุดที่ช้า หรือจุดที่เป็นคอขวด list มันออกมาว่ามีจุดไหนบ้าง เช่น การใช้ Tool ต่างๆ เช่น ดู report จาก AWR (สามารถอ่านได้จาก ที่นี่คลิกเลย !!) ,การ Debug log ที่ตัว Application จับเวลาเพื่อหาจุดที่ช้า ข้อนี้สำคัญ เพราะหากเราหาจุดไม่เจอก็ไม่รู้ว่าจะปรับตรงไหน และปรับอย่างไร
  2. การทำ Database Tuning ปรับการ Design ให้มีความซ้ำซ้อนน้อยที่สุด เช่น การสร้าง Index (ในข้อนี้เป็นการปรับที่ง่ายและกระทบน้อยที่สุดสำหรับเคสของทีมเรา และเห็นผลลัพธ์ที่ดีขึ้นค่ะ)
  3. การทำ Application Tuning ไม่ว่าจะเป็นการเขียน SQL ไม่ดี ทำให้เกิดการ Full Table Scan, การ Join หลาย Table เกินไป (โดยเฉพาะระบบที่มี Table ที่ซับซ้อนมาก), การใช้ Like (ยิ่งพวกที่เป็นการค้นหาต่างๆ), การใช้ OR ฯลฯ (ในข้อนี้ แน่นอนว่ามีผลกระทบเยอะที่สุดเพราะต้องแก้ Code และอาจจะส่งผลต่อ Functional)
  4. การทำ Server Tuning เช่นการปรับ Configuration ต่างๆ ที่ Server ไม่ว่าจะเป็น Transaction Timeout, Heap Memory, Transaction Pool ให้เพียงพอกับการใช้งาน
  5. การทำ Memory Tuning เช่น การปรับ Memory ให้เพียงพอกับการใช้งาน
  6. การทำ OS Tuning เช่น การปรับ CPU, I/O, Memory Utilization ให้เพียงพอกับการใช้งาน

เหตุผลที่จะต้องปรับในข้อที่ 5–6 เนื่องจาก Report AWR Suggest ให้เราทำการปรับ เพราะหากเราดูผล Monitor จาก Zabbix ก่อนและหลังปรับก็จะได้ดังรูปค่ะ

ผลลัพธ์ CPU ก่อนปรับ CPU ร้องไห้หนักมาก
ผลลัพธ์ CPU หลังปรับ ไม่ถึง 100% แล้ว

แต่การที่ CPU ไม่ถึง 100% มีอีกปัจจัยนอกจากการปรับ Tune แล้ว จะมีในเรื่องของการกระจายการยิง Load Test ให้ไม่อั้นจนเกินไปในช่วงแรกของการทดสอบด้วยค่ะ

หลังจากที่ทีมเราทำการปรับทั้ง 6 ข้อด้านบนเป็นเวลาร่วม 2 เดือน

ตอนนี้ก็ผ่านการทดสอบ NFT ไปได้เป็นที่เรียบร้อยแล้ว เย้!!

จากผลการทดสอบ Load Test รอบสุดท้าย ด้วยการยิง 40 Transactions เป็นเวลา 1 ชั่วโมง ก็ผ่าน SLA ทุกข้อ (แม้จะมี Fail อยู่ บ้างแต่เนื่องจากผลลัพธ์เกิน Spec ที่กำหนดไว้อยู่ที่ประมาณ 33 Transactions)

นี่ขนาดเพิ่งจะเริ่มพัฒนายังไม่ได้ใช้จริงเลยยังข้อมูลยังขนาดนี้

เพื่อนๆ ลองคิดตามดูว่าหาก User ใช้ระบบจริง แล้วยังมี Data ใหม่ๆเข้ามาในระบบทุกๆวัน ทุกเดือน ทุกปี นานวันเข้า มันจะขนาดไหน

ทั้งหมดที่กล่าวไปนั้น จึงเป็นบทเรียนสำคัญที่ทำให้เกิดบทความนี้ขึ้นมาได้ค่ะ

ทำไมเราจะต้อง Performance Tuning

  1. Response Time มันนานนนนนนนนเกิน ทำอะไรก็ช้าไปหมด
  2. จากข้อ 1 ทำให้ระบบ Timeout หรืออาจจะหยุดทำงาน
  3. ระบบทำงานหนักมากเกินจนหน่วยความจำเต็ม
  4. สร้างความเชื่อมั่นในระบบเราให้กับลูกค้า (เพราะคงไม่มีใครอยากใช้ระบบที่ไม่เสถียร)

ซึ่งการทำให้ระบบประมวลผลดีขึ้น ในอนาคตที่หากมีข้อมูลเพิ่มขึ้นก็จะได้ไม่เกิดปัญหาด้วยค่ะ

ขอจบบทความนี้ไปแต่เพียงเท่านี้ค่ะ

ใครที่กำลังเผชิญกับการทดสอบ Performance ก็สู้ๆนะคะ

ไม่มีปัญหาไหนที่ไม่มีทางออก หากเราไม่หยุดที่จะสู้ต่อไปค่ะ :)

  • Nunny — 27 May 2023

--

--

Nantana Rungsawasdisap
G-Able
Writer for

Nantana Rungsawasdisap Don’t stop running😊 Don't give up💪🏻