כוונון מחסנית TCP/IP לאופטימיזציה של הרשת

הרשת מתערערת תחת עומס, והסיבה אינה באפליקציה? אנו מגדירים את מחסנית TCP/IP מקצה לקצה: מאתרים צווארי בקבוק, מסירים ירידות ביצועים והופכים את התנהגות הרשת לצפויה. הצוות שלכם מקבל קונפיגורציות, תרשימים ונהלים לניהול עצמאי.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

כוונון TCP/IP: היכן המחסנית מאבדת ביצועים

כאשר מספר החיבורים בו-זמנית גדל, והתגובה יורדת, האשם בדרך כלל אינו שרת האפליקציה, אלא פרמטרי מחסנית הרשת שנותרו בברירת המחדל. תור החיבורים הנכנסים עולה על גדותיו, וחלק מהבקשות נזרקות לפני שהאפליקציה רואה אותן: הלקוח מקבל סירוב או ממתין עד לפקיעת timeout החיבור. מבחוץ זה נראה כמו «השרת נפל», למרות שהעומס על המעבד רחוק מהמקסימום.

מאגרי הקבלה והשליחה, שהוגדרו לתנאי מעבדה, אינם מספיקים למסור נתונים בערוצים בעלי השהיה גדולה — תפוקת חיבור בודד נתקלת בתקרה. וה-timeouts של חיבורים, שחושבו לתגובות מהירות, קורעים סשנים ארוכים: ייצוא דוח, הזרמה או בקשה ארוכה נקטעים באמצע, והניסיון החוזר יוצר שוב עומס.

הערמומיות היא שבסביבת בדיקה ההדרדרות תחת עומס אינה מתגלה: אין שם אלפי לקוחות בו-זמנית, אין ערוצים איטיים ואין פרופיל תעבורה אמיתי. הבעיה ממתינה לשיא — מבצע מכירות, כניסת עובדים בבוקר, פרץ חיצוני.

כוונון TCP/IP מתחיל במדידה, ולא בעריכת פרמטרים: אנו אוספים סטטיסטיקה של תורים, שידורים חוזרים וחיבורים שנזרקו, מאתרים את צוואר הבקבוק של הרשת ורק אחר כך משנים את ערכי מחסנית הרשת — בהתאם לפרופיל תעבורה מסוים. לאחר כל שינוי — מדידה חוזרת, אחרת אי אפשר להבחין בין שיפור לבין מקריות.

מה משתנה לאחר אופטימיזציה של מחסנית הרשת

כוונון TCP/IP אינו «להאיץ את הרשת בכללותה», אלא להסיר מגבלות קונקרטיות שליבת Linux מחזיקה כברירת מחדל תחת עומס. האפקט נראה על שלושה צירים מדידים: כמה חיבורים בו-זמנית השירות מחזיק, עד כמה הוא מגיב באופן יציב בשיא, ואילו שגיאות נעלמות מהלוגים. להלן — מה בדיוק משתנה לאחר עריכת פרמטרי המחסנית.

תפוקה וזמן תגובה תחת שיא

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

לאחר תיאום גודל התור, מגבלת המתארים הפתוחים ומאגרי הקבלה-שליחה, זמן התגובה מפסיק לגדול בצורת מסור: האחוזון ה-95 של זמן התגובה נשמר ברמה של שעות שקטות ואינו מזנק פי כמה בפרץ קצר.

התפוקה גדלה לא בזכות «חומרה מהירה יותר», אלא בזכות השבתות שנעלמו בגלל פתיחה חוזרת של חיבורים. מספר החיבורים בו-זמנית הנשמרים גדל פי כמה — השירות משרת את אותו זרם בקשות במספר ניסיונות קטן יותר.

סוג התקלות שנעלם

ערך בפני עצמו — היעלמותה של משפחת שגיאות שלמה: קטיעות באמצע התגובה, מפולות של ניסיונות חוזרים, sockets שנתקעו במצב סגירה, ו-timeouts בשלב כינון הקשר. כולם נולדים במפגש בין timeouts אגרסיביים של הליבה לבין השהיות אמיתיות בין הלקוח לשירות.

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

אפשרויות לאופטימיזציה של המחסנית: מה ומתי מתאים

אופטימיזציה של מחסנית TCP/IP אינה אוניברסאלית: בפרופיל אחד מנצח כיוונון ידני, באחר — מנגנונים מובנים של המערכת. הבחירה תלויה במקום שבו הזמן הולך לאיבוד — במאגרים, בתור החיבורים או בלוגיקת האפליקציה.

אפשרות מתי מתאימה מגבלות
כיוונון ידני של פרמטרים תעבורה הומוגנית, ידועים מספר החיבורים וגודל התגובות הערכים מתיישנים עם גדילת העומס
כיוונון אוטומטי באמצעי המערכת עומס קטוע, שירותים רבים על הצומת אינו מרפא השהיות ברמת האפליקציה
העברת צוואר הבקבוק למאזן עומסים נפרד תור החיבורים והעיבוד נתקלים במגבלה מתווסף רכיב בסכימה ונקודת כשל
עיבוד אסינכרוני באפליקציה המתנה ל-I/O מחזיקה threads דורש שינויים בקוד ובבדיקות

כיוונון ידני של פרמטרים

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

כיוונון אוטומטי לפי עומס

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

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

כוונון TCP/IP שלב אחר שלב: שלבי העבודה

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

ביקורת ומדידות

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

  1. לאסוף מדידות בפרופיל העומס הנוכחי — מדדים על פני מחזור פעילות מלא של השירות, כולל שעות שיא, ולא ממוצע יממתי.
  2. לאתר את צוואר הבקבוק — להשוות תורים, שידורים חוזרים והשהיות ולקבוע מה בדיוק נתקל במגבלה: גדלי המאגרים, אלגוריתם ניהול עומס היתר או טבלת החיבורים.

תוכנית השינויים ובדיקה תחת עומס

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

  • לתאם את תוכנית השינויים — רשימת הפרמטרים, ערכי היעד, סדר החזרה אחורה, האחראים לכל שלב.
  • לבצע את השינוי על צומת אחד — צומת בדיקה או הפחות עמוס, כדי שהאפקט ייקרא בצורתו הטהורה.
  • לבדוק תחת עומס — לחזור על אותו פרופיל ולהשוות למדידות המקוריות; ההחלטה על פריסה רחבה מתקבלת לפי מספרים, ולא לפי תחושות.
  • לפרוס על שאר הצמתים — בקבוצות, עם הפסקות ובקרת מדדים בין הקבוצות.
  • למסור את התוצאה — קונפיגורציות במערכת הניהול, הסברים לכל פרמטר, ספי התראות מעודכנים.

לאחר המסירה השינויים מפסיקים להיות פעולה חד-פעמית: הפרמטרים מקובעים בקונפיגורציה, וחריגות נתפסות על ידי התראות לפני שהמשתמשים מבחינים בהן.

מה מועבר לידיים: קונפיגורציות, תוכניות, נהלים

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

מערך תיעוד ותרשימים

  • קונפיגורציות עבודה של הצמתים שהשתנו — כקבצים שמיושמים על מערכת נקייה, בלי שינויים «שהצטברו היסטורית».
  • מפת פרמטרים: מה שונה, מאיזה ערך לאיזה, לשם איזה אפקט ומה הסיכון בחזרה אחורה.
  • תרשים מעבר התעבורה: ממשקים, מסלולים, מקומות שבהם מוגדרים מגבלות, תורים וכללי עדיפות.
  • תרשים הרשת עם גבולות האחריות בין הצוות שלנו לשלכם.
  • מדידות לפני ואחרי: השהיה, שיעור איבודים, תפוקה תחת עומס שיא — על אותו תרחיש בדיוק.
  • הוראות לאיסוף מדדים, כדי שערכים חדשים יושוו לבסיס ולא לתחושות.

נוהל שינויים ותוכנית חזרה אחורה

אנו מתעדים אילו שינויים בטוחים על מערכת פעילה, ואילו דורשים חלון תחזוקה. זה מסיר את הסיכון העיקרי של כיוונון עדין של המחסנית, כאשר משנים פרמטרים «ליתר ביטחון» ומאבדים את העקביות.

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

ניתוח הטמעה: מדדים לפני ואחרי

שירות עם פרופיל של «הרבה בקשות קצרות» — קטלוג עם עדכון תדיר של מצב וסנכרון רקע בין אתרים. המדידות בוצעו לפני העבודה וחזרו על עצמן אחריה באותו פרופיל עומס דרך Grafana: אותם לוחות, אותה מתודולוגיה, בלי להעביר את המדידות לחלון שקט.

מה היה לפני

בחלונות שיא זמן התגובה חצה שנייה, בקשות עמדו בתור לקבלה, וחלק מהחיבורים נסגרו בגלל חריגה מזמן ההמתנה לפני שהגיעה התגובה. סשנים ארוכים — ייצוא והזרמה — נקטעו באמצע, הלקוחות חזרו על הבקשה, והחזרות הוסיפו עומס והעמיקו את הירידה. המהנדס התורן הפעיל מחדש שירותים ידנית כמה פעמים ביממה, וכל הפעלה מחדש יצרה פרץ תקלות של דקה-שתיים.

מה קרה אחרי

לאחר כיוונון מחדש של תורי הקבלה, גדלי המאגרים וזמן החזקת החיבורים, התור הפסיק לעלות על גדותיו בשיא: זמן התגובה הצטמצם כמעט פי שבעה. קטיעות של סשנים ארוכים נעלמו כסוג — שיעור החיבורים הקטועים ירד מ-3% ל-0.2%, בקשות חוזרות כמעט נעלמו.

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

מה לעשות אם המחסנית מכווננת אבל הרשת מאטה?

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

האבחון מתחיל בהפרדה של אזורי אחריות — שכבת האפליקציה, סכימת החליפין, הערוץ והציוד המתווך — ומאושר על ידי מדידות, ולא על ידי הנחות לגבי «איפה זה בדרך כלל קורה».

הקטע הראשון — האפליקציה. אם פעולה אחת דורשת עשרה פניות עוקבות, והחיבור נפתח מחדש לכל בקשה, אף פרמטר של הליבה לא יפצה על ההשהיות האלה. מדידת הזמן עד לבית הראשון ועד לתגובה מלאה מראה היכן יושבת ההשהיה: בכינון הקשר, בעיבוד בשירות או בנפח הנתונים המועברים.

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

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

ספקות טכניים ומגבלות הגישה

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

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

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

אם משנים ערך אחד בכל פעם ועוקבים אחר המונים — לא. חלק מהפרמטרים נכנסים לתוקף עבור חיבורים חדשים מיד, וחלק — לאחר הפעלה מחדש של השירות; במקרה השני מתכננים חלון ומזהירים מראש.

אין לנו חלון תחזוקה — מה אז?

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

מתי כיוונון לא יעזור באופן עקרוני?

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

נדון במשימה: ממה מתחילים את העבודה

כוונון TCP/IP נותן אפקט רק כשהוא נשען על פרופיל תעבורה אמיתי של הצומת, ולא על מערך ערכים טיפוסי מהתיעוד. לכן מתחילים בדיון במשימה: אוספים את המדדים הנוכחיים ומחפשים היכן בדיוק הזמן הולך לאיבוד — בכינון חיבורים, בהצפת תורי הקבלה, בשידורים חוזרים או בהמתנה למעבד פנוי.

כדי לחזור עם הערכת לוחות זמנים ותוכנית עבודה, ולא עם מילים כלליות, נדרשים נתוני פתיחה. בדרך כלל מדובר בשיחה אחת עם הצוות שלכם ובגישה לצמתים — משם והלאה אנחנו עובדים.

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

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