none
התייעצות לגבי הגבלה של זיכרון עבור SQL

    שאלה

  • שלום לכולם,

    רציתי לדעת מספר דברים בנוגע לזיכרון עבור שרת SQL

    1.האם נכון להגביל את הזיכרון עבור הSQL ? - במידה ויש לי שרת עם 30 גיגה זיכרון , האם נכון לתת לSQL  הגבלה של X% מהזיכרון הכללי?

    2.במידה וכן נכון להגביל אשמח לדעת כיצד מחשבים כמה זיכרון צריך לתת ? בהנחה שבית התוכנה לא אומר לך כמה זיכרון צריך במינימום .

    3.במידה ולא מגבילים את הזיכרון מה שיהיה זה שהוא יזלול את כל המשאבים של הזיכרון וישאיר (בתור "טובה") מעט מאוד לשאר המערכת , האם ברגע שסרביס אחר \ תוכנה אחרת יצטרכו את הזיכרון הנוסף האם הSQL ידע לפנות מהזיכרון שהוא לא בשימוש אצלו עבור הדברים האחרים או שהמערכת תשתמש בזיכרון חלופי (שימוש בדיסק) 

    תודה לכולם

    יום רביעי 26 יולי 2017 06:28

כל התגובות

  • שלום לכולם,

    רציתי לדעת מספר דברים בנוגע לזיכרון עבור שרת SQL

    1.האם נכון להגביל את הזיכרון עבור הSQL ? - במידה ויש לי שרת עם 30 גיגה זיכרון , האם נכון לתת לSQL  הגבלה של X% מהזיכרון הכללי?

    2.במידה וכן נכון להגביל אשמח לדעת כיצד מחשבים כמה זיכרון צריך לתת ? בהנחה שבית התוכנה לא אומר לך כמה זיכרון צריך במינימום .

    3.במידה ולא מגבילים את הזיכרון מה שיהיה זה שהוא יזלול את כל המשאבים של הזיכרון וישאיר (בתור "טובה") מעט מאוד לשאר המערכת , האם ברגע שסרביס אחר \ תוכנה אחרת יצטרכו את הזיכרון הנוסף האם הSQL ידע לפנות מהזיכרון שהוא לא בשימוש אצלו עבור הדברים האחרים או שהמערכת תשתמש בזיכרון חלופי (שימוש בדיסק) 

    תודה לכולם

    אהלן הראל,

    זו שאלה טובה אבל מעט מורכבת להודעה אחת בפורום

    אני ממליץ לך לחפש חומר נוסף למה שאני אכתוב בקצרה מאוד על ידי חיפוש צירוף המילים הבא בגוגל:
    sql server memory best practice

    אתה תמצא תוצאות רבות שכדאי מאוד לקרוא :-)

    כמו כן אתה צריך לשלוט בצורה ששרתי SQL עובדים עם הזכרון תוך דגש על נושא ה buffer pool שהוא חלק ניכר מהזכרון שהשרת משתמש.

    * תיאורטית אם כמות המידע שלך קטנה יותר מכמות הזכרון אז אין לך בעיה, מכיוון שהשרת יכול להעלות את כל המידע לזכרון ה buffer pool. לכן כל הדיון לא רלוונטי במערכות קטנות (זה כמו לשאול אם אנחנו צריכים להגביל את ההוצאה הכספית שלנו כאשר בכל מקרה בכל חודש נשאר לנו עודף של 99.99% מהכסף שאנחנו לא מצליחים לבזבז). במערכות קטנות מאוד פשוט משאירים הכל בברירת המחדל בשלב הראשון (תמיד יש שלב הבא בו אנחנו ממטבים לפי ההתנהגות בפועל).

    >> 1.האם נכון להגביל את הזיכרון עבור הSQL ? - במידה ויש לי שרת עם 30 גיגה זיכרון , האם נכון לתת לSQL  הגבלה של X% מהזיכרון הכללי?

    תמיד התשובה הנכונה היא "תלוי". ישנם הרבה גורמים שמשפיעים על התשובה החל במערכת ההפעלה שעובדים איתה (שרתי SQL אפשר להתקין על מערכות הפעלה שונות ולאחרונה אפילו נוספה האפשרות להתקין על לינוקס למשל), השירותים שהמכונה אמורה לתת (האם זו מכונה ייעודית לשרת SQL או שהיא מבצעת דברים נוספים), ואפילו אופן העבודה עם השרת עצמו (ישנם פעולות שצורכות זכרון שאינו נכלל בזכרון ה buffer pool, ישנם אלמנטים שכל העבודה שלהם מבוססת על שימוש בזכרון כמו למשל טבלאות In-memory), ועוד...

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

    >> 2.במידה וכן נכון להגביל אשמח לדעת כיצד מחשבים כמה זיכרון צריך לתת ? בהנחה שבית התוכנה לא אומר לך כמה זיכרון צריך במינימום .

    כל מה שכתבתי על "תלוי" נכנס כמובן גם בתשובה זו.

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

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

    כלל האצבע שאני יכול לזרוק כאן וזה רק זריקה באוויר הוא להשאיר למערכת ההפעלה כ 4 גיגה ואתהשאר לתת לשרת ה SQL. במכונות מאוד קטנות נשאיר פחות למערכת ההפעלה ויותר לשרת בדרך כלל (מבחינת אחוזים).

    >> 3.במידה ולא מגבילים את הזיכרון מה שיהיה זה שהוא יזלול את כל המשאבים של הזיכרון וישאיר (בתור "טובה") מעט מאוד לשאר המערכת , האם ברגע שסרביס אחר \ תוכנה אחרת יצטרכו את הזיכרון הנוסף האם הSQL ידע לפנות מהזיכרון שהוא לא בשימוש אצלו עבור הדברים האחרים או שהמערכת תשתמש בזיכרון חלופי (שימוש בדיסק) 

    בעקרון כן (זה לא עניין של "לפנות" אלא עניין של מי תופס מה והשרת כל השמן מפנה זכרון ומנסה לתפוס זכרון חדש בהתאם לצרכים שלו), אבל מעשית תהיה מלחמה על המשאבים והמיטוב של השרת ירד פלאים (למשל יהיה שימוש יותר בקובץ ה system file cache וכל מני דברים לא נעימים) בשביל זה התשובה לשאלה הראשונה היתה "כן" ועלייך לנהל את הזכרון בהתאם לצרכים הכלליים

     

    כמה נקודות נוספות חשובות זלכור:

    * מחסור בזכרון עלול להוביל לפעולות IO שהן הרבה יותר "יקרות" מבחינת זמן עבודה.

    * בגרסת 2014 נכנס תכונה חדשה לשרת בשם Buffer Pool Extensions, אשר יכול לעזור בצורה נכרת בעלויות נמוכות בהרבה מהרחבת הזכרון RAM במוכנה. כדאי לקרוא על נושא זה.

    * מגרסת 2012 היו שינויים מרחיקי לכת בנושא וניהול הזכרון הרבה יותר מסודר כאשר אלמנטים שבעבר לא נלקחו בחשבון כזכרון של SQL נכנסו למגבלת המקסימום.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]    [Linkedin]


    • הוצע כתשובה על-ידי Yuval SinayMVP יום שישי 28 יולי 2017 19:03
    • נערך על-ידי pituachMVP, Editor יום שישי 28 יולי 2017 22:13
    יום חמישי 27 יולי 2017 02:21
    מנחה דיון