שאלה מדוע TCP מקבל () ביצועים כל כך רע תחת זן?


השיעור שבו השרת שלי יכול לקבל () חיבורי TCP נכנסים חדשים הוא ממש רע תחת Xen. אותו מבחן על חומרה חשופה מתכת עולה עליות 3-5x.

  1. איך זה כל כך רע תחת זן?
  2. האם אתה יכול לשנות את Xen כדי לשפר את הביצועים עבור חיבורי TCP חדשים?
  3. האם יש פלטפורמות וירטואליזציה אחרות המתאימות יותר לשימוש מסוג זה?

רקע כללי

לאחרונה אני כבר לחקור כמה צווארי בקבוק ביצועים של שרת הבית שפותח ב- Java פועל תחת זן. השרת מדבר HTTP ועונה פשוטה TCP להתחבר / בקשות / תגובה / ניתוק שיחות.

אבל גם בעת שליחת boatloads של התנועה לשרת, זה לא יכול לקבל יותר מ ~ 7000 חיבורי TCP לשנייה (על 8 הליבה EC2 למשל, c1.xlarge פועל Xen). במהלך הבדיקה, השרת גם מציג התנהגות מוזרה שבה ליבה אחת (לא בהכרח מעבד 0) מקבל טעון מאוד> 80%, בעוד הליבות האחרות להישאר כמעט בטלה. זה מוביל אותי לחשוב שהבעיה קשורה לווירטואליזציה של הקרנל / הבסיסית.

כאשר בודקים את אותו תרחיש על מתכת חשופה, פלטפורמה לא וירטואלית אני מקבל תוצאות הבדיקה מראה TCP לקבל () שיעורי מעבר 35 000 / השני. זה על Core i5 4 ליבה מכונת ריצה אובונטו עם כל הליבות כמעט רווי לחלוטין. בעיני דמות כזאת נראית לי נכונה.

במקרה Xen שוב, ניסיתי לאפשר / לצבוט כמעט כל ההגדרות יש sysctl.conf. כולל הפעלת קבל היגוי מנות ו קבל זרימת זרימה והצמדת חוטים / תהליכים למעבדים, אך ללא רווחים ניכרים.

אני יודע ביצועים מושפעים הוא צפוי כאשר פועל וירטואליזציה. אבל עד כדי כך? איטי יותר, שרת מתכת חשוף ביצועים טובים. 8 ליבות על ידי גורם של 5?

  1. האם זה באמת צפוי התנהגות של זן?
  2. האם אתה יכול לשנות את Xen כדי לשפר את הביצועים עבור חיבורי TCP חדשים?
  3. האם יש פלטפורמות וירטואליזציה אחרות המתאימות יותר לשימוש מסוג זה?

לשחזר את ההתנהגות הזו

כאשר עוד לחקור את זה לאתר את הבעיה גיליתי כי netperf כלי בדיקות ביצועים יכול לדמות את התרחיש דומה אני חווה. באמצעות בדיקת TCP_CRR של Netperf אספתי דוחות שונים משרתי שרת שונים (וירטואליים ולא וירטואליים). אם תרצה לתרום עם כמה ממצאים או לחפש את הדוחות הנוכחיים שלי, ראה https://gist.github.com/985475

כיצד אוכל לדעת שהבעיה אינה קשורה לתוכנה שנכתבה בצורה גרועה?

  1. השרת נבדק על חומרה חשופה וזה כמעט רווי את כל הליבות הזמינים לה.
  2. בעת שימוש בחיבורי TCP חיים, הבעיה נעלמת.

למה זה חשוב?

ב ESN (המעסיק שלי) אני מוביל את הפרויקט Beaconpush, שרת Comet / Web Socket שנכתב ב- Java. למרות שזה מאוד ביצועים והוא יכול להרוות כמעט כל רוחב פס שניתן לו בתנאים אופטימליים, זה עדיין מוגבל כמה מהר חיבורי TCP חדשים יכולים להתבצע. כלומר, אם יש לך משתמש גדול churn שבו משתמשים באים וללכת לעתים קרובות מאוד, חיבורי TCP רבים יצטרכו להיות להגדיר / דמעה למטה. אנחנו משתדלים לצמצם את הקשר הזה לאורך זמן רב ככל האפשר. אבל בסופו של דבר, את קבלת () הביצועים היא מה שומר ליבות שלנו מסתובב ואנחנו לא אוהבים את זה.


עדכון 1

מישהו פרסם את השאלה הזו ל- Hacker News, יש כמה שאלות / תשובות שם גם. אבל אני אנסה לשמור על שאלה זו עדכני עם מידע אני מוצא כמו שאני הולך יחד.

חומרה / פלטפורמות שבדקתי את זה ב:

  • EC2 עם סוגי c1.xlarge למשל (8 ליבות, 7 GB RAM) ו cc1.4xlarge (2x אינטל Xeon X5570, 23 GB RAM). AMIs בשימוש היה ami-08f40561 ו ami-1cad5275 בהתאמה. מישהו גם ציין כי "קבוצות הביטחון" (כלומר חומת האש של EC2) עשוי להשפיע גם כן. אבל עבור תרחיש זה בדיקה, ניסיתי רק localhost לחסל גורמים חיצוניים כגון זה. שמועה נוספת שמעתי כי מקרים EC2 לא יכול לדחוף יותר מ 100k PPS.
  • שני שרת וירטואלי וירטואלי פועל Xen. אחד היה עומס אפס לפני הבדיקה, אבל לא עשה את ההבדל.
  • פרטי ייעודי, Xen שרת ב Rackspace. על אותן תוצאות שם.

אני נמצא בתהליך של הפעלה מחדש של בדיקות אלה ומילוי דוחות ב https://gist.github.com/985475 אם אתה רוצה לעזור, לתרום את המספרים. זה קל!

(תכנית הפעולה הועברה לתשובה נפרדת ומאוחדת)


87
2018-05-22 16:39




עבודה מצוינת להצביע על בעיה, אבל אני מאמין שתוגש הרבה יותר טוב על Xen ספציפי לרשימת התפוצה, תמיכה בפורום או אפילו את xensource דווח על באגים באתר. אני מאמין שזה יכול להיות קצת באג מתזמן - אם אתה לוקח את המספרים של 7,000 חיבורים * 4 ליבות / 0.80 עומס CPU אתה מקבל בדיוק 35,000 - מספר היית מקבל כאשר 4 ליבות יהיה רווי לחלוטין. - the-wabbit
אה, ועוד דבר אחד: לנסות גרסה אחרת (אולי יותר לאחרונה) הקרנל עבור האורח שלך, אם אתה יכול. - the-wabbit
@ syneticon-dj תודה. עשיתי את זה על cc1.4xlarge ב EC2 עם ליבה 2.6.38. ראיתי בערך 10% עלייה אם אני לא טועה. אבל זה סביר יותר בגלל החומרה beefier של סוג זה סוג. - cgbystrom
תודה על שמירה על זה מעודכן עם תגובות HN, זו שאלה גדולה. אני מציע להעביר את תכנית הפעולה לתשובה מאוחדת, אולי - שכן כל התשובות האפשריות לבעיה. - Jeff Atwood
@jeff להעביר את תוכנית הפעולה, לבדוק. - cgbystrom


תשובות:


עכשיו: ביצועי מנות קטנים מבאס תחת Xen

(עבר את השאלה עצמה לתשובה נפרדת במקום)

לדברי משתמש על HN (מפתח KVM?) זה בגלל הביצועים מנות קטנות Xen וגם KVM. זוהי בעיה מוכרת עם וירטואליזציה ולדבריו, ESX של VMWare מטפל בזה הרבה יותר טוב. הוא גם ציין כי KVM מביאים כמה תכונות חדשות שנועדו להקל על זה (פוסט מקורי).

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

Iain Kay מרשימת התפוצה של המשתמשים ב- xen, העלתה את הגרף הבא: netperf graph שים לב לסורגי TCP_CRR, השווה בין "2.6.18-239.9.1.el5" לעומת "2.6.39 (עם Xen 4.1.0)".

תוכנית פעולה שוטפת המבוססת על תשובות / תשובות כאן וממנו HNYou

  1. שלח בעיה זו לרשימת דיוור ספציפית של Xen וב bugzilla של xensource כפי שהוצע על ידי syneticon-dj א ההודעה פורסמה ברשימת המשתמשים xen, לחכות לתשובה.

  2. צור מקרה מבחן פתולוגי פשוט ברמת היישום ופרסם אותו.
    שרת בדיקה עם הוראות נוצרו ו שהתפרסם בגיתוב. עם זאת אתה אמור להיות מסוגל לראות יותר לשימוש בעולם האמיתי מקרה לעומת netperf.

  3. נסה מופע אורח של 32 סיביות של PV Xen, מכיוון ש- 64 סיביות עלולים לגרום ליותר תקורה ב- Xen. מישהו הזכיר זאת ב- HN. לא משנה.

  4. נסה להפעיל את net.ipv4.tcp_syncookies ב- sysctl.conf כפי שהוצע על ידי abofh ב- HN. זה כנראה אולי לשפר את הביצועים מאז לחיצת יד תתרחש הקרנל. לא היה לי מזל עם זה.

  5. להגדיל את הצבר מ 1024 למשהו הרבה יותר גבוה, הציע גם על ידי abofh על HN. זה יכול גם לעזור מאז אורח יכול לקבל () קשרים נוספים במהלך ביצוע זה פרוסה נתונה על ידי dom0 (המארח).

  6. בדוק פעמיים connt כי הוא מושבת על כל המכונות כפי שהוא יכול לחצות את שיעור קבלת (המוצע על ידי deubeulyou). כן, זה היה מושבת בכל המבחנים.

  7. בדוק "הצפת תור להאזין ודלי סינכאש גולשים ב netstat-s" (הציע mike_esspe ב HN).

  8. פיצול הטיפול פסיקה בין ליבות מרובות (RPS / RFS ניסיתי לאפשר קודם לכן אמורים לעשות את זה, אבל יכול להיות שווה לנסות שוב). מוצע על ידי adamt ב HN.

  9. כיבוי TCP פילוח offload ופיזור / לאסוף תאוצה כפי שהוצע על ידי מאט ביילי. (לא אפשרי על EC2 או דומה VPS מארח)


26
2018-05-22 23:41



+1 בהחלט לפרסם את תוצאות הביצועים כאשר גילית! - chrisaycock
מישהו דקר אותי בטוויטר בנוגע לשאלה הזאת. למרבה הצער, זה נראה כמו בעיות אלה נמשכות. אני לא שם הרבה מחקר מאז השנה שעברה. Xen MAY השתפרו במהלך הזמן הזה, אני לא יודע. היזם KVM גם הזכיר שהם מתייחסים לנושאים כמו זה. יכול להיות שווה להמשיך. כמו כן, המלצה נוספת שמעתי הוא לנסות OpenVZ במקום Xen / KVM כפי שהוא מוסיף פחות או לא שכבת / יירוט של syscalls. - cgbystrom


אנקדוטי, מצאתי כי כיבוי האצת חומרה NIC משפר באופן משמעותי את ביצועי הרשת על בקר Xen (נכון גם עבור LXC):

פיזור איסוף:

/usr/sbin/ethtool -K br0 sg off

פריסת TCP פריקה:

/usr/sbin/ethtool -K br0 tso off

איפה br0 הוא הגשר שלך או התקן רשת על המארח hypervisor. יהיה עליך להגדיר את זה כדי לכבות אותו בכל אתחול. YMMV.


20
2018-05-22 19:09



אני שניה אתזה. היה לי Windows Server 2003 פועל על Xen כי סבלו כמה נורא אובדן מנות בעיות תחת תפוקה גבוהה התנאים. הבעיה נעלמה כאשר אני נכה קטע TCP offload - rupello
תודה. עדכנו את "תכנית הפעולה" בשאלה המקורית עם ההצעות שלך. - cgbystrom
ראה גם עננים - Lari Hotari


אולי אתה יכול להבהיר קצת - האם אתה מפעיל את הבדיקות תחת Xen על השרת שלך, או רק על מופע EC2?

קבל הוא רק עוד syscall, וקשרים חדשים הם שונים רק כי מנות הראשונות יהיו כמה דגלים ספציפיים - hypervisor כגון Xen בהחלט לא רואה שום הבדל. חלקים אחרים של ההתקנה שלך עשויים: ב- EC2 למשל, לא אתפלא אם לקבוצות האבטחה יש משהו לעשות עם זה; connt גם הוא דיווח על חציון חיבורים חדשים לקבל את הדולר (PDF).

לבסוף, נראה שיש שילוב של CPU / Kernel שגורם לשימוש במעבד / hangups מוזר ב- EC2 (וכנראה גם Xen), כמו בלוגים על ידי Librato לאחרונה.


2
2018-05-22 19:56



עדכנו את השאלה והבהרתי איזה חומרה ניסיתי את זה. אבוף הציע גם להגדיל את הצבר מעבר ל 1024 כדי להאיץ את מספר אפשרי לקבל () s במהלך פרוסת ביצוע עבור האורח. לגבי connt, אני בהחלט צריך לבדוק פעמיים דברים כאלה מושבתים, תודה. קראתי את המאמר Liberato אבל בהתחשב בכמות של חומרה אחרת ניסיתי את זה על זה, זה לא צריך להיות המקרה. - cgbystrom


ודא שאתה מושבת iptables ווים אחרים בגישור קוד dom0. ברור שזה חל רק על רשת הגשר ההתקנה Xen.

echo 0 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 0 > /proc/sys/net/bridge.bridge-nf-call-arptables

זה תלוי בגודל השרת אבל על אלה קטנים יותר (מעבד 4 ליבות) להקדיש ליבה אחת CPU כדי Xen dom0 ואת להצמיד אותו. אפשרויות אתחול של Hypervisor:

dom0_max_vcpus=1 dom0_vcpus_pin dom0_mem=<at least 512M>

האם ניסית להעביר פיזית Ethernet PCI התקן ל- domU? צריך להיות שיפור ביצועים נחמד.


0
2018-02-11 11:35