storaged 구현

Android O에서는 Android 기기의 저장용량 측정항목을 수집하여 게시하는 Android 네이티브 데몬인 storaged 지원이 추가됩니다.

  • 일일 diskstats와 관련하여 storaged는 주기적으로 /sys/block/mmcblk0/stat(eMMC 저장기기) 또는 /sys/block/sda/stat(비 eMMC 기기)을 파싱합니다.
  • eMMC 전체 기간과 관련하여 storaged/d/mmc0/mmc0:001/ext_csd(있는 경우)를 파싱합니다.
  • 애플리케이션 I/O 블레임과 관련하여 storaged는 주기적으로 /proc/uid_io/stats를 순회하고 파싱된 데이터를 유지합니다. 여기에는 실행 중인 애플리케이션을 비롯한 모든 애플리케이션의 데이터가 포함됩니다. dumpsysstoraged를 호출하여 버그 신고에 애플리케이션 I/O 사용을 로그할 수 있습니다.

Diskstat(지연된 diskstats 포함) 및 eMMC 정보는 플랫폼 체크인 서비스에서 로그를 수집하는 Android 이벤트 로그에 로그됩니다.

storaged 연산은 자동으로 발생하며 전체가 Android 프레임워크에 의해 처리됩니다. 따라서 구현 작업을 실행할 필요가 없습니다. 이 페이지에서는 storaged의 설계(새 인터페이스 포함), 그리고 이를 사용하여 커널에서 I/O 상태를 가져오는 방법을 설명합니다.

storaged 설계

계정 관리 및 권한 유연성을 위해 storaged는 표준 proc/PID/io를 사용하는 대신 UID별 I/O 정보를 반환하는 커널 모듈로 구현됩니다. 각 I/O 요청의 원본 I/O 데이터는 계속해서 커널 task_struct에서 저장 및 업데이트되며, 커널은 마지막 storaged 폴링 이벤트에서 발생하는 I/O 사용을 놓치지 않도록 프로세스 종료 시점을 추적합니다.

모듈은 프레임워크에서 UID 포그라운드/백그라운드 스위치의 전환을 알리거나 storaged 데몬이 보고서를 요청하는 경우에만 원본 데이터를 읽고 처리합니다. 이때 모듈은 프레임워크 및 storaged 데몬과의 통신을 위해 커널의 파일 노드를 내보냅니다.

storaged는 시스템 내 각 UID의 I/O 상태 목록을 반환하는 /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>
  • 읽기/쓰기 바이트가 저장기기의 I/O 이벤트입니다.
  • 마찬가지로 바이트인 읽기/쓰기 char가 읽기/쓰기 syscall에 의해 요청됩니다.

커널에서 I/O 상태 가져오기

커널에서 I/O 사용을 덤프하려면 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