עיין בסקר השימושיות שלנו כדי לשפר את האתר הזה.
דף זה תורגם על ידי Cloud Translation API.
Switch to English

אופטימיזציה של SquashFS ברמת הליבה (עד אנדרואיד 9)

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

  • מכשירים עם אחסון בנפח נמוך כמו Android Watch.
  • התקנים עם אחסון פלאש איטי (דחיסה מפחיתה את מספר קלט / פסי החסימה).

לרוע המזל הביצועים של SquashFS נשארים מאחור אחרי ext4.

אופטימיזציות

האופטימיזציות הבאות יושמו כדי לשפר את הביצועים של SquashFS.

צמצם את השימוש בזיכרון והזיכרון

בעת קריאת בלוק (ברירת מחדל 128K), SquashFS מנסה לתפוס את כל הדפים המכסים את החסימה הזו.

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

גישה זו אינה יעילה מאוד; לאחר זמן מה, מטמון העמודים עשוי להכיל דפים עדכניים גם אם הדפים הסמוכים אינם.

הקוד מסוגל כעת להתמודד עם בלוקים עם חורים (= דפים חסרים). זה משפר את הביצועים בדרכים הבאות:

  • מפחית את מספר שיחות ה- memcpy
  • מקטין את הקצאת הזיכרון

קריאות אסינכרוניות

SquashFS עדיין משתמש ll_rw_block() שהוצא משימוש. יש שתי בעיות בגישה זו:

  • כפי שהשם מרמז, הפונקציה מחכה להשלמת הקריאות לפני החזרה. זה מיותר מכיוון .readpage() כבר ממתין על נעילת הדף. יתר על כן, אנו זקוקים למנגנון אסינכרוני ליישום יעיל של .readpages() .
  • מיזוג בקשות הקריאה תלוי לחלוטין בתזמון הקלט / פלט. ll_rw_block() פשוט יוצר בקשה אחת לכל מאגר. ל- SquashFS יש יותר מידע מאשר מתזמן הקלטות / פלטים על מה צריך להיות מוזג. יתר על כן, מיזוג הבקשה פירושו שאנחנו מסתמכים פחות על מתזמן הקלט / פלט.

מסיבות אלה, ll_rw_block() הוחלפה ב- submit_bio() .

דפי קריאה (איסוף מראש)

SquashFS אינו מיישם .readpages() , כך .readpage() קוראת שוב ושוב ל- .readpage() .

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

אופטימיזציה של קריאת בלוקים לא דחוסים

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

SquashFS מטפל בלוקים דחוסים ולא דחוסים תוך שימוש באותו הגיון: כאשר הוא מתבקש לקרוא דף בודד, הוא למעשה קורא בלוק מלא (128k ברירת מחדל). אמנם זה הכרחי לבלוקים דחוסים, אך זה רק בזבוז משאבים לבלוקים לא דחוסים.

במקום לקרוא בלוק מלא, SquashFS קורא כעת רק את מה שמומלץ על ידי אלגוריתם readahead.

זה משפר מאוד את הביצועים של קריאות אקראיות.

קוד

מיטבי קוד SquashFS זמינים ב- AOSP: