ما هي تكلفة العديد من TIME_WAIT على الجانب الخادم؟

StackOverflow https://stackoverflow.com/questions/1803566

  •  05-07-2019
  •  | 
  •  

سؤال

لنفترض وجود العميل الذي يجعل الكثير من الاتصالات قصيرة المعيشة إلى ملقم.

إذا يغلق العميل الاتصال، سيكون هناك العديد من الموانئ في ولاية TIME_WAIT على جانب العميل. منذ يعمل العميل من الموانئ المحلية، يصبح من المستحيل لجعل محاولة اتصال جديدة بسرعة.

إذا يغلق الملقم الاتصال، وسوف نرى الكثير TIME_WAITs على جانب الملقم. ومع ذلك، فإن هذا تفعل أي ضرر؟ العميل (أو عملاء آخرين) يمكن أن تبقي على جعل محاولات الاتصال نظرا لأنه لم ينتهي من الموانئ المحلية، ووعدد من الدول TIME_WAIT تزيد على جانب الملقم. ماذا يحدث في نهاية المطاف؟ لا شيء يحدث سيئة؟ (التباطؤ، وتحطم، إسقاط الاتصالات، الخ.)

تجدر الإشارة إلى أن سؤالي ليس "ما هو الغرض من TIME_WAIT؟" ولكن "ماذا يحدث إذا كان هناك الكثير من الدول TIME_WAIT على الخادم؟" أعرف مسبقا ما يحدث عند إغلاق الاتصال في TCP / IP ولماذا مطلوب الدولة TIME_WAIT. أنا لا أسعى إلى المتاعب تبادل لاطلاق النار ولكن نريد فقط أن نعرف ما هي مشكلة محتملة معها.

لببساطة، دعنا نقول يطبع netstat -nat | grep :8080 | grep TIME_WAIT | wc -l 100000. ماذا قد يحدث؟ لا يبطئ / S كومة شبكة O أسفل؟ "عدد كبير جدا من الملفات المفتوحة" خطأ؟ أو، لا شيء سوى ما يدعو للقلق؟

هل كانت مفيدة؟

المحلول

وكل مأخذ في TIME_WAIT يستهلك بعض الذاكرة في النواة، وعادة ما تكون أقل بعض الشيء من مأخذ ESTABLISHED حتى الآن لا تزال كبيرة. وهناك عدد كبير بما فيه الكفاية يمكن أن يستنفد الذاكرة النواة، أو على الأقل انخفاض الأداء بسبب أن الذاكرة يمكن أن تستخدم لأغراض أخرى. مآخذ TIME_WAIT لا يحملون واصفات الملفات المفتوحة (على افتراض أنها أغلقت بشكل صحيح)، لذلك يجب أن لا داعي للقلق حول خطأ "العديد من الملفات مفتوحة".

ومقبس يربط أيضا أن معين عنوان IP src / dst وميناء لذلك لا يمكن إعادة استخدامها لمدة الفاصل الزمني TIME_WAIT. (وهذا هو الغرض المقصود من الدولة TIME_WAIT.) ربط ميناء ليست عادة مشكلة إلا إذا كنت بحاجة إلى إعادة توصيل مع الزوج نفس المنفذ. في معظم الأحيان جانب واحد سوف تستخدم منفذ سريع الزوال، مع جانب واحد فقط ترتكز على هذه المنافذ المعروفة. ومع ذلك، هناك عدد كبير جدا من مآخذ TIME_WAIT يمكن أن يستنفد مساحة المنفذ المؤقت إذا كنت مرارا وتكرارا، وكثيرا ما يربط بين نفس عناوين IP اثنين. لاحظ أن هذا يؤثر فقط على هذا الزوج عنوان IP معين، وسوف لن يؤثر على إنشاء علاقات مع المضيفين الآخرين.

نصائح أخرى

والنتائج حتى الآن:

وحتى إذا كان الملقم إغلاق مأخذ باستخدام استدعاء النظام، وسوف لن يتم الافراج اصف ملفها إذا كان يدخل في حالة TIME_WAIT. سيتم الافراج عنهم واصف الملف لاحقا عندما ذهبت الدولة TIME_WAIT (أي بعد 2 * ثواني MSL). ولذلك، فإن الكثير من TIME_WAITs ربما يؤدي إلى الخطأ "عدد كبير جدا من الملفات المفتوحة في عملية الخادم.

وأعتقد تم تنفيذ كومة O / S TCP / IP مع بنية البيانات المناسبة (مثل جدول التجزئة)، وبالتالي فإن العدد الإجمالي للTIME_WAITs لا ينبغي أن تؤثر على أداء O / S TCP / IP مكدس. لن يؤدي إلا إلى عملية (الخادم) التي تملك مآخذ في حالة TIME_WAIT يعانون.

ويتم تعريف كل اتصال من قبل الصفوف (tuple) (IP الخادم، منفذ الخادم، العميل IP، ميناء العميل). بشكل حاسم، الاتصالات TIME_WAIT (سواء كانوا على جانب الملقم أو على جانب العميل) يحتل كل واحدة من هذه الصفوف.

ومع TIME_WAITs على جانب العميل، فإنه من السهل أن نرى لماذا لا يمكن أن تجعل أي مزيد من الاتصالات - لديك أي منافذ أكثر المحلية. ومع ذلك، تنطبق نفس المشكلة على جانب الملقم - مرة واحدة لديها 64K الاتصالات في الدولة TIME_WAIT <م> لعميل واحد ، فإنه لا يمكن أن تقبل أي مزيد من الاتصالات <م> من هذا العميل ، لأنه لا يوجد لديه وسيلة لمعرفة الفرق بين الاتصال القديمة والاتصال الجديد - يتم تحديد كل من الاتصالات من قبل نفس الصفوف (tuple). خادم يجب ان ترسل لتوه RSTs لمحاولات الاتصال الجديدة من هذا العميل في هذه الحالة.

إذا كان لديك الكثير من الاتصالات من العديد من البرامج المتكاملة العميل مختلفة إلى البرامج المتكاملة الخادم الذي قد يمتد الى حدود الجدول تتبع الاتصال.

وتحقق:

sysctl net.ipv4.netfilter.ip_conntrack_count
sysctl net.ipv4.netfilter.ip_conntrack_max

وعلى كل SRC الملكية الفكرية / ميناء والصفوف دست الملكية الفكرية / ميناء هل يمكن أن يكون net.ipv4.netfilter.ip_conntrack_max في الجدول تتبع فقط. إذا تم ضرب هذا الحد سترى الرسالة في السجلات الخاصة بك "nf_conntrack: الجدول الكامل، وعلبة إسقاط" وسيقوم الملقم لا يقبل الاتصالات الواردة جديدة حتى يكون هناك مساحة في الجدول تتبع مرة أخرى.

وهذا القيد قد يصل كنت لفترة طويلة قبل تشغيل المنافذ المؤقتة بها.

في السيناريو بلدي جريت السيناريو الجداول التي ملفات مرارا وتكرارا، المنتج الخاص بي القيام ببعض العمليات الحسابية ويرسل ردا على العميل أي العميل إجراء مكالمة HTTP المتكررة للحصول على استجابة كل file.When حول ومن المقرر 150 ملفات الموانئ مقبس في خدمة بلدي يذهب في حالة TIME_WAIT ويتم طرح استثناء في العميل الذي يفتح اتصال HTTP أي

 Error : [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted

وكانت النتيجة أن بلدي hanged.I تطبيق لا يعرفون يمكن threadshave ذهب في حالة انتظار أو ما حدث ولكني في حاجة لقتل جميع العمليات أو إعادة طلبي لجعلها العمل مرة أخرى.

وحاولت تقليل وقت الانتظار إلى 30 ثانية لأنها 240 ثانية افتراضيا ولكنه لم ينجح.

كان

وتأثير ذلك العام أساسا حاسما حيث حققت طلبي غير مستجيبة

ويبدو أن الخادم يمكن تشغيل للتو من المنافذ لتعيين الاتصالات الواردة (لمدة TIMED_WAITs القائمة) - قضية لهجوم DOS

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top