ฉันจะกำจัดซ็อกเก็ตในสถานะ FIN_WAIT1 ได้อย่างไร


18

ฉันมีพอร์ตที่ถูกบล็อกโดยกระบวนการที่ฉันต้องการฆ่า (telnet daemon เล็กน้อยที่ล้มเหลว) กระบวนการถูกฆ่าสำเร็จ แต่พอร์ตยังอยู่ในสถานะ 'FIN_WAIT1' มันไม่ได้ออกมาจากมันหมดเวลาสำหรับที่ดูเหมือนจะถูกตั้งค่าเป็น 'ทศวรรษ'

วิธีเดียวที่ฉันพบว่าเพิ่มพอร์ตคือรีบูตเครื่องทั้งหมดซึ่งเป็นสิ่งที่ฉันไม่ต้องการทำ

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

ไม่มีใครรู้ว่าฉันจะได้รับพอร์ตนี้ถูกปิดกั้นโดยไม่ต้องรีบูตเครื่อง?

คำตอบ:


18
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1

2
มันจะปรับปรุงคำตอบให้จดบันทึก$whateveritwasก่อนเป็นอันดับแรก
haventchecked

7

/proc/sys/net/ipv4/tcp_fin_timeoutคุณควรจะสามารถที่จะตั้งหมดเวลาด้วย

ดูเหมือนจะไม่มีทางล้างซ็อกเก็ตด้วยตนเอง


6
คำตอบนี้ไม่ถูกต้อง tcp_orphan_retries ส่งผลกระทบกับ FIN_WAIT1, tcp_fin_timeout ส่งผลกระทบต่อ FIN_WAIT2
suprjami

suprjami ถูกต้อง tcp_fin_timeout มีผลกับ FIN_WAIT2 ซึ่งจะถูกเรียกใช้เมื่อใช้ SO_LINGER เท่านั้น
Matt

@innaM คุณช่วยลบคำตอบนี้ได้ไหม? มันไม่ถูกต้องและสะสม downvotes ฉันเห็นว่าคุณยังคงใช้งานอยู่ดังนั้นดูเหมือนว่าจะเป็นการดีที่สุดที่จะลบคำตอบออก
Andrew B

@Andrew B: ดูเหมือนว่าไม่สามารถลบคำตอบที่ยอมรับได้
innaM

6

ดูเหมือนว่าการตั้งค่า tcp_orphan_retries ควบคุมว่าจะต้องทำกี่ครั้งก่อนที่จะปล่อยพอร์ตที่ไม่ใช้เซิร์ฟเวอร์ มันเป็น 0 ที่นี่หลังจากตั้งค่าเป็น 1 พอร์ตก็หายไป

HTH


1
เกี่ยวข้องอย่างใกล้ชิด: 0 เป็นค่าเริ่มต้นซึ่งหมายถึง 8. serverfault.com/a/408882/152073
Andrew B

5

/proc/sys/net/ipv4/tcp_fin_timeoutคือการหมดเวลาของสถานะ FIN-WAIT-2 ไม่ใช่ FIN-WAIT-1 คุณควรไปกับเส้นทาง tcpkill หรือคุณสามารถลองเล่นกับเวลาที่ตาม/proc/sys/net/ipv4/tcp_keepalive_*มาเพื่อบังคับให้ฆ่าโดย SO


2

รันขั้นตอนเหล่านี้ภายใต้ root ID และลบทิ้งสำหรับฉัน

จับการตั้งค่าเคอร์เนลเพื่อเปลี่ยนตัวแปร

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

ตั้งค่าสูงสุดเด็กกำพร้าชั่วคราวเป็น 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

ตรวจสอบเพื่อให้แน่ใจว่าพอร์ตที่มีปัญหาไม่ได้ใช้งานอีกต่อไป

$ netstat -np|grep 9716

รอสักครู่และทำซ้ำขั้นตอนข้างต้นหากจำเป็นจนกว่าคำสั่งด้านบนจะไม่ส่งคืนบรรทัด

รีเซ็ตพารามิเตอร์เคอร์เนล tcp_max_orphans กลับไปเป็นค่าดั้งเดิมจากตัวแปรด้านบน

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans

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

1

FIN_WAIT1

แอปพลิเคชันบนเครื่องท้องถิ่นปิดการเชื่อมต่อ สิ่งบ่งชี้นี้ถูกส่งไปยังเครื่องระยะไกล

แอปพลิเคชันของคุณปิดด้านข้างของการเชื่อมต่อซ็อกเก็ตกำลังรอด้านระยะไกลเพื่อยืนยันว่าปิด หากคุณมีปัญหากับซ็อกเก็ตเหล่านั้นจำนวนมากที่ถูกเก็บไว้ในFIN_WAIT1คุณควรทำตามคำแนะนำของ Manni ด้านบน


0

บนเคอร์เนล linux> = 4.9 คุณสามารถใช้ssคำสั่งจาก iproute2 ด้วยคีย์ -K

ss -K dst 192.168.1.214 dport = 49029 เคอร์เนลต้องถูกคอมไพล์ด้วยตัวเลือก CONFIG_INET_DIAG_DESTROY

ผ่าน/unix//a/511691/43898



-4

สิ่งนี้อาจช่วย:

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0

6
มันอาจช่วยถ้าคุณอธิบายว่ามันคืออะไร เราเป็นมืออาชีพดังนั้นเราจึงไม่วางสิ่งที่สุ่มสี่สุ่มห้าและหวังว่ามันจะช่วยได้
Michael Hampton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.