한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

คู่มือเกมแลค › L5 อุปกรณ์เครือข่ายในดาต้าเซ็นเตอร์

ขีดจำกัดการเชื่อมต่อ/พอร์ตของ NAT gateway บนคลาวด์ Cloud NAT gateway connection / port limits

ID สาเหตุ dc-nat-gateway · ผู้รับผิดชอบหลัก อินฟราเครือข่าย (ทีมอินฟรา) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)

เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →

การเชื่อมต่อที่เซิร์ฟเวอร์ใน private subnet ออกไปภายนอก (ระบบยืนยันตัวตนของแพลตฟอร์ม, ระบบชำระเงิน, API ภายนอก) จะผ่าน NAT gateway ซึ่งแปลง IP และพอร์ตก่อนส่งออก ถ้าการเชื่อมต่อพร้อมกันไปยังปลายทางเดียวกันเกินขีดจำกัดพอร์ตของ gateway การเชื่อมต่อใหม่จะล้มเหลว

ทำไม เซิร์ฟเวอร์เปิดการเชื่อมต่อสั้น ๆ จำนวนมากไปยัง IP ภายนอกเดียวกัน เช่น ระบบยืนยันตัวตนของแพลตฟอร์มหรือระบบชำระเงิน หรือเปิดการเชื่อมต่อทิ้งไว้นาน → ผลคือ NAT gateway จัดสรรพอร์ตต้นทางสำหรับปลายทางนั้นเพิ่มไม่ได้ การเชื่อมต่อใหม่จึงล้มเหลว → บนหน้าจอ ในเกมปกติดี แต่เฉพาะฟีเจอร์ที่เรียกภายนอก เช่น ล็อกอิน ชำระเงิน หรือแจกของรางวัล ที่ล้มเหลวหรือช้า (เข้าเกมไม่ได้/โหลดไม่จบ, กดไม่ติด/โรลแบ็ค)

อาการ
เข้าเกมไม่ได้/โหลดไม่จบ, กดไม่ติด/โรลแบ็ค
ปัจจัย
แพ็กเก็ตหาย, ความหน่วง
ใครเจอ
เฉพาะบางฟีเจอร์, ทั้งเซิร์ฟเวอร์
เกิดเมื่อไร
หลังล็อกอิน/หลังปิดปรับปรุง, ช่วงพีคหัวค่ำ, ตอนคนแห่มารวมกัน
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก อินฟราเครือข่าย (ทีมอินฟรา) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
ใช้การเชื่อมต่อกับ API ภายนอกซ้ำ (HTTP keep-alive, connection pool) และไม่เปิดการเชื่อมต่อใหม่ทุกคำขอ, การเชื่อมต่อ idle ที่เก็บไว้ใน pool ให้ส่ง keepalive ถี่กว่า idle timeout ของ NAT (AWS 350 วินาที) หรือปิดก่อน, เมื่อล้มเหลวให้ค่อย ๆ เพิ่มช่วงห่างของการลองใหม่และกระจายแบบสุ่ม, บันทึกอัตราล้มเหลวและความหน่วงแยกตามการเรียกภายนอกแต่ละแบบ
งานฝั่งทีมอินฟรา
เพิ่ม IP ให้ NAT gateway (AWS public NAT gateway ผูก Elastic IP ได้แค่ 2 ตัวเป็นค่าเริ่มต้น ถ้าต้องการมากกว่านั้นต้องขอเพิ่มโควตา), แยก gateway ตาม availability zone และ subnet, ตั้ง alert เมตริกการจัดสรรพอร์ตล้มเหลว (AWS ErrorPortAllocation, สถานะ Failed ของ Azure SNAT Connection Count, OUT_OF_RESOURCES ของ Google Cloud dropped_sent_packets_count), สำหรับ Google Cloud NAT ให้เพิ่มจำนวนพอร์ตขั้นต่ำต่อ VM หรือใช้ dynamic port allocation
ตัวเลขที่ควรรู้
AWS NAT gateway เปิดการเชื่อมต่อพร้อมกันไปยังปลายทางเดียวกัน (IP, พอร์ต, โปรโตคอล) ได้สูงสุด 55,000 การเชื่อมต่อต่อ IP หนึ่งตัว และเพิ่มได้ด้วยการผูก IP สูงสุด 8 ตัว การเชื่อมต่อที่เงียบไป 350 วินาทีจะถูกลบ และแพ็กเก็ตที่ส่งมาทางการเชื่อมต่อนั้นหลังจากนั้นจะได้ RST กลับไป Azure NAT Gateway มี SNAT port 64,512 พอร์ตต่อ public IP หนึ่งตัว (IP สูงสุด 16 ตัว) ส่วน Google Cloud NAT แบ่ง 64,512 พอร์ตต่อ NAT IP หนึ่งตัวให้แต่ละ VM และค่าเริ่มต้นของพอร์ตขั้นต่ำต่อ VM คือ 64 พอร์ต (static allocation) ถ้าใช้ค่าเริ่มต้น VM หนึ่งเครื่องจึงมักเปิดการเชื่อมต่อพร้อมกันไปยังปลายทางเดียวกันได้แค่ 64 การเชื่อมต่อ
บนกราฟ
ชนเพดานแล้วแบนราบ · จำนวนการเชื่อมต่อพร้อมกันของ NAT gateway, จำนวนการจัดสรรพอร์ตล้มเหลว
จุดที่ต้องดู
สำหรับ AWS ดูเมตริก NAT gateway ใน CloudWatch ได้แก่ ErrorPortAllocation, ActiveConnectionCount และ PacketsDropCount (Azure ดู SNAT Connection Count ที่กรองสถานะ Failed และ Dropped Packets, Google Cloud ดู dropped_sent_packets_count ที่ reason เป็น OUT_OF_RESOURCES) เทียบกับเวลาที่เซิร์ฟเวอร์เกมเรียกภายนอกล้มเหลว
สัญญาณว่าใช่
ในเวลาที่เรียกภายนอกล้มเหลว ErrorPortAllocation (Azure คือ SNAT Connection Count สถานะ Failed, Google Cloud คือการทิ้งแบบ OUT_OF_RESOURCES) มีค่ามากกว่า 0 และความล้มเหลวกระจุกที่การเรียกไปยังปลายทางหนึ่งหรือสองแห่งที่มีการเชื่อมต่อมาก เช่น เซิร์ฟเวอร์ยืนยันตัวตนหรือชำระเงิน
สัญญาณว่าไม่ใช่
ถ้าการจัดสรรพอร์ตล้มเหลวเป็น 0 แต่ connect ของเซิร์ฟเวอร์เกมล้มเหลวด้วย EADDRNOTAVAIL และ TIME_WAIT ใกล้เต็มช่วง ephemeral port น่าจะเป็น “ephemeral port หมดในการเชื่อมต่อระหว่างเซิร์ฟเวอร์” ถ้าเชื่อมต่อได้แต่ตอบช้า น่าจะเป็น “การพึ่งพาเซอร์วิสภายนอก”
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)
รายละเอียดเพิ่มเติม
ต่างจาก “ephemeral port หมดในการเชื่อมต่อระหว่างเซิร์ฟเวอร์” ที่ ephemeral port ของเซิร์ฟเวอร์เครื่องเดียวหมด ขีดจำกัดนี้อยู่ที่ NAT gateway และเซิร์ฟเวอร์ทุกเครื่องหลัง gateway ใช้ร่วมกัน (Google Cloud NAT แบ่งให้แต่ละ VM) ถ้า TIME_WAIT และช่วง ephemeral port ฝั่งเซิร์ฟเวอร์ยังเหลือ แต่เฉพาะการเรียกภายนอกที่ล้มเหลว ก็น่าจะเป็นสาเหตุนี้ พอร์ตของการเชื่อมต่อที่ปิดแล้วก็ไม่ถูกนำกลับมาใช้กับปลายทางเดียวกันทันที (Azure มี cooldown, Google Cloud ใช้ไม่ได้ระหว่าง TIME_WAIT) ยิ่งเปิดการเชื่อมต่อสั้น ๆ ซ้ำ ๆ ก็ยิ่งชนขีดจำกัดเร็ว

แหล่งอ้างอิง

  1. NAT gateway basics AWS
    การเชื่อมต่อพร้อมกันไปยังปลายทางเดียวกัน (IP, พอร์ต, โปรโตคอลปลายทาง) 55,000 การเชื่อมต่อต่อ IPv4 หนึ่งตัว เพิ่มได้ด้วยการผูก IP สูงสุด 8 ตัว (Elastic IP ของ public NAT gateway ค่าเริ่มต้น 2 ตัว เพิ่มได้ด้วยการขอเพิ่มโควตา), แบนด์วิดท์ขยายเองจาก 5 Gbps ถึง 100 Gbps และปริมาณงานขยายเองจาก 1 ล้านถึง 10 ล้านแพ็กเก็ตต่อวินาที ถ้าเกินขีดนั้นแพ็กเก็ตจะถูกทิ้ง
  2. NAT gateway metrics and dimensions AWS
    ErrorPortAllocation: จำนวนครั้งที่จัดสรรพอร์ตต้นทางไม่ได้ (ถ้ามากกว่า 0 แปลว่าการเชื่อมต่อพร้อมกันมากเกินไป), ActiveConnectionCount, IdleTimeoutCount (การเชื่อมต่อที่ถูกเก็บกวาดเพราะ idle 350 วินาที), PacketsDropCount
  3. Troubleshoot NAT gateways AWS
    ถ้า idle 350 วินาที การเชื่อมต่อจะหมดอายุ และถ้าส่งต่อจะได้ RST กลับ, แนะนำ keepalive ที่สั้นกว่า 350 วินาที, ถ้าชนขีดจำกัดการเชื่อมต่อ ให้แยก gateway ตาม availability zone, เพิ่ม IP หรือลดจำนวนการเชื่อมต่อ
  4. Source Network Address Translation (SNAT) with Azure NAT Gateway Microsoft Azure
    SNAT port 64,512 พอร์ตต่อ public IP หนึ่งตัว (IP สูงสุด 16 ตัว), การเชื่อมต่อแต่ละรายการไปยังปลายทางเดียวกันต้องใช้พอร์ตต่างกัน, พอร์ตที่ปิดแล้วมี cooldown ก่อนนำกลับมาใช้กับปลายทางเดียวกัน
  5. Metrics and alerts for Azure NAT Gateway Microsoft Azure
    ถ้า SNAT Connection Count ที่กรองสถานะ Failed มากกว่า 0 อาจเป็นไปได้ว่า SNAT port หมด, Dropped Packets
  6. IP addresses and ports Google Cloud
    TCP และ UDP อย่างละ 64,512 พอร์ตต่อ NAT IP หนึ่งตัว, ค่าเริ่มต้นของพอร์ตขั้นต่ำต่อ VM คือ 64 (static allocation) และ 32 (dynamic allocation), จำนวนพอร์ตที่จองให้ VM จำกัดจำนวนการเชื่อมต่อพร้อมกันไปยังปลายทางเดียวกัน, การเชื่อมต่อที่ปิดแล้วใช้ไม่ได้ระหว่าง TIME_WAIT
  7. Logs and metrics Google Cloud
    reason OUT_OF_RESOURCES ของ dropped_sent_packets_count: แพ็กเก็ตที่ถูกทิ้งเพราะ NAT IP หรือพอร์ตไม่พอ

สาเหตุที่ควรดูประกอบ

ชั้นเดียวกัน: L5 อุปกรณ์เครือข่ายในดาต้าเซ็นเตอร์

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (เข้าเกมไม่ได้/โหลดไม่จบ)

ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง