ما هي تكلفة العديد من TIME_WAIT على الجانب الخادم؟
سؤال
لنفترض وجود العميل الذي يجعل الكثير من الاتصالات قصيرة المعيشة إلى ملقم.
إذا يغلق العميل الاتصال، سيكون هناك العديد من الموانئ في ولاية TIME_WAIT
على جانب العميل. منذ يعمل العميل من الموانئ المحلية، يصبح من المستحيل لجعل محاولة اتصال جديدة بسرعة.
إذا يغلق الملقم الاتصال، وسوف نرى الكثير TIME_WAIT
s على جانب الملقم. ومع ذلك، فإن هذا تفعل أي ضرر؟ العميل (أو عملاء آخرين) يمكن أن تبقي على جعل محاولات الاتصال نظرا لأنه لم ينتهي من الموانئ المحلية، ووعدد من الدول 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_WAIT
s على جانب العميل، فإنه من السهل أن نرى لماذا لا يمكن أن تجعل أي مزيد من الاتصالات - لديك أي منافذ أكثر المحلية. ومع ذلك، تنطبق نفس المشكلة على جانب الملقم - مرة واحدة لديها 64K الاتصالات في الدولة TIME_WAIT
<م> لعميل واحد م>، فإنه لا يمكن أن تقبل أي مزيد من الاتصالات <م> من هذا العميل م>، لأنه لا يوجد لديه وسيلة لمعرفة الفرق بين الاتصال القديمة والاتصال الجديد - يتم تحديد كل من الاتصالات من قبل نفس الصفوف (tuple). خادم يجب ان ترسل لتوه RST
s لمحاولات الاتصال الجديدة من هذا العميل في هذه الحالة.
إذا كان لديك الكثير من الاتصالات من العديد من البرامج المتكاملة العميل مختلفة إلى البرامج المتكاملة الخادم الذي قد يمتد الى حدود الجدول تتبع الاتصال.
وتحقق:
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