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
를 순회하고 파싱된 데이터를 유지합니다. 여기에는 실행 중인 애플리케이션을 비롯한 모든 애플리케이션의 데이터가 포함됩니다.dumpsys
는storaged
를 호출하여 버그 신고에 애플리케이션 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 이벤트입니다.
- 마찬가지로 바이트인 읽기/쓰기 문자가 읽기/쓰기 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