שאלה מה מגביל את מספר החיבורים המרבי בשרת לינוקס?


איזה פרמטר ליבה או הגדרות אחרות לשלוט על המספר המרבי של שקעי TCP שיכולים להיות פתוחים בשרת לינוקס? מה הם חילופי הקשרים יותר?

שמתי לב בעת בדיקות עומס שרת Apache עם asma כי זה די קל מקסימום את החיבורים הפתוחים בשרת. אם אתה משאיר את האפשרות של ab-k, מה שמאפשר שימוש חוזר בחיבור, ויש לו לשלוח יותר מ -10,000 בקשות אז אפאצ 'י משרת את 11,000 הראשונים או כך בקשות ולאחר מכן עוצרת למשך 60 שניות. מבט על פלט netstat מראה 11,000 חיבורים במצב TIME_WAIT. כנראה, זה נורמלי. הקשרים נשמרים פתוח ברירת המחדל של 60 שניות גם לאחר הלקוח נעשה איתם TCP סיבות אמינות.

זה נראה כאילו זה יהיה דרך קלה DoS שרת ואני תוהה מה הרגילים tunings וזהירות עבור זה.

הנה פלט הבדיקה שלי:

# 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. זה נקבע ל -11,776, וכל מה שהגעתי אליו הוא מספר הבקשות שאני יכול לשמש במבחן שלי לפני שתצטרך לחכות tcp_fin_timeout שניות לחיבורים נוספים שיהפכו לזמינים. ה conntrack טבלה היא מה הליבה משתמשת כדי לעקוב אחר מצב החיבורים כך פעם זה מלא, הקרנל מתחיל להפיל מנות והדפסה זו ביומן:

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 זה עשוי להיות תלוי במערכת אבל על שרת אובונטו הם נכנסים /etc/sysctl.conf - Ben Williams


אתה באמת רוצה להסתכל על מה / proc filesystem יש להציע לך בעניין זה.

בדף האחרון, ייתכן שתמצא את הנושאים הבאים שמעניינים אותך:

  • / proc / sys / net / ipv4 / tcp_max_orphans, אשר שולט במספר המרבי של שקעים המוחזקים על ידי המערכת לא מחובר למשהו. העלאת זה יכול לצרוך ככל 64kbyte של זיכרון שאינו swappable לכל שקע יתום.
  • / proc / sys / net / ipv4 / tcp_orphan_retries, אשר שולט על כמות ניסיונות חוזרים לפני שקע הוא יתום ונסגר. יש הערה ספציפית בדף זה על שרתי אינטרנט כי הוא עניין ישיר לך ...

23
2018-05-21 18:15



tcp_max_orphans מעניין אבל זה נראה כאילו זה לא עובד. כאשר אני מנסה למדוד את ארובות יתומים במהלך הבדיקה שלי אני רואה 11,651 מהם בזמן tcp_max_orphans הוא 8,092. # netstat --inet -p grep "localhost: www" | sed-s / / \ / / g '| cut-d '' -f 1-4,6-7 | מיון | uniq -c 11651 tcp 0 0 localhost: www TIME_WAIT - - Ben Williams
תסתכל על ההגדרה tcp_orphan_retries - הרעיון להיות, שקעים הם "culled" מהר יותר ... - Avery Payne
@ Jauder הו של הצעה + tcp_orphan_retries נשמע כמו לנצח פוטנציאל למצב שלך. - Avery Payne


אני לא חושב שיש כוונון להגדיר את זה ישירות. זה נופל תחת הקטגוריה של כוונון TCP / IP. כדי לברר מה אתה יכול לכוון, לנסות 'גבר 7 tcp'. Sysctl ('אדם 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



זהירות כאן! חווה את הדרך הקשה. "זה עלול לגרום לירידה במסגרות עם איזון עומסים ו NATs, רק להשתמש בו עבור שרת זה מתקשר רק על הרשת המקומית שלך." - wiki.archlinux.org/index.php/Sysctl - Henk
@Hank אני מניח שכן tcp_tw_recycle זה עלול להיות מסוכן. tcp_tw_reuse הוא בטוח ואני לא רואה שום סיבה להשתמש בהם בו זמנית. - Vladislav Rastrusny


אפאצ 'י המניות (1) היה מוגדר מראש כדי לתמוך רק 250 חיבורים בו זמנית - אם אתה רוצה יותר, היה קובץ כותרת אחת כדי לשנות כדי לאפשר פגישות בו זמנית יותר. אני לא יודע אם זה עדיין נכון עם Apache 2.

כמו כן, עליך להוסיף אפשרות כדי לאפשר המון תיאורי קבצים פתוחים יותר עבור החשבון שמפעיל את Apache - דבר שההערות הקודמות אינן מציינות.

שים לב להגדרות העובד שלך ואיזה סוג של זמן קצוב יש לך בתוך אפאצ 'י עצמה, כמה שרתים אלה רצים יש לך לפעול בו זמנית, וכמה מהר אלה תהליכים נוספים נהרגים.


2
2018-05-21 21:21





תוכל להקטין את הזמן המושקע במצב TIME_WAIT (Set net.ipv4.tcp_fin_timeout). אתה יכול להחליף את אפאצ 'י עם YAWS או nginx או משהו דומה.

Tradeoffs של קשרים יותר בדרך כלל כרוך בשימוש בזיכרון, ואם יש לך תהליך forking, הרבה תהליכי הילד אשר הביצה את המעבד.


1
2018-05-21 16:26



tcp_fin_timeout אינו מכוון להגדרת תפוגת TIME-WAIT, שאינה ניתנת לשינוי מחוץ לבנייה מחדש של הקרנל, אלא ל- FIN, כפי שהשם מציין. - Alexandr Kurilin


המספר המוחלט של שקעים שניתן לפתוח בכתובת IP אחת הוא 2 ^ 16 ומוגדר על-ידי TCP / UDP, ולא הקרנל.


0
2018-05-30 16:42



לא זה לא. אתה יכול לפתוח יותר, כמו היציאה המקומית לא צריך להיות ייחודי כל עוד כתובות מרוחקים שונים. יתר על כן, OP אמר לכל שרת, ואתה יכול לקבל כתובת אחת לכל שרת. - MarkR