Port Exhaustion

ตามที่ได้เคย blog ไว้ว่า บังเอิญได้มาเกี่ยวข้องกับการทดสอบประสิทธิภาพของระบบซึ่งเป็น Window-base และได้เห็นปัญหาในการได้มาของ software จึงอยากจะจดบันทึกไว้เตือนตัวเอง และเผื่อจะเป็นประโยชน์กับคนอื่นได้บ้าง

ซึ่งจากการทดสอบระบบ เราพบว่า web application ที่ได้ทดสอบมีปัญหา เมื่อต้องรองรับผู้ใช้จำนวนมากๆ และจากผู้รู้หลายคนช่วยกันตรวจสอบจึงรู้ว่า อาการนี้เรียกว่า port exhaustion ซึ่งก็คือ application มีการใช้ dynamic port จนเต็ม ซึ่ง port ที่ใช้จะเป็น outbound connection (เพราะถ้าเป็น inbound มันจะมีอยู่ port เดียวอ่ะนะ)

ซึ่งวิธีการที่จะตรวจสอบการใช้ คือการใช้ netstat

> netstat -nao

ซึ่งจะแสดง connection ทั้งหมด และ pid เราจะต้องมองหา connection ที่ผิดปกติเอง ซึ่งโดยปกติถ้ามีอาการของ port exhaustion แสดงว่าจะต้องมีการใช้ port จำนวนมากจาก application หนึ่ง ซึ่งอาจจะดูได้จาก application ที่มี pid เดียวกัน และมีการใช้ port เป็นจำนวนมาก

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

  1. เพิ่ม dynamic port ซึ่งแต่เดิม Windows Server 2012 จะมีการกำหนดค่า MaxUserPort ไว้ใน Windows Registry โดยสามารถกำหนได้สูงสุดคือค่า 65534 (แต่ port 1024 แรก จะกันไว้สำหรับ application บางตัวอยู่แล้ว)
  2. กำหนด connection timeout ของ port ให้ลดลง เนื่องจาก หลังจากที่ application ได้มีการปิด port ไปแล้ว port นั้นๆ จะยังใช้ไม่ได้จนกว่า 4 นาทีต่อมา ซึ่งจะต้องไปแก้ไขค่า TcpTimedWaitDelay ใน Windows Registry (แต่อยากให้ลองหาข้อมูลเพิ่มเติมกันนะค่ะ ว่าทำไมมันถึงต้องกันไว้ 4 นาที เพื่อสวัสดิภาพของระบบโดยแท้จริง) 

ทั้งนี้วิธีแก้ไข Port หรืออาการของ Port โดยละเอียด ดูได้จาก reference ข้างท้ายนะค่ะ (งานใหม่ๆ ไม่ได้มาพร้อมความลำบากเพียงอย่างเดียว มันมาพร้อมความรู้ใหม่ๆ เสมอ - เหรียญมี 2 ด้านเสมอเช่นเดียวกัน)

Reference:
Port Exhaustion
Avoiding TCP/IP Port Exhaustion
TcpTimedWaitDelay
MaxFreeTcbs