การเปลี่ยนค่าของ / proc / sys / net / ipv4 / tcp_tw_reuse เป็นอันตรายหรือไม่?


10

เรามีระบบการผลิตสองระบบที่เพิ่งถูกเปลี่ยนเป็นเครื่องเสมือน มีแอปพลิเคชั่นของเราที่เข้าถึงฐานข้อมูล MySQL บ่อยครั้งและสำหรับแต่ละแบบสอบถามจะสร้างการเชื่อมต่อแบบสอบถามและยกเลิกการเชื่อมต่อ

มันไม่ใช่วิธีที่เหมาะสมในการสืบค้น (ฉันรู้) แต่เรามีข้อ จำกัด ที่เราไม่สามารถหลีกเลี่ยงได้ อย่างไรก็ตามปัญหานี้คือ: ในขณะที่เครื่องเป็นโฮสต์ทางกายภาพโปรแกรมทำงานได้ดี เมื่อแปลงเป็นเครื่องเสมือนเราสังเกตเห็นปัญหาการเชื่อมต่อเป็นระยะ ๆ กับฐานข้อมูล มีอยู่ครั้งหนึ่งที่การเชื่อมต่อซ็อกเก็ต 24000+ รายการใน TIME_WAIT (บนโฮสต์ทางกายภาพที่สุดที่ฉันเห็นคือ 17000 - ไม่ดี แต่ไม่ทำให้เกิดปัญหา)

ฉันต้องการให้การเชื่อมต่อเหล่านี้กลับมาใช้ใหม่เพื่อให้เราไม่เห็นปัญหาการเชื่อมต่อนั้นและ:

คำถาม:

มันตกลงหรือไม่ที่จะตั้งค่า tcp_tw_reuse เป็น 1? อันตรายที่ชัดเจนคืออะไร มีเหตุผลอะไรที่ฉันไม่ควรทำ?

นอกจากนี้มีวิธีอื่นในการรับระบบ (RHEL / CentOS) เพื่อป้องกันไม่ให้การเชื่อมต่อจำนวนมากเข้าสู่ TIME_WAIT หรือทำให้พวกเขาถูกนำมาใช้ซ้ำ

สุดท้ายนี้สิ่งที่จะเปลี่ยน tcp_tw_recycle ทำและนั่นจะช่วยฉันได้อย่างไร

ล่วงหน้าขอบคุณ!


1
ลิงก์นี้อธิบายถึงอันตรายของ tcp_tw_recycle และ tcp_tw_reuse อย่าใช้มัน

คำตอบ:


8

คุณสามารถลดเวลาลงอย่างปลอดภัย แต่คุณอาจพบปัญหาเกี่ยวกับการเชื่อมต่อที่ปิดอย่างไม่ถูกต้องบนเครือข่ายที่มีแพ็กเก็ตสูญหายหรือกระวนกระวายใจ ฉันจะไม่เริ่มจูนที่ 1 วินาทีเริ่มต้นที่ 15-30 และลงมือทำ

นอกจากนี้คุณต้องแก้ไขใบสมัครของคุณด้วย

RFC 1185มีคำอธิบายที่ดีในหัวข้อ 3.2:

เมื่อปิดการเชื่อมต่อ TCP ความล่าช้าของ 2 * MSL ในสถานะ TIME-WAIT จะผูกคู่ซ็อกเก็ตไว้ 4 นาที (ดูหัวข้อ 3.5 ของ [Postel81] แอปพลิเคชันที่สร้างขึ้นบน TCP ที่ปิดการเชื่อมต่อหนึ่งและเปิดใหม่ การเชื่อมต่อการถ่ายโอนข้อมูล FTP โดยใช้โหมดสตรีม) จะต้องเลือกซ็อกเก็ตคู่ใหม่ในแต่ละครั้งความล่าช้านี้มีวัตถุประสงค์ที่แตกต่างกันสองประการ:

 (a)  Implement the full-duplex reliable close handshake of TCP. 

      The proper time to delay the final close step is not really 
      related to the MSL; it depends instead upon the RTO for the 
      FIN segments and therefore upon the RTT of the path.* 
      Although there is no formal upper-bound on RTT, common 
      network engineering practice makes an RTT greater than 1 
      minute very unlikely.  Thus, the 4 minute delay in TIME-WAIT 
      state works satisfactorily to provide a reliable full-duplex 
      TCP close.  Note again that this is independent of MSL 
      enforcement and network speed. 

      The TIME-WAIT state could cause an indirect performance 
      problem if an application needed to repeatedly close one 
      connection and open another at a very high frequency, since 
      the number of available TCP ports on a host is less than 
      2**16.  However, high network speeds are not the major 
      contributor to this problem; the RTT is the limiting factor 
      in how quickly connections can be opened and closed. 
      Therefore, this problem will no worse at high transfer 
      speeds. 

 (b)  Allow old duplicate segements to expire. 

      Suppose that a host keeps a cache of the last timestamp 
      received from each remote host.  This can be used to reject 
      old duplicate segments from earlier incarnations of the 

* หมายเหตุ: อาจเป็นที่ถกเถียงกันอยู่ว่าด้านที่ส่ง FIN รู้ระดับความน่าเชื่อถือที่ต้องการและดังนั้นจึงควรสามารถกำหนดความยาวของการหน่วงเวลา TIME-WAIT สำหรับผู้รับของ FIN สิ่งนี้สามารถทำได้ด้วยตัวเลือก TCP ที่เหมาะสมในส่วน FIN

      connection, if the timestamp clock can be guaranteed to have 
      ticked at least once since the old conennection was open. 
      This requires that the TIME-WAIT delay plus the RTT together 
      must be at least one tick of the sender's timestamp clock. 

      Note that this is a variant on the mechanism proposed by 
      Garlick, Rom, and Postel (see the appendix), which required 
      each host to maintain connection records containing the 
      highest sequence numbers on every connection.  Using 
      timestamps instead, it is only necessary to keep one quantity 
      per remote host, regardless of the number of simultaneous 
      connections to that host.

ขอบคุณสำหรับคำอธิบาย ปัญหาอยู่ในห้องสมุดซึ่งฉันไม่สามารถควบคุมได้
ซาก้า

6

สิ่งนี้ไม่ตอบคำถามของคุณ (และมันก็สายไป 18 เดือน) แต่แนะนำวิธีอื่นในการทำให้แอปดั้งเดิมของคุณใช้พอร์ตซ้ำ:

ทางเลือกที่มีประโยชน์ในการตั้งค่าtcp_tw_reuse(หรือtcp_tw_recycle) บนระบบคือการแทรกไลบรารี่ที่แชร์ (โดยใช้LD_PRELOAD) ลงในแอพของคุณ ไลบรารีนั้นสามารถอนุญาตให้ใช้พอร์ตซ้ำได้ สิ่งนี้ทำให้แอปรุ่นเก่าของคุณอนุญาตให้นำพอร์ตกลับมาใช้ใหม่โดยไม่บังคับให้ใช้กับแอพทั้งหมดในระบบของคุณ (ไม่จำเป็นต้องดัดแปลงแอพของคุณ) จึง จำกัด ผลกระทบของการปรับแต่ง ตัวอย่างเช่น,

    LD_PRELOAD=/opt/local/lib/libreuse.so ./legacy_app

ไลบรารีที่แบ่งใช้นี้ควรตัดการsocket()โทรเรียกใช้ซ็อกเก็ตจริง () และตั้งค่า SO_REUSEADDR และ / หรือ SO_REUSEPORT บนซ็อกเก็ตที่ส่งคืน ดูhttp://libkeepalive.sourceforge.netสำหรับตัวอย่างของวิธีการทำสิ่งนี้ (สิ่งนี้จะเปิดใช้งานบน keepalives แต่การเปิดใช้งาน SO_REUSEPORT นั้นคล้ายกันมาก) หากแอปดั้งเดิมของคุณใช้ IPv6 อย่าลืมเปลี่ยนสาย 55 libkeepalive.cจาก

    if((domain == PF_INET) && (type == SOCK_STREAM)) {

ถึง

    if(((domain == PF_INET) || (domain == PF_INET6)) && (type == SOCK_STREAM)) {

หากคุณติดอยู่ส่งอีเมลฉันและฉันจะเขียนรหัสและส่งให้คุณ


6

ฉันคิดว่าเป็นการดีที่จะเปลี่ยนค่านี้เป็น 1 วิธีที่เหมาะสมกว่าอาจใช้คำสั่ง:

[root@server]# sysctl -w net.ipv4.tcp_tw_reuse=1

ไม่มีอันตรายที่ชัดเจนที่ฉันรู้ แต่การค้นหาโดย Google อย่างรวดเร็วสร้างลิงค์นี้ซึ่งยืนยันว่าtcp_tw_reuseเป็นทางเลือกที่ดีกว่าtcp_tw_recycleแต่ควรใช้ด้วยความระมัดระวังโดยไม่คำนึงถึง


2
ไม่นั่นไม่ใช่สิ่งที่พูด มันบอกว่า (พูดถึง tcp_tw_reuse) "โดยทั่วไปแล้วมันเป็นทางเลือกที่ปลอดภัยกว่าสำหรับ tcp_tw_recycle"
Fantius

0

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

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


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