سؤال ما الذي يحدد الحد الأقصى لعدد الاتصالات على خادم Linux؟


ما هي معلمة kernel أو أي إعدادات أخرى تتحكم في الحد الأقصى لعدد مآخذ TCP التي يمكن فتحها على خادم Linux؟ ما هي المقايضات من السماح لمزيد من الاتصالات؟

لاحظت أثناء تحميل اختبار خادم أباتشي مع أب أنه من السهل جدًا الوصول إلى الحد الأقصى من الاتصالات المفتوحة على الخادم. إذا تركت خيار ab -k ، الذي يسمح بإعادة استخدام الاتصال ، وجعله يرسل أكثر من 10000 طلب ، فإن Apache يقدم أول 11000 طلب أو ما يقاربها ثم يتوقف لمدة 60 ثانية. إظهار نظرة على إخراج netstat 11،000 اتصالات في الحالة TIME_WAIT. على ما يبدو ، هذا أمر طبيعي. يتم الاحتفاظ اتصالات فتح افتراضي 60 ثانية حتى بعد الانتهاء من العميل معهم أسباب موثوقية TCP.

يبدو أن هذا من شأنه أن يكون وسيلة سهلة لخادم DoS وأتساءل ما هي التوليفات المعتادة والاحتياطات لذلك.

هنا ناتج الاختبار الخاص بي:

# ab -c 5 -n 50000 http://localhost/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
apr_poll: The timeout specified has expired (70007)
Total of 11655 requests completed

إليك الأمر netstat الذي أقوم بتشغيله أثناء الاختبار:

 # netstat --inet -p | grep "localhost:www" | sed -e 's/ \+/ /g' | cut -d' ' -f 1-4,6-7 | sort | uniq -c 
  11651 tcp 0 0 localhost:www TIME_WAIT -
      1 tcp 0 1 localhost:44423 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44424 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44425 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44426 SYN_SENT 7831/ab
      1 tcp 0 1 localhost:44428 SYN_SENT 7831/ab

85
2018-05-21 16:18


الأصل




الأجوبة:


لقد عثرت أخيرًا على الإعداد الذي كان يحد بالفعل من عدد الاتصالات: net.ipv4.netfilter.ip_conntrack_max. تم تعيين هذا على 11776 وكل ما أقوم بتعيينه هو عدد الطلبات التي يمكنني تقديمها في الاختبار قبل الانتظار tcp_fin_timeout ثانية حتى تصبح المزيد من الاتصالات متاحة. ال conntrack الجدول هو ما يستخدمه kernel لتتبع حالة الاتصالات حتى بمجرد أن يكون ممتلئًا ، يبدأ kernel في إسقاط الحزم وطباعة هذا في السجل:

Jun  2 20:39:14 XXXX-XXX kernel: ip_conntrack: table full, dropping packet.

الخطوة التالية هي الحصول على النواة لإعادة تدوير كل هذه الروابط في TIME_WAIT الدولة بدلا من إسقاط الحزم. يمكنني الحصول على ذلك إما عن طريق تشغيل tcp_tw_recycle أو زيادة ip_conntrack_max لتكون أكبر من عدد المنافذ المحلية المتاحة للاتصالات بواسطة ip_local_port_range. أعتقد أنه بمجرد خروج النواة من المنافذ المحلية ، تبدأ إعادة تدوير الاتصالات. يستخدم هذا المزيد من اتصالات تتبع الذاكرة ولكن يبدو أن الحل أفضل من تشغيل tcp_tw_recycle لأن المستندات تعني أن ذلك خطير.

باستخدام هذا التكوين ، يمكنني تشغيل ab طوال اليوم وعدم تشغيل الاتصالات:

net.ipv4.netfilter.ip_conntrack_max = 32768
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_fin_timeout = 25
net.ipv4.tcp_max_orphans = 8192
net.ipv4.ip_local_port_range = 32768    61000

ال tcp_max_orphans الإعداد ليس له أي تأثير على اختباراتي ولا أعرف السبب. أعتقد أنه سيغلق الاتصالات في TIME_WAIT الدولة مرة واحدة كان هناك 8192 منهم ولكن ذلك لا يفعل ذلك بالنسبة لي.


62
2018-06-03 16:02



أين نقوم بتكوين هذه المعلمات؟ - Codevalley
Codevalley قد يكون هذا معتمدًا على النظام ولكن على خادم Ubuntu يذهبون إلى /etc/sysctl.conf - Ben Williams


كنت حقا تريد أن ننظر في ما هو / proc نظام ملفات لتقديم لك في هذا الصدد.

في هذه الصفحة الأخيرة ، قد تجد ما يلي يهمك:


23
2018-05-21 18:15



tcp_max_orphans مثير للاهتمام ولكن يبدو أنه لا يعمل. عندما أحاول قياس المآوي اليتيمة أثناء الاختبار ، أرى 11،651 منهم بينما tcp_max_orphans هو 8،092. # netstat --inet -p | grep "localhost: www" | sed -e / / / / / g '| cut -d '' -f 1-4،6-7 | نوع uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
انظر إلى إعداد tcp_orphan_retries - الفكرة هي أن المقابس يتم "إعدامها" أسرع ... - Avery Payne
@ jauder هو اقتراح + tcp_orphan_retries يبدو وكأنه الفوز المحتمل لحالتك. - Avery Payne


لا أعتقد أن هناك مضلعًا لتعيين ذلك مباشرةً. يقع هذا ضمن فئة ضبط TCP / IP. لمعرفة ما يمكنك ضبطه ، جرب "man 7 tcp". يتم استخدام sysctl ('man 8 sysctl') لتعيين هذه. 'sysctl -a | grep tcp "سوف تظهر لك معظم ما يمكنك ضبطه ، لكنني لست متأكداً مما إذا كان سيعرض كل منهم. أيضا ، ما لم يتغير هذا ، فتح مآخذ توصيل TCP / IP تبدو مثل واصفات الملفات. وبالتالي هذه والجزء التالي في هذا الرابط قد يكون ما تبحث عنه.


3
2018-05-21 17:31





جرّب إعداد الإعدادات التالية أيضًا مع تعيين الإعداد tcp_fin_timeout. يجب أن يغلق هذا TIME_WAIT بسرعة أكبر.

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

2
2018-05-21 19:38



احترس هنا! شهدت بالطريقة الصعبة. "قد يتسبب هذا في إسقاط الإطارات مع موازنة التحميل و NAT ، فقط استخدم هذا للخادم الذي يتصل فقط عبر الشبكة المحلية الخاصة بك." - wiki.archlinux.org/index.php/Sysctl - Henk
Henk أعتقد أنه هو tcp_tw_recycle هذا يحتمل أن تكون خطرة. tcp_tw_reuse أكثر أمانًا ولا أرى أي سبب لاستخدامها في وقت واحد. - Vladislav Rastrusny


يستخدم apache (1) للمعرفة مسبقًا لمجرد دعم 250 اتصالاً متزامناً فقط - إذا كنت تريد المزيد ، كان هناك ملف رأس واحد لتعديله للسماح بجلسات متزامنة أكثر. لا أعرف ما إذا كان هذا لا يزال صحيحًا مع Apache 2.

كما تحتاج إلى إضافة خيار للسماح بتحميل المزيد من واصفات الملفات المفتوحة للحساب الذي يشغل Apache - وهو أمر فشلت التعليقات السابقة في الإشارة إليه.

انتبه إلى إعدادات الموظف الخاص بك ونوع المهلات التي لديك داخل Apache نفسها ، وعدد الخوادم الاحتياطية التي قمت بتشغيلها في وقت واحد ، ومدى سرعة قتل هذه العمليات الإضافية.


2
2018-05-21 21:21





يمكنك تقليل الوقت المستغرق في حالة TIME_WAIT (تعيين net.ipv4.tcp_fin_timeout). يمكنك استبدال Apache بـ YAWS أو nginx أو شيء مشابه.

عادةً ما تتضمن عمليات تبادل المزيد من الاتصالات استخدام الذاكرة ، وإذا كان لديك عملية تشبيك ، فإن الكثير من عمليات الطفل التي تغرق وحدة المعالجة المركزية الخاصة بك.


1
2018-05-21 16:26



tcp_fin_timeout ليس من أجل تحديد انتهاء صلاحية TIME-WAIT ، والذي لا يمكن تغييره خارج إعادة بناء kernel ، ولكن لـ FIN ، كما يشير الاسم. - Alexandr Kurilin


العدد المطلق للمآخذ التي يمكن فتحها على عنوان IP واحد هو 2 ^ 16 ويتم تعريفه بواسطة TCP / UDP ، وليس kernel.


0
2018-05-30 16:42



لا ليس كذلك. يمكنك فتح المزيد ، حيث لا يحتاج المنفذ المحلي إلى أن يكون فريداً طالما أن العناوين البعيدة مختلفة. وعلاوة على ذلك ، قال البروتوكول الاختياري لكل خادم ، ويمكنك أن يكون> ​​عنوان واحد لكل خادم. - MarkR


أداة قياس أداء خادم Apache HTTP ، أبفي الإصدار 2.4 لديه مهلة اختيار. أنظر أيضا خطأ AB (Apache Bench): apr_poll: انتهت صلاحية المهلة المحددة (70007) على Windows.

هذا الخيار يحل مشكلتك.


0
2018-02-08 17:56