הטמעת storaged

ב-Android 8 נוספה תמיכה ב-storaged, דימון מקורי ל-Android שאוסף ומפרסם מדדי אחסון במכשירי Android.

  • כדי לקבל את נתוני diskstats היומיים, storaged מנתח מדי פעם את /sys/block/mmcblk0/stat (מכשירי אחסון מסוג eMMC) או את /sys/block/sda/stat (מכשירים שאינם מסוג eMMC).
  • כדי לחשב את משך החיים של eMMC, הפונקציה storaged מפענחת את /d/mmc0/mmc0:001/ext_csd (אם הוא זמין).
  • כדי לשייך את הבעיה של קלט/פלט לאפליקציה, המערכת של storaged עוברת מדי פעם על /proc/uid_io/stats ומשמרת נתונים מנותחים, שכוללים נתונים מכל האפליקציות (לא רק מהאפליקציות שפועלות). dumpsys יכול להפעיל את storaged כדי לתעד ביומן את השימוש של האפליקציה בקלט/פלט בדוח באג.

נתוני diskstat (כולל נתוני diskstats שנתקעו) ונתוני eMMC נרשמים ביומן האירועים של Android, שבו שירות של בדיקת פלטפורמה אוסף את היומנים.

הפעולות של storaged מתבצעות באופן אוטומטי ומטופלות באופן מלא על ידי מסגרת Android, כך שאין צורך לבצע עבודות הטמעה. בדף הזה מתוארים העיצוב של storaged (כולל ממשקים חדשים) והשימוש בו כדי לקבל סטטוס של קלט/פלט מהליבה.

עיצוב מאוחסן

כדי לאפשר גמישות בדיווח ובהרשאות, storaged מיושם כמודול של הליבה שמחזיר מידע על קלט/פלט לכל מזהה משתמש (במקום להשתמש ב-proc/PID/io הרגיל). נתוני הקלט/פלט הגולמיים של כל בקשת קלט/פלט ממשיכים להישמר ולהתעדכן בליבה task_struct, והליבה עוקבת אחרי היציאה של תהליך כדי לא לפספס שימוש בקלט/פלט שמתרחש מאז אירוע הסקרים האחרון של storaged.

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

storaged מציג את הממשק /proc/uid_io/stats, שמחזיר רשימה של נתונים סטטיסטיים של קלט/פלט לכל מזהה משתמש במערכת. הפורמט הוא:

<uid>: <foreground read bytes> <foreground write bytes> <foreground read chars> <foreground write chars> <background read bytes> <background write bytes> <background read chars> <background write chars>
  • בייטים לקריאה/כתיבה הם אירועי קלט/פלט ממכשיר אחסון.
  • תווים לקריאה/כתיבה (גם בייטים) הם נתונים שנדרשים על ידי קריאה/כתיבה של syscalls.

אחזור סטטוס הקלט/פלט מהליבה

כדי ליצור גרסת dump של השימוש בקלט/פלט מהליבה, משתמשים בפקודה storaged עם האפשרות -u.

פקודה: storaged -u

פורמט הפלט של הפקודה: name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes bg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync

הערה: הפלט הזה דומה לפלט של proc/uid_io/stats. הסיבה לכך היא ש-storaged מעבד נתונים מ-/proc/uid_io/stats ויוצר נתונים משלו.

פלט לדוגמה:

com.google.android.backuptransport  2269  60  0  0  1719845663  143912573  149065728  184180736
com.android.vending  2170  60  0  0  219904796  38693092  174436352  18944000