Photo by Roman Synkevych 🇺🇦 on Unsplash

Web Backend Performance ทำไมต้องให้ความสำคัญ? และจะปรับปรุงให้ดีได้ยังไง?

20Scoops CNX Technology Blog
20Scoops CNX
Published in
3 min readOct 7, 2022

--

หลังจากที่เราได้พัฒนา Application ขึ้นมาแล้วนอกจากการตรวจสอบความถูกต้องในการทำงาน ด้วย Unit testing และ End to end testing ว่าเป็นไปตามที่เราคาดหวังรึเปล่า คิดว่าเราคงอยากรู้แล้ว Application ที่เราเฝ้าพัฒนามาอย่างทะนุถนอมนั้น มีประสิทธิภาพหรือไม่ จะสามารถทำงานได้ดีแค่ไหนภายใต้สภาพแวดล้อมที่มีอย่างจำกัด และจะสามารถรองรับ User พร้อม ๆ กันได้มากแค่ไหนกันนะ

ในบทความนี้เราจะพูดถึงความสำคัญของ Performance ว่าอะไรที่จะเป็นตัวชี้วัดการมี Performance ที่ดี และ เราจะทำยังไงให้ระบบหรือ Application ของเรามี Performance ที่ดีขึ้น

ทำไมต้องสนใจ Backend performance?

หลังจากที่เราพัฒนา Application มาได้สักพัก แน่นอนว่าจำนวน User ก็จะต้องเพิ่มมากขึ้นเป็นธรรมดา ซึ่งมาพร้อมกับการใช้ทรัพยากรที่มากขึ้นเพื่อรองรับ User เหล่านั้นด้วย ถ้าหากว่าระบบของเราไม่มีประสิทธิภาพ หรือ มีการออกแบบมาไม่ดีพอ เราก็อาจต้องจ่ายเงินเพื่อใช้ทรัพยากรที่มากขึ้นโดยไม่จำเป็น Backend developer จึง มีหน้าที่ในการวางระบบโครงสร้าง และ พัฒนาประสิทธิภาพในการทำงานของระบบ เพื่อทำให้การลงทุนในระบบเกิดความคุ้มค่ามากที่สุด โดยมีอีกหนึ่งความท้าทายที่มาพร้อมกับจำนวนผู้ใช้ที่มากขึ้น ก็คือระบบจะทำงานได้ช้าลง และ บางท่ีอาจจะหยุดทำงานหรือล่มไปเลยก็ได้…

Photo by Sigmund on Unsplash

ลองนึกภาพว่าบริษัทของเรามีการวางแผนจัดโปรโมชันในช่วงสิ้นเดือน และคู่แข่งอีกหลาย ๆ เจ้าก็ทำโปรโมชันมาแข่งในช่วงเดียวกัน แต่ระบบของเรากลับล่มไม่เป็นท่า หรือแอปของเราโหลดช้าเกินไป ทั้งลูกค้าเก่าและลูกค้าใหม่คงจะหนีไปใช้บริการที่อื่นกันหมด หรือถ้าเราเป็นผู้ให้บริการ video streaming แต่ user ของเราต้องรอวีดีโอ buffer ทุก 10 วินาที คงไม่มีใครยอมใจเย็นทนใช้บริการของเราต่ออย่างแน่นอน

นอกจากนี้ Google ก็ได้ทำการสำรวจความเร็วในการโหลดของหน้าเว็บไซต์ และพบว่ายิ่งใช้เวลาในการโหลดนานเท่าไหร่ โอกาสที่ User จะ Bounce (การออกจากเว็บไซต์หลังจากเข้าชมได้เพียงหนึ่งหน้าหรือน้อยกว่า) จะเพิ่มสูงขึ้น

เวลาในการโหลดหน้าเว็บไซต์และโอกาสการออกจากเว็บไซต์ ที่มา Think With Google [1]

คงจะพอเห็นภาพความสำคัญของการทำ backend performance กันบ้างแล้ว เดี๋ยวเราลองมาดูในเรื่องเทคนิคกันต่อว่า

Backend performance คืออะไร?

  • Web performance จากวิกิพีเดียบอกว่า Web performance คือความเร็วในการแสดงหน้าเว็บ (รวมถึงการดาว์นโหลดหน้าเว็บ) ไปยังเว็บเบราว์เซอร์ของผู้ใช้งาน [2] นั่นหมายถึงการวัดความเร็วที่เริ่มนับจากเวลาที่ผู้ใช้งานคลิ๊กลิงค์เว็บไซต์ หรือ เข้าเว็บไซต์จาก URL ไปจนถึงหน้าเว็บแสดงผลต่างๆเสร็จสิ้นอย่างครบถ้วน
  • Backend performance คือการวัดความเร็วในการเรียก API หรือ request ไปยัง Backend Service ไปจนกว่าจะได้ Response กลับมา อาจจะอยู่ในหน่วย มิลลิวินาที (ms) หรือ วินาที (s)

เราลองมาดูกันว่าปัจจัยบางส่วนที่ส่งผลต่อ Performance มีอะไรบ้าง

  • Query Database: query ที่ซับซ้อน หรือ การ query กับข้อมูลที่มีขนาดใหญ่มาก ๆ จะใช้เวลาในการดึงข้อมูลมาก รวมไปถึงการใช้ memory ที่มากขึ้นตามไปด้วย ในปัจจัยนี้ถือเป็นปัจจัยที่สำคัญ ถ้าหากว่าเราออกแบบ database ได้เอื้อสำหรับการ query ข้อมูลแล้ว ถือว่าเป็นการเริ่มที่ดี (มีชัยไปกว่าครึ่ง) นั่นแสดงให้เห็นว่าการวางแผน และออกแบบ นั้นสำคัญมาก ๆ ถ้าหากว่าเราจะแก้ไขโครงสร้าง database หรือ ปรับเปลี่ยน วิธีการ query อาจทำให้การเข้าถึงข้อมูลในเวลาที่น้อยลงได้ แต่ก็มี cost เป็น เวลา หรือ กำลังคน ที่ต้องเสียด้วยเหมือนกัน
  • Loop and Big O: การพัฒนา application ที่มี loop จำนวนมากๆ หรือ มี Big O level สูงๆ เมื่อในอนาคตมีข้อมูลจำนวนที่มากขึ้น จะส่งผลให้มีแนวโน้มการคำนวนสูงมากขึ้นตามไปด้วย เราสามารถแก้ไข้ได้โดยการปรับเปลี่ยนวิธีการคำนวนใหม่ให้มีการใช้ loop น้อยลง นั่นหมายความว่าเราต้องเสีย cost (เวลา, กำลังคน) ในการ refactor code ใหม่ หากไม่สามารถ ลด loop หรือ Big O ได้มากกว่านี้แล้ว ก็ยังมีอีกวิธีคือการเพิ่ม ทรัพยากรให้มีพลังการคำนวนให้มากขึ้น แต่ก็ต้องแลกมาด้วยค่าใช้จ่ายที่เพิ่มขึ้น
  • Users: การที่มีผู้ใช้งานพร้อมๆกันทำให้ ประสิทธิ์ภาพการทำงานของระบบนั้นลดลงได้จากทรัพยากรที่มีอย่างจำกัด จาก service ที่สามารถรองรับ 100 users และ response time 1s หากมี user เพิ่มมากขึ้นเป็น 200 users ทำให้ response time นานขึ้นเป็น 2.5s ผลที่ได้นั้นมีได้หลายสาเหตุเช่น database ขนาดเล็กจะมี connections ได้ไม่มากนัก (query พร้อมๆกัน) ทำให้จำเป็นต้องรอคิวในการ query เราสามารถแก้ไขได้โดยขยายขนาด database ให้ใหญ่ขึ้น (รองรับ connections มากขึ้น) หรือ database replication ทำให้เราสามารถ query ได้จาก database หลายตัว ในส่วนของการคำนวนที่ใช้ CPU เยอะๆ แก้ไขได้ด้วยการ scale ซึ่งการ sacle มีอยู่ 2 แบบ คือ scale up เป็นการเพิ่ม spec ในกับ server และ scale out คือการเพิ่มจำนวน server และจำเป็นต้องทำงานร่วมกับ Load balance วิธีนี้ยังสามารถเข้ามาแก้ไขเรื่อง downtime ได้อีกด้วย แต่ก็มีข้อควรระวัง หากใน service มีการใช้งาน schedule อาจทำให้มีการทำงานที่ซ้ำซ้อน และทำให้ flow การทำงานของระบบผิดเพียนไป
  • Cache: การทำ cache เป็นวิธีที่เราจะเก็บข้อมูลบางส่วน (subset) ของแหล่งข้อมูลหลักไว้ใน storage ที่สามารถอ่านข้อมูลได้เร็วกว่าที่เก็บเดิม เช่นการเก็บข้อมูลที่ถูกอ่านบ่อย ๆ ไว้ใน memory storage ในขณะที่ข้อมูลส่วนอื่น ๆ เก็บไว้ใน database ตัวอย่างของการเก็บ cache ที่เห็นได้ง่าย ๆ ก็เช่นการที่ browser จะทำการโหลดไฟล์ที่มีขนาดใหญ่ เช่น ไฟล์ภาพ ไฟล์ css หรือ javascript จาก server ไว้เมื่อมีการเรียกใช้ไฟล์ครั้งแรก และจะทำการเก็บไฟล์เหล่านั้นไว้เป็น cache ในอุปกรณ์ของผู้ใช้ เพื่อที่การเรียกไฟล์ครั้งต่อไป browser สามารถเรียกใช้ไฟล์ได้เลยโดยไม่ต้องดาวน์โหลดผ่าน internet อีกครั้ง

เราใช้อะไรวัด Backend performance?
ในการวัด performance ของระบบหลังบ้านก็สามารถวัดได้จากหลายตัวแปร [3]

External Metrics

  • Response time — เวลาที่ server ใช้ในการตอบคำร้องของ client ในแต่ละ request มักจะวัด 2 แบบ ก็คือ Average response time และ percentile response time (นิยม 95% หรือ 99%)
  • Throughput — จำนวน response ที่ระบบสามารถจัดการได้ โดยมักจะวัดเป็น ครั้ง/วินาที ครั้ง/นาที หรือ ครั้ง/ชั่วโมง
  • Error rate — อัตราการเกิด error จากจำนวน request ทั้งหมดที่ระบบได้รับ โดยตัวเลขที่ยอมรับได้ทั่วไปคือน้อยกว่า 5% สำหรับ error ที่เกิดขึ้นจาก network และน้อยกว่า 1% สำหรับ error ที่เกิดขึ้นจากระบบ โดยตัวเลขนี้อาจแตกต่างกันไปตามบริบทของแต่ละบริการ

ตัวอย่าง Tools ที่ใช้ในการ check performance

Internal Metrics

  • CPU โดยทั่วไป CPU จะเป็นองค์ประกอบที่ส่งผลกับ performance มาก และการรักษาระดับ CPU performance อยู่ที่ 70–80% เป็นหนึ่งทางเลือกที่เหมาะสมในการวัดว่าเราสามารถใช้ทรัพยากรได้อย่างคุ้มค่าหรือไม่ และยังเหลือพื้นที่เมื่อปริมาณการใช้งานเพิ่มขึ้นอย่างฉับพลัน
  • Memory ในแต่ละบริการ การใช้งาน memory อาจแตกต่างกันไป และ server บน cloud ที่มีปริมาณ memory สูงก็จะมีราคาสูงตามไปด้วย ฉะนั้นการวางแผนการใช้ memory ให้เหมาะสมกับการใช้งานก็ย่อมมีผลดีอย่างแน่นอน
  • Network Network เป็นอีกหนึ่งตัวแปรที่จะต้องติดตาม โดยเฉพาะในบริการที่มีการ รับ-ส่ง ข้อมูลในปริมาณมาก
credit: imgflip.com

ตัวอย่างงานบางส่วนที่ 20scoops ทำเพื่อพัฒนา Backend Performance:

  • ทำ load testing หรือ stress testing เพื่อหาจุดที่เป็น breaking point ในระบบ เพื่อพัฒนาทีละส่วน และทำการ iterate จากจุดที่เราคิดว่าน่าจะมีผลกับประสิทธิภาพของระบบมากที่สุด
  • ทำ performance testing เพื่อดูว่าภายใต้ความต้องการ เช่นจำนวนผู้ใช้ที่ตั้งไว้ เพื่อนดูว่าระบบสามารถให้บริการได้ตามความคาดหวังรึเปล่า โดยวัดจากหลาย ๆ อย่าง เช่นความเร็วในการตอบสนอง การรองรับจำนวนผู้ใช้ และการจัดการความผิดพลาดของระบบ

นอกจากการทดสอบแล้ว เรายังทำการวางโครงสร้างของระบบเพื่อวางแผนการรองรับการเติบโตอีกด้วย ส่วนเครื่องมือที่ 20scoops ใช้ในการทำ performance testing ก็อย่างเช่น JMeter (พัฒนาโดย Apache) K6 (สำหรับคนที่ถนัด NodeJS) หรือ Locust (สำหรับคนที่ถนัด Python) ซึ่งจริง ๆ แล้วเราก็สามารถใช้เครื่องมือตามความความต้องการของแต่ละงาน หรือสิ่งที่เราอยากจะทดสอบได้

สรุป

ทุกคนที่อ่านมาถึงตอนนี้คงพอจะเห็นภาพและเข้าใจความสำคัญของการวัด Backend performance กันมากขึ้น ซึ่งจริง ๆ แล้วเรื่องประสิทธิภาพของ Backend ยังมีรายละเอียดและเทคนิคอีกมาก ที่เรายังไม่ได้พูดถึง และเหล่า Backend Scooper จาก 20Scoops ก็จะพาทุกคนไปเรียนรู้ด้วยกันในบทความถัดไป และถ้าใครมีคำถาม หรือมีเรื่องที่อยากให้เรามาแชร์ ก็คอมเมนท์บอกกันได้เลย

20ScoopsCNX คือผู้ให้บริการด้าน Software Development Infrastructure ครบวงจร และตอนนี้เราเปิดรับหลายตำแหน่ง ทั้ง Developers, UX/UI Designer, Quality Assurance และ Project Manager สำหรับใครที่สนใจร่วมงานกับเรา สามารถดูตำแหน่งที่เปิดรับได้ที่เว็บไซต์ของเรา

References

Special Thanks To
All Scoopers from Back-End Team @20scoopsCNX

--

--

20Scoops CNX Technology Blog
20Scoops CNX

Learn more about how 20scoops CNX designs, builds, and operates our systems and engineering organizations