แก้ปัญหาเซิร์ฟเวอร์ทำงานหนักเกินไป

วิธีระบุจุดคอขวดของเซิร์ฟเวอร์ แก้ไขจุดคอขวดอย่างรวดเร็ว ปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์ และป้องกันการเกิดปัญหาซ้ำ

Katie Hempenius
Katie Hempenius

ภาพรวม

คู่มือนี้แสดงวิธีแก้ไขปัญหาเซิร์ฟเวอร์ที่มีภาระงานมากเกินไปใน 4 ขั้นตอน ดังนี้

  1. ประเมิน: ระบุจุดคอขวดของเซิร์ฟเวอร์
  2. ทำให้เสถียร: ใช้การแก้ไขด่วนเพื่อลดผลกระทบ
  3. ปรับปรุง: เพิ่มประสิทธิภาพและเพิ่มขีดความสามารถของเซิร์ฟเวอร์
  4. ตรวจสอบ: ใช้เครื่องมืออัตโนมัติเพื่อช่วยป้องกันปัญหาในอนาคต

ประเมิน

เมื่อการเข้าชมมีมากเกินกว่าที่เซิร์ฟเวอร์จะรองรับได้ สิ่งต่อไปนี้อย่างน้อย 1 อย่างอาจกลายเป็นจุดคอขวด ได้แก่ CPU, เครือข่าย, หน่วยความจํา หรือ I/O ของดิสก์ การระบุว่าปัญหาใดเป็นปัญหาคอขวดจะช่วยให้คุณมุ่งเน้นที่การบรรเทาปัญหาที่ได้ผลดีที่สุดได้

  • CPU: ควรตรวจสอบและแก้ไขการใช้งาน CPU ที่มากกว่า 80% อย่างต่อเนื่อง ประสิทธิภาพของเซิร์ฟเวอร์มักจะลดลงเมื่อการใช้งาน CPU อยู่ที่ประมาณ 80-90% และยิ่งลดลงเมื่อการใช้งานใกล้ถึง 100% การใช้งาน CPU ของการแสดงคําขอเดียวนั้นแทบจะมองข้ามได้ แต่การทำเช่นนี้ในขนาดที่พบระหว่างการเข้าชมที่เพิ่มขึ้นอย่างรวดเร็วอาจทำให้เซิร์ฟเวอร์ทำงานหนักเกินไปในบางครั้ง การย้ายการส่งออกไปยังโครงสร้างพื้นฐานอื่นๆ การลดการดำเนินการที่มีค่าใช้จ่ายสูง และการจำกัดจำนวนคำขอจะช่วยลดการใช้งาน CPU
  • เครือข่าย: ในช่วงที่มีการเข้าชมสูง ปริมาณข้อมูลของเครือข่ายที่จําเป็นเพื่อตอบสนองคําขอของผู้ใช้อาจเกินความจุ บางเว็บไซต์อาจมีการจำกัดการโอนข้อมูลสะสมด้วย ทั้งนี้ขึ้นอยู่กับผู้ให้บริการโฮสติ้ง การลดขนาดและปริมาณข้อมูลที่โอนไปยังและจากเซิร์ฟเวอร์จะช่วยขจัดปัญหาคอขวดนี้
  • หน่วยความจํา: เมื่อระบบมีหน่วยความจําไม่เพียงพอ ระบบจะต้องย้ายข้อมูลไปยังดิสก์เพื่อจัดเก็บ การเข้าถึงดิสก์ช้ากว่าหน่วยความจํามาก ซึ่งอาจทําให้ทั้งแอปพลิเคชันช้าลง หากหน่วยความจําหมดลงอย่างสมบูรณ์ อาจส่งผลให้เกิดข้อผิดพลาดหน่วยความจําไม่เพียงพอ (OOM) การปรับการจัดสรรหน่วยความจำ การแก้ไขหน่วยความจำรั่วไหล และการอัปเกรดหน่วยความจำจะช่วยขจัดปัญหาคอขวดนี้ได้
  • I/O ของดิสก์: อัตราการอ่านหรือเขียนข้อมูลจากดิสก์ถูกจำกัดโดยตัวดิสก์เอง หาก I/O ของดิสก์เป็นปัญหาคอขวด การเพิ่มปริมาณข้อมูลที่แคชไว้ในหน่วยความจําจะช่วยบรรเทาปัญหานี้ได้ (แต่อาจทำให้หน่วยความจํามีการใช้งานมากขึ้น) หากไม่ได้ผล คุณอาจต้องอัปเกรดดิสก์

เทคนิคในคู่มือนี้มุ่งเน้นที่การแก้ปัญหาคอขวดของ CPU และเครือข่าย สําหรับเว็บไซต์ส่วนใหญ่ CPU และเครือข่ายจะเป็นจุดคอขวดที่เกี่ยวข้องมากที่สุดในช่วงที่การเข้าชมเพิ่มขึ้น

การเรียกใช้ top ในเซิร์ฟเวอร์ที่ได้รับผลกระทบเป็นจุดเริ่มต้นที่ดีในการตรวจสอบปัญหาคอขวด เสริมข้อมูลนี้ด้วยข้อมูลย้อนหลังจากผู้ให้บริการโฮสติ้งหรือเครื่องมือตรวจสอบ (หากมี)

แก้ภาพสั่น

เซิร์ฟเวอร์ที่มีภาระงานมากเกินไปอาจทําให้ระบบส่วนอื่นๆ เกิดความล้มเหลวเป็นลูกโซ่ได้อย่างรวดเร็ว ดังนั้น คุณจึงควรทำให้เซิร์ฟเวอร์ทำงานได้อย่างเสถียรก่อนที่จะพยายามทำการเปลี่ยนแปลงที่สำคัญๆ เพิ่มเติม

การจำกัดอัตรา

การจำกัดอัตราการส่งข้อมูลช่วยปกป้องโครงสร้างพื้นฐานด้วยการจำกัดจำนวนคำขอขาเข้า เรื่องนี้มีความสําคัญมากขึ้นเมื่อประสิทธิภาพของเซิร์ฟเวอร์ลดลง เนื่องจากเวลาในการตอบสนองที่เพิ่มขึ้นทําให้ผู้ใช้มีแนวโน้มที่จะรีเฟรชหน้าเว็บอย่างรุนแรง ซึ่งจะเพิ่มภาระของเซิร์ฟเวอร์มากขึ้นไปอีก

แก้ไข

แม้ว่าการปฏิเสธคำขอจะค่อนข้างประหยัด แต่วิธีที่ดีที่สุดในการปกป้องเซิร์ฟเวอร์คือการจำกัดอัตราการส่งคำขอที่ต้นทาง เช่น ผ่านตัวกระจายโหลด พร็อกซีย้อนกลับ หรือ CDN

วิธีการ

อ่านเพิ่มเติม

การแคช HTTP

มองหาวิธีแคชเนื้อหาอย่างมีประสิทธิภาพมากขึ้น หากทรัพยากรแสดงจากแคช HTTP ได้ (ไม่ว่าจะเป็นแคชของเบราว์เซอร์หรือ CDN) ก็ไม่จำเป็นต้องขอจากเซิร์ฟเวอร์ต้นทาง ซึ่งจะช่วยลดภาระของเซิร์ฟเวอร์

ส่วนหัว HTTP เช่น Cache-Control, Expires และ ETag จะระบุวิธีที่แคช HTTP ควรแคชทรัพยากร การตรวจสอบและการแก้ไขส่วนหัวเหล่านี้จะช่วยปรับปรุงการแคช

แม้ว่าService Worker จะใช้สำหรับการแคชได้เช่นกัน แต่จะใช้แคชแยกต่างหากและเป็นเพียงส่วนเสริม ไม่ใช่การแทนที่สำหรับการแคช HTTP อย่างเหมาะสม ด้วยเหตุนี้ เมื่อจัดการกับเซิร์ฟเวอร์ที่ทำงานหนักเกินไป คุณควรมุ่งเน้นที่การเพิ่มประสิทธิภาพการแคช HTTP

วินิจฉัย

เรียกใช้ Lighthouse และดูการตรวจสอบแสดงเนื้อหาแบบคงที่ที่มีนโยบายแคชที่มีประสิทธิภาพเพื่อดูรายการทรัพยากรที่มี Time To Live (TTL) สั้นถึงปานกลาง พิจารณาว่าควรเพิ่ม TTL สำหรับทรัพยากรแต่ละรายการที่แสดงหรือไม่ หลักเกณฑ์คร่าวๆ มีดังนี้

  • ทรัพยากรแบบคงที่ควรแคชด้วย TTL แบบยาว (1 ปี)
  • ทรัพยากรแบบไดนามิกควรแคชโดยใช้ TTL สั้นๆ (3 ชั่วโมง)

แก้ไข

ตั้งค่าคําสั่ง max-age ของส่วนหัว Cache-Control เป็นจํานวนวินาทีที่เหมาะสม

วิธีการ

การลดลงอย่างค่อยเป็นค่อยไป

การลดระดับอย่างมีชั้นเชิงเป็นกลยุทธ์ในการลดฟังก์ชันการทำงานชั่วคราวเพื่อลดภาระงานส่วนเกินออกจากระบบ แนวคิดนี้ใช้ได้หลายวิธี เช่น การแสดงหน้าข้อความแบบคงที่แทนแอปพลิเคชันที่มีฟีเจอร์ครบครัน การปิดใช้การค้นหาหรือแสดงผลการค้นหาน้อยลง หรือการปิดใช้ฟีเจอร์บางอย่างที่ราคาแพงหรือไม่จำเป็น ควรเน้นที่การนำฟังก์ชันการทำงานที่นําออกได้อย่างปลอดภัยและง่ายดายโดยส่งผลกระทบต่อธุรกิจน้อยที่สุด

ปรับปรุง

ใช้เครือข่ายนำส่งข้อมูล (CDN)

คุณสามารถย้ายการแสดงผลชิ้นงานแบบคงที่จากเซิร์ฟเวอร์ไปยังเครือข่ายนำส่งข้อมูล (CDN) ซึ่งจะช่วยลดภาระงานได้

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

ตั้งค่า CDN

CDN มีประโยชน์จากการปรับขนาด ดังนั้นการดําเนินการ CDN ของคุณเองจึงไม่ค่อยมีเหตุผล การกําหนดค่า CDN พื้นฐานจะตั้งค่าได้ค่อนข้างเร็ว (~30 นาที) และประกอบด้วยการอัปเดตระเบียน DNS ให้ชี้ไปยัง CDN

เพิ่มประสิทธิภาพการใช้งาน CDN

วินิจฉัย

ระบุทรัพยากรที่ไม่ได้แสดงจาก CDN (แต่ควรแสดง) โดยเรียกใช้ WebPageTest ในหน้าผลลัพธ์ ให้คลิกสี่เหลี่ยมจัตุรัสเหนือ "การใช้ CDN อย่างมีประสิทธิภาพ" เพื่อดูรายการทรัพยากรที่ควรแสดงจาก CDN