מהו vm.min_free_kbytes וכיצד ניתן לכוון אותו?

What Is Vm Min_free_kbytes



מהו vm.min_free_kbytes sysctl tunable עבור ליבת לינוקס ולאיזה ערך יש להגדיר אותו? נלמד פרמטר זה וכיצד הוא משפיע על מערכת לינוקס הפועלת במאמר זה. נבדוק את השפעתו על מטמון דף מערכת ההפעלה ועל mallocs ומה הפקודה החינמית של המערכת מראה כאשר פרמטר זה מוגדר. נבצע כמה ניחושים מושכלים לגבי ערכים אידיאליים עבור מכוון זה ונראה כיצד להגדיר vm.min_free_kbytes לצמיתות כדי לשרוד אתחול מחדש. אז בוא נלך.

כיצד עובד vm.min_free_kbytes

המערכת עשויה להזדקק להקצות זיכרון על -מנת להבטיח את תפקודה התקין של המערכת עצמה. אם הגרעין יאפשר הקצאת כל הזיכרון הוא עלול להיאבק בעת הצורך בזיכרון לצורך פעולות רגילות כדי שהמערכת הפעלה תהיה חלקה. זו הסיבה שהגרעין מספק את vm.min_free_kbytes המתכוונן. הכוונון יאלץ את מנהל הזיכרון של הגרעין לשמור לפחות X כמות זיכרון פנוי. להלן ההגדרה הרשמית מתוך תיעוד לינוקס ליבה : זה משמש כדי לאלץ את ה- VM של Linux לשמור על מספר קילובייט מינימלי בחינם. ה- VM משתמש במספר זה כדי לחשב ערך [WMARK_MIN] סימן מים עבור כל אזור דל במערכת המערכת. כל אזור lowmem מקבל מספר דפים בחינם שמורים המבוססים באופן יחסי על גודלו. יש צורך בכמות מינימלית של זיכרון בכדי לספק הקצאות PF_MEMALLOC; אם אתה מגדיר את זה לנמוך מ- 1024KB, המערכת שלך תישבר בעדינות ותהיה מועדת למבוי סתום בעומסים גבוהים. הגדרה גבוהה מדי תגרום למכונה שלך OOM באופן מיידי.







אימות עובד vm.min_free_kbytes

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



#חינם -M



מסתכלים על כלי הזיכרון הפנוי למעלה באמצעות הדגל -m כדי להדפיס את הערכים ב- MB. הזיכרון הכולל הוא 3.5 עד 3.75 GB של זיכרון. נעשה שימוש בזיכרון של 121 מגה -בייט, 3.3 גיגה -בייט של זיכרון פנוי, 251 מגה -בתים משמש על ידי מטמון החיץ. ו -3.3 GB זיכרון זמין.





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

# echo 1500000>/proc/sys/vm/min_free_kbytes
# sysctl vm.min_free_kbytes



אתה יכול לראות שהפרמטר שונה ל -1.5 GB בערך והוא נכנס לתוקף. עכשיו בואו נשתמש ב- חינם פקודה שוב כדי לראות שינויים המוכרים על ידי המערכת.

#חינם -M

הזיכרון הפנוי ומטמון החיץ אינם משתנים על ידי הפקודה, אך כמות הזיכרון מוצגת כ זמין הופחת מ- 3327 ל- 1222 MB. המהווה הפחתה משוערת של השינוי בפרמטר לזיכרון פנוי של 1.5 GB דקה.

עכשיו בואו ניצור קובץ נתונים של 2GB ואז נראה מה הקריאה של הקובץ הזה במטמון החיץ עושה לערכים. להלן אופן יצירת קובץ נתונים של 2GB בשתי שורות של סקריפט bash להלן. הסקריפט ייצר קובץ אקראי של 35MB באמצעות הפקודה dd ולאחר מכן יעתיק אותו 70 פעמים לקובץ חדש קובץ מידע תְפוּקָה:

# dd if =/dev/random of =/root/d1.txt count = 1000000
# עבור i ב- seq 1 70 '; לעשות הד $ i; cat /root/d1.txt >> /root /data_file; בוצע

בואו לקרוא את הקובץ ולהתעלם מהתוכן על ידי קריאה והפניה מחדש של הקובץ ל- /dev /null בהתאם להלן:

#חתולקובץ מידע> /dev/ריק

אוקיי, מה קרה לזיכרון המערכת שלנו עם מערכת התמרונים הזו, בואו נבדוק זאת כעת:

#חינם -M

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

# time data_file cat> /dev /null
# time data_file cat> /dev /null

הקריאה של הקובץ ארכה כמעט 20 שניות, מה שמרמז שכמעט בוודאי שלא כל המטמון שלה.

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

# echo 67584>/proc/sys/vm/min_free_kbytes
# time data_file cat> /dev /null
# time data_file cat> /dev /null

עם הזיכרון הנוסף הזמין לאחסון המטמון זמן קריאת הקובץ ירד מ -20 שניות לפני כן ל- .364 שניות כשהכל במטמון.

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

#זרק 1500000 > /אָחוּז/sys/vm/min_free_kbytes

בואו נסתכל שוב על הזיכרון הפנוי שלנו:

תיאורטית יש לנו 1.9 GB חינם ו- 515 MB זמינים. הבה נשתמש בתוכנית בדיקת מאמץ הנקראת stress-ng על מנת להשתמש בזיכרון כלשהו ולראות היכן אנו נכשלים. נשתמש בבוחן ה- vm וננסה להקצות זיכרון של 1 GB. מכיוון ששמרנו רק 1.5 GB במערכת 3.75 GB, אני מניח שזה אמור לעבוד.

# stress-ng --vm 1 --vm-bytes 1G-פסק זמן 60s
מתח: מידע:[17537]שולחים חזירים:1vm
מתח: מידע:[17537]הקצאת מטמון: גודל ברירת המחדל של מטמון: 46080K
מתח: מידע:[17537]ריצה מוצלחת הושלמהב60.09 שניות(1דקות,0.09יָבֵשׁ)
# stress-ng --vm 2 --vm-bytes 1G-פסק זמן 60s
# stress-ng --vm 3 --vm-bytes 1G-פסק זמן 60s

ננסה את זה שוב עם יותר עובדים, נוכל לנסות 1, 2, 3, 4 עובדים ובשלב מסוים זה אמור להיכשל. במבחן שלי הוא עבר עם 1 ו -2 עובדים אך נכשל עם 3 עובדים.

בואו לאפס את vm.min_free_kbytes למספר נמוך ולראות אם זה עוזר לנו להריץ 3 גורמי לחץ זיכרון עם 1GB כל אחד במערכת 3.75GB.

# echo 67584>/proc/sys/vm/min_free_kbytes
# stress-ng --vm 3 --vm-bytes 1G-פסק זמן 60s

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

הגדרת ברירת מחדל עבור vm.min_free_kbytes

ערך ברירת המחדל עבור ההגדרה במערכת שלי הוא 67584 המהווה כ -1.8% מה- RAM במערכת או 64 MB. מטעמי בטיחות במערכת שנדחקה מאוד, אני נוטה להגדיל אותה מעט ל -128 MB כדי לאפשר זיכרון פנוי שמור יותר, אולם עבור שימוש ממוצע ערך ברירת המחדל נראה מספיק הגיוני. התיעוד הרשמי מזהיר מפני הפיכת הערך גבוה מדי. הגדרת אותו ל -5 או 10% מ- RAM המערכת כנראה אינה השימוש המיועד בהגדרה, והיא גבוהה מדי.

הגדרת vm.min_free_kbytes כדי לשרוד אתחול מחדש

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

סיכום

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