וויסות עומסים של שרתים
-
אולי חלק מנידון זה שייך לסעיף חומרה ולא לתכנות, אבל אני צריך את עזרת המתכנתים ולא כ"כ את הטכנאים...
אני משתמש בשרת לינוקס על AWS והתקנתי עליו LAMP.
אני מתכנת מערכות טלפוניות באמצעות API עם ימות המשיח.
רוב המערכות שלי בדר"כ זה PHP וMYSQL שמותקן על השרת והגישה עליו היא
ב localhost.
ב"ה בדר"כ לא חוויתי תקלות ואני מסתפק בשרת t3.small של 2 מעבדים ו 2 ראם.
בקמפיין של עטרת שלמה היה ב"ה עומס גדול, בפרט בערב, והתחלתי לחוש שהשרת שלי נושם עמוק מידי, לקח לו הרבה זמן תגובה.
מה שעשיתי למעשה, זה שהתחלתי לחלק את השלוחות לשרת אחר שהיה לי מוכן (שלוחת אידיש עבדה יותר מהר מי ששם לב, כי זה העברתי מיד על שרת נפרד, והתנועה בו הייתה דלילה יותר) ולאחר מכן הרמתי עוד שלושה העתקים של השרת ויצרתי שלוחה רנדומאלית בימות המשיח שתפנה כל פעם לשלוחה אחרת, שכל שלוחה מחוברת לשרת אחר.
למעשה שלוחת שמיעת מצב הקמפיין לא היה מחובר לד"ב, אלא חיבור ברגע אמת לשרתי צ'רידי לשליפות מצב הקמפיין. (ע"י 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 בקשות באותה שניה ממש.בנוד טיפול בבקשות זה כמו לולאת while. הוא גם יכול אלף באותה שניה.
בPHP זה דומה לפתיחת חמש מסמכי WORD במקביל.
אבל עזוב פילוסופיה ורוץ לget started. -
@dovid כל מילה פנינה כרגיל
אולי שווה ל @חוקר להשתמש בבלאנס מוכן במקום השלוחות הרנדומליות.
נראה לי שcloudflare מספק את זה גם בשירות החינמי.
(בכל מקרה זה יפתור לו את הבעייה רק של השליחה אליך מהמרכזייה של ימות. ובלי קשר לsql)לגבי המרכזייה, אני חושב שעדיף לך לעבוד מול אסטריסק מלא. (פשוט תעשה בימות המשיח הפנייה לשלוחת IP ותפנה לשרת שלך)
שם, גם אם תתעקש לעבוד מול PHP, אתה מכוסה לגמרי. כי כל השיחה זה בקשה אחת ארוכה ולא כמה בקשות API כמו בימות המשיח.תנסה לחשוב על שיחה בקו, שמתנהלת כמו קוד שרץ.
אתה מבקש מהלקוח שחייג לכתוב מספר ואח"כ סולמית, מקבל את זה למשתנה, הולך עם המשתנה ובודק בDB משהו, רץ בלופ ומשמיע קבצים, באמצע השמעת הקבצים מזהה שצריך להשמעה הנוכחית לשאול משהו את הלקוח, שואל, התשובה נכנסת למשתנה, וכו' וכו'
וכל זה בקובץ אחד שרץ.
אני חושב שזה עולם אחר לגמרי ממה שאתה מכיר כיום בAPI. (אא"כ כבר כיום אתה עובד כך)וכמובן שגם באסטריסק אתה יכול לעבוד מול nodejs, אבל לא חייב.
-
@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.- מה ההבדל בבזבוב משאבים בין file_get_contents ל MYSQL. (ועדכון הנתונים מתוך צ'רידי כל דקה ע"י סקריפט נפרד)
- ההבדל בין MYSQL לקריאה מקובץ טקסט בשרת (file_get_contents או אחר). (ועדכון הנתונים מתוך צ'רידי כל דקה ע"י סקריפט נפרד)
- במידה ואני כן רוצה בלאנס, איך זה עובד, כמובן שאני מעדיף בלאנס אצלי מאשר הפעלת שלוחה רנדומאלית בימות, אבל זה עשיתי תוך כדי קמפיין דבר ראשון שהמערכת תעבוד.
-
@dovid אמר בוויסות עומסים של שרתים:
קריאת קובץ זה פעולה מול המערכת קבצים באופן ישיר עם בעיות של נעילות ועם חוסר יעילות של קריאה סדרתית.
בגישה למסד התוכנה של mysql ממטבת את הגישה לדיסק בהרבה פרמטרים.אבל אם אני בונה בצורה נכונה עם ההרשאות וכו', ואני שם בקובץ רק את הנתון הנדרש ללא מיונים וכו' שצריך אח"כ בתוך הקובץ, זה לא יותר קליל לשרת מאשר הרצת תוכנת הSQL שצרך לגשת לטבלה מסויימת, לפי סינון או בלי?
-
@חוקר
ראיתי כאן דיון בנושא לא כל כך התעמקתי אבל בפשטות קובץ שעל השרת שלך הוא כמובן יותר מהיר
אבל עם פחות אפשרויות
דרך אגב מתי אתה מתחיל לחשוב על שינוי/שדרוג
כשהCPU מגיע למקסימום או הרבה לפני זה?
וגם איפה אני יכול לראות כמה מהזיכרון של הPHP בשימוש (לא המגבלה)?
עריכה: אולי הסקריפט הזה יעזור לך לדעת מה יותר מהיר -