וויסות עומסים של שרתים


  • תכנות

    אולי חלק מנידון זה שייך לסעיף חומרה ולא לתכנות, אבל אני צריך את עזרת המתכנתים ולא כ"כ את הטכנאים...
    אני משתמש בשרת לינוקס על AWS והתקנתי עליו LAMP.
    אני מתכנת מערכות טלפוניות באמצעות API עם ימות המשיח.
    רוב המערכות שלי בדר"כ זה PHP וMYSQL שמותקן על השרת והגישה עליו היא
    ב localhost.
    ב"ה בדר"כ לא חוויתי תקלות ואני מסתפק בשרת t3.small של 2 מעבדים ו 2 ראם.
    בקמפיין של עטרת שלמה היה ב"ה עומס גדול, בפרט בערב, והתחלתי לחוש שהשרת שלי נושם עמוק מידי, לקח לו הרבה זמן תגובה.
    מה שעשיתי למעשה, זה שהתחלתי לחלק את השלוחות לשרת אחר שהיה לי מוכן (שלוחת אידיש עבדה יותר מהר מי ששם לב, כי זה העברתי מיד על שרת נפרד, והתנועה בו הייתה דלילה יותר) ולאחר מכן הרמתי עוד שלושה העתקים של השרת ויצרתי שלוחה רנדומאלית בימות המשיח שתפנה כל פעם לשלוחה אחרת, שכל שלוחה מחוברת לשרת אחר.
    ae1f9dec-ad20-4e37-b2f6-9fac55c117f8-image.png

    למעשה שלוחת שמיעת מצב הקמפיין לא היה מחובר לד"ב, אלא חיבור ברגע אמת לשרתי צ'רידי לשליפות מצב הקמפיין. (ע"י file_get_contents)
    בעת העומסים של הקמפיין הCPU היה בסך הכל בסביבות ה20 ,כאשר רובו הוא של httpd השרת אפאצ'י.
    בדר"כ עיקר הCPU הוא מה SQL.
    ובשרתים החדשים שהרמתי לקמפיין ג"כ הCPU נע בסביבות 10 רובו של httpd.
    יש לי כמה נקודות שברצוני להבין.
    א. נראה שהבעיה לא הייתה ביכולת המעבד כי כמו שכתבתי הCPU היה נמוך.
    א"כ מה כן הבעיה?
    ב. אם אני רוצה לאזן עומסין בין כמה שרתים, איך עושים את זה, והשאלה מורכבת בעיקר לגבי מערכות שכן צורכות SQL ואני צריך ד"ב אחיד, איך עושים בצורה שלא יאט את המהירות (האם יש מצב להגיע לאותו מהירות כמו בlocalhost כאדר הד"ב בשרת נפרד?)
    ואיך זה מבחינת העלאת הקבצים לשרתים? איך יוצרים קבוצת שרתים שכולם מתעדכנים בקבצים חדשים? ואיך יוצרים IP שמחולק בצורה אוטומטית לפי עומסים, בין השרתים?
    או אולי לבודד מראש כל מערכת לשרת/ים נפרד/ים, לפי העומס הצפוי להיות במערכת זו? א"כ מה לעשות לגבי המערכות הקבועות?
    או להישאר עם שלוחה רנדומאלית בימות, שהיא תווסת את העומסים.

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

    בנוסף ישנם דברים שהייתי יכול לעשות ע"י SQL, לדוגמה, המערכת הייתה שולחת את מספר הטלפון לבדיקה מול צ'רידי האם קיים מתרים על מספר זה, וא"כ היה משמיע לו תפריט לשמיעת מצב התרומות שנתרמו על ידך, אחרת זה היה משמיע, לחיפוש מתרים ע"י הקשת המספר שלו הקש שתיים, וכו'.
    כעת זה היה בנוי שהכל בוצע ישירות מול צ'רידי בכל שלב במערכת.
    והאמת שהעדפתי להמנע מSQL כי חשוב לי מאוד שזה לא יקרוס.
    השאלה היא האם כן היה עדיף לעשות אצלי בSQL טבלה של המתרימים, והמערכת הייתה בודקת אצלי האם קיים מתרים למספר הטלפון, ולהציע תפריט לפי זה.
    ואז הייתי עושה סקריפט שפעם בעשר דקות / חצי שעה זה היה שולף את נתוני המתרימים מצ'רידי ומעדכן אותם בטבלה.
    במקרה זה הייתי מעמיס יותר על הSQL ופחות על שליפת נתונים חיצוניים על ידי file_get_contents.
    והאמת שניתן אפילו לעשות זאת לגבי התרומות עצמם, טבלת מצב הקמפיין שמתעדכן כל דקה, והמערכת תשלוף את הנתונים רק מהטבלה ולא מצ'רידי בכל שיחה.

    אשמח לחוות הדעת של המומחים כאן, איך ומה ניתן לעשות לגבי הנ"ל.
    תודה



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

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

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

    לעומת זאת בnodejs למשל,
    א. כל הבקשות רצות על אותו קונטקסט משותף, אתה יכול לשמור את מספר המבקרים במשתנה, ללא שום SQL.
    ב. הכל טריד אחד, כל בקשה מתבקשת לחכות עד שהשרת משועמם (!) ואז הוא עונה לה.
    זה גורם לכך ששרת בעל כח X יכול לשרת פי מאה בנוד מאשר בPHP. כמובן שזה תלוי עד כמה ארכיטקט התכונה התחשב באופי השפה, אבל בתצורה שלך אז ייתכן שמדובר בפי אלף.

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

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

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


  • תכנות

    @dovid
    תן לי להבין את ההבדל בין PHP לנוד כאשר יש לך לדוגמא 20 בקשות באותה שניה ממש.



  • @חוקר אמר בוויסות עומסים של שרתים:

    @dovid
    תן לי להבין את ההבדל בין PHP לנוד כאשר יש לך לדוגמא 20 בקשות באותה שניה ממש.

    בנוד טיפול בבקשות זה כמו לולאת while. הוא גם יכול אלף באותה שניה.
    בPHP זה דומה לפתיחת חמש מסמכי WORD במקביל.
    אבל עזוב פילוסופיה ורוץ לget started.



  • @dovid כל מילה פנינה כרגיל 🙂
    אולי שווה ל @חוקר להשתמש בבלאנס מוכן במקום השלוחות הרנדומליות.
    נראה לי שcloudflare מספק את זה גם בשירות החינמי.
    (בכל מקרה זה יפתור לו את הבעייה רק של השליחה אליך מהמרכזייה של ימות. ובלי קשר לsql)

    לגבי המרכזייה, אני חושב שעדיף לך לעבוד מול אסטריסק מלא. (פשוט תעשה בימות המשיח הפנייה לשלוחת IP ותפנה לשרת שלך)
    שם, גם אם תתעקש לעבוד מול PHP, אתה מכוסה לגמרי. כי כל השיחה זה בקשה אחת ארוכה ולא כמה בקשות API כמו בימות המשיח.

    תנסה לחשוב על שיחה בקו, שמתנהלת כמו קוד שרץ.
    אתה מבקש מהלקוח שחייג לכתוב מספר ואח"כ סולמית, מקבל את זה למשתנה, הולך עם המשתנה ובודק בDB משהו, רץ בלופ ומשמיע קבצים, באמצע השמעת הקבצים מזהה שצריך להשמעה הנוכחית לשאול משהו את הלקוח, שואל, התשובה נכנסת למשתנה, וכו' וכו'
    וכל זה בקובץ אחד שרץ.
    אני חושב שזה עולם אחר לגמרי ממה שאתה מכיר כיום בAPI. (אא"כ כבר כיום אתה עובד כך)

    וכמובן שגם באסטריסק אתה יכול לעבוד מול nodejs, אבל לא חייב.



  • לדעתי הטעות שלך שהשתמשת בזה file_get_contents יותר מידי הרבה.



  • @magicode לפי איך שהמערכת שלו כתובה, אין לו הרבה אופציות.
    אא"כ הוא נותן נתון נכון לדקה האחרונה. ולא להשנייה האחרונה.
    או אם צ'רידי היו שולחים אליו בAPI אחרי כל תרומה שהייתה תרומה עם כל המשתנים. כולל הסכום טוטל עד עכשיו.



  • יש עוד דבר.
    וזה מגבלות מובנות בלינוקס שאפשר להגדיל אם רוצים.
    מה שיכול להפריע פה. זה מגבלת חיבורים פתוחים. ומגבלת כמות תהליכים.
    תריץ את זה
    ulimit -a
    תראה את כל המגבלות.


  • תכנות

    @magicode אמר בוויסות עומסים של שרתים:

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

    core file size (blocks, -c) 0
    data seg size (kbytes, -d) unlimited
    scheduling priority (-e) 0
    file size (blocks, -f) unlimited
    pending signals (-i) 7787
    max locked memory (kbytes, -l) 64
    max memory size (kbytes, -m) unlimited
    open files (-n) 1024
    pipe size (512 bytes, -p) 8
    POSIX message queues (bytes, -q) 819200
    real-time priority (-r) 0
    stack size (kbytes, -s) 8192
    cpu time (seconds, -t) unlimited
    max user processes (-u) 7787
    virtual memory (kbytes, -v) unlimited
    file locks (-x) unlimited

    אומר משהו?


  • תכנות

    @dovid @clickone
    אסכם את השאלות:
    איך שאני עובד היום, שאני עדיין עובד עם ימות המשיח (אין כ"כ זמן לחשוב על אסטריסק לבד), ועדיים עם PHP.

    1. מה ההבדל בבזבוב משאבים בין file_get_contents ל MYSQL. (ועדכון הנתונים מתוך צ'רידי כל דקה ע"י סקריפט נפרד)
    2. ההבדל בין MYSQL לקריאה מקובץ טקסט בשרת (file_get_contents או אחר). (ועדכון הנתונים מתוך צ'רידי כל דקה ע"י סקריפט נפרד)
    3. במידה ואני כן רוצה בלאנס, איך זה עובד, כמובן שאני מעדיף בלאנס אצלי מאשר הפעלת שלוחה רנדומאלית בימות, אבל זה עשיתי תוך כדי קמפיין דבר ראשון שהמערכת תעבוד.


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


  • תכנות

    @dovid אמר בוויסות עומסים של שרתים:

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

    אבל אם אני בונה בצורה נכונה עם ההרשאות וכו', ואני שם בקובץ רק את הנתון הנדרש ללא מיונים וכו' שצריך אח"כ בתוך הקובץ, זה לא יותר קליל לשרת מאשר הרצת תוכנת הSQL שצרך לגשת לטבלה מסויימת, לפי סינון או בלי?



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

    <?php
    $homepage = file_get_contents('http://www.example.com/');
    

  • תכנות

    @magicode
    בזה של צ'רידי, אכן. כל פעם קריאה ישירות מהAPI של צ'רידי

    השאלה היא אם לשנות כיון, ולשמור בשרת שלי, א"כ האם הSQL או ע"ג קובץ



  • @חוקר
    ראיתי כאן דיון בנושא לא כל כך התעמקתי אבל בפשטות קובץ שעל השרת שלך הוא כמובן יותר מהיר
    אבל עם פחות אפשרויות
    דרך אגב מתי אתה מתחיל לחשוב על שינוי/שדרוג
    כשהCPU מגיע למקסימום או הרבה לפני זה?
    וגם איפה אני יכול לראות כמה מהזיכרון של הPHP בשימוש (לא המגבלה)?
    עריכה: אולי הסקריפט הזה יעזור לך לדעת מה יותר מהיר



  • @nigun אמר בוויסות עומסים של שרתים:

    @חוקר
    ראיתי כאן דיון בנושא לא כל כך התעמקתי אבל בפשטות קובץ שעל השרת שלך הוא כמובן יותר מהיר

    וmysql לא על השרת שלך? במקרה שלו נראה לי ששניהם באותו שרת.



  • @dovid
    אם הוא כבר בונה סקריפט שכל דקה מעדכן
    שיצור קובץ טקסט פשוט זה אמור להיות פשוט מחיבור למסד + בדיקת שם משתמש +בחירת טבלה
    עיין עוד כאן
    לפי מה שאני הבנתי שהם אומרים שם זה יותר מהיר אפילו כשהמסד על אותו שרת אבל רק בקבצים בודדים ולא כשמדובר למשל על שם משתמש וסיסמה של 1000 משתמשים



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



  • @nigun מסד יותר טוב בראיה כוללת, והביצועים אמורים להיות גם טובים לא פחות אם כי זה תלוי בכמה פרמטרים (למשל שPHP יוצר קונקשיין חדש לכל חיבור זה מיותר טפשי וחבל... אבל יש לזה פתרון גם בPHP).



  • @dovid
    מה הפתרון?
    חוץ מלעבור לnodejs כמובן☺



  • @nigun למה חוץ? יש את asp mvc core שיותר דומה לphp והמעבר פחות דרמטי.



  • @dovid
    אני מעדיף להישאר עם לינוקס
    כי לפי מה שהבנתי כל הנ"ל עובדים מיקרוסופט
    בכל מקרה כשאני ישתפר קצת יותר בPHP
    כנראה אנסה ללמוד nodejs
    בעיקר בזכות ההמלצות של magicode


  • חשמל ואלקטרוניקה תכנות

    @nigun אמר בוויסות עומסים של שרתים:

    כי לפי מה שהבנתי כל הנ"ל עובדים מיקרוסופט

    ?


  • תכנות

    @nigun @dovid
    הCPU היה רק 20 אחוז, ואם כל זה זמן התגובה היה מאוד לאט, עקב עומס בקשות בו זמנית.
    ייתכן מאוד שזה בסך הכל היה בגלל מגבלות השרת כמו ש @magicode כתב (ראית את הפלט שהדבקתי לעיל?)
    הmysql הוא על אותו שרת.
    אך בשלב הקודם לא השתמשתי ב SQL כלל בשלוחה זו, אלא בשליפת הנתונים מצרידי אונליין, וכעת אני חושב לשנות את זה ולשלוף את הנתונים מהשרת שלי, מתוך SQL או טקסט, ולעדכן את הנתונים במקביל ע"י סקריפט אחד, במקום שלכל משתמש תיהיה בדיקה אונליין מול צ'רידי
    ואכן ייתכן שלא כ"כ קצת נתונים עדיף קובץ פשוט מאשר SQL



  • @nigun מה שהזכרתי עובד מעולה בלינוקס.



  • @dovid
    פשוט זה מה שכתוב פה לגבי asp



  • @nigun מדובר על asp.net ולא על asp.net core.
    זה מ2013, לא היה קיים אז.
    אני מפתח עם זה ואין לי שרת שאיננו לינוקס.


 

בא תתחבר לדף היומי!