ฉันมี AWS ALB ที่โหลดบาลานซ์ร้องขอการปัดเศษไปยังสี่เซิร์ฟเวอร์
แต่ละเซิร์ฟเวอร์ใช้ pm2 เพื่อปัดเศษคำขอเหล่านั้นไปยัง CPU หกตัว
กระบวนการ NodeJS (react NextJS) กำลังทำงานบน CPU หกตัวซึ่งให้บริการโดย Express.js สิ่งแรกที่พวกเขาทำคือบันทึกคำขอที่เข้ามา (เว็บเซิร์ฟเวอร์ไม่ได้อยู่ข้างหน้าเช่น apache หรือ nginx แต่จะตรงไปที่ Express.js)
โดยปกติแล้ว ทุกคำขอที่เข้าถึง ALB จะได้รับการส่งต่อสำเร็จ และบันทึกโดยกระบวนการ NodeJS อย่างไรก็ตาม ในบางครั้งในช่วงเวลาที่มีทราฟฟิกสูง คำขอบางรายการจะถูกทิ้งและไม่เคยเข้าสู่กระบวนการ NodeJS เห็นได้ชัดว่าบันทึกเซิร์ฟเวอร์ของเราไม่ได้บันทึกความล้มเหลวเหล่านี้ เนื่องจากพวกเขาไม่เคยสร้างข้อผิดพลาดนั้นตั้งแต่แรก เราจะเห็นช่องว่างนี้เมื่อเปรียบเทียบกับจำนวนคำขอ ALB เท่านั้น
ฉันกำลังพยายามทำความเข้าใจกลไกที่อาจนำไปสู่การตกหล่น เป็นไปได้ไหมที่คิวภายใน NodeJS หมดเวลา หรืออาจเป็นเคอร์เนลลินุกซ์? เราเห็นข้อบ่งชี้ว่าในช่วงที่มีทราฟฟิกสูง CPU บางตัวไม่ว่างในขณะที่บางตัวไม่ได้ใช้งาน ซึ่งทำให้นึกถึงความยาวของคิว (สูตรของคิงแมน กฎของลิตเติ้ล ฯลฯ) ฉันสามารถคิดสองสามวิธีในการลดความน่าจะเป็นของเหตุการณ์นี้ ตั้งแต่การเพิ่มความจุของเซิร์ฟเวอร์ ไปจนถึงการลดเวลาตอบสนอง ไปจนถึงการเปลี่ยนกลยุทธ์การจัดสรรภาระงานระดับเซิร์ฟเวอร์ แต่ฉันพยายามทำความเข้าใจมากขึ้นว่าคำขอติดขัดตรงไหน และ อะไรเป็นตัวกำหนดว่ามันจะลดลง/หายไปอย่างไรและอย่างไร - โดยเฉพาะอย่างยิ่งถ้าฉันสามารถบันทึกหรือส่งสัญญาณบางอย่างเมื่อมันเกิดขึ้น
ตัวอย่างของการกำหนดค่า pm2:
โมดูลส่งออก = {
แอป: [
{
ชื่อ: 'ชุมชน',
สคริปต์: 'dist/server.js',
ตัวอย่าง: -1,
exec_mode: 'คลัสเตอร์',
รีสตาร์ทอัตโนมัติ: จริง,
ดู: เท็จ,
log_date_format: 'YYYY-MM-DD HH:mm Z',
max_memory_restart: '2G',
// ...
// และการกำหนดค่าเฉพาะ env เช่น
env_production: {
NODE_ENV: 'การผลิต'
NODE_OPTIONS: '--max-old-space-size=3584 --max-http-header-size=16380',
LOG_LEVEL: 'ข้อมูล'
พอร์ต: 3000,
},
},
]
ปรับใช้: {
// ...
},
};