Implementar o storaged

O Android 8 inclui suporte para storaged, um daemon nativo do Android que coleciona e publica métricas de armazenamento em dispositivos Android.

  • Para diskstats diários, o storaged analisa periodicamente /sys/block/mmcblk0/stat (dispositivos de armazenamento eMMC) ou /sys/block/sda/stat (dispositivos que não são eMMC).
  • Para a vida útil do eMMC, storaged analisa /d/mmc0/mmc0:001/ext_csd (se disponível).
  • Para atribuição de culpa de E/S do app, storaged percorre periodicamente /proc/uid_io/stats e mantém dados analisados, que incluem dados de todos os apps (não apenas os em execução). dumpsys pode chamar storaged para registrar o uso de E/S do app em um relatório de bug.

As informações de diskstat (incluindo diskstats interrompidos) e eMMC são registradas no registro de eventos do Android, onde um serviço de check-in da plataforma coleta os registros.

As operações storaged ocorrem automaticamente e são processadas inteiramente pelo framework do Android. Portanto, você não precisa fazer nenhum trabalho de implementação. Esta página descreve o design de storaged (incluindo novas interfaces) e como usá-lo para receber o status de E/S do kernel.

design de armazenamento

Para flexibilidade de contabilidade e permissão, o storaged é implementado como um módulo do kernel que retorna informações de E/S por uid (em vez de usar o proc/PID/io padrão). Os dados brutos de E/S de cada solicitação de E/S continuam sendo armazenados e atualizados no kernel task_struct, e o kernel rastreia quando um processo é encerrado para não perder o uso de E/S que ocorre no último evento de pesquisa storaged.

O módulo lê e processa dados brutos apenas quando o framework o notifica de uma mudança de uid em primeiro plano/segundo plano ou quando o daemon storaged solicita um relatório. Nesse momento, o módulo exporta um nó de arquivo do kernel para comunicação com o framework e o daemon storaged.

storaged introduz a interface /proc/uid_io/stats, que retorna uma lista de estatísticas de E/S para cada UID no sistema. O formato é:

<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>
  • Os bytes de leitura/gravação são eventos de E/S de um dispositivo de armazenamento.
  • Os caracteres de leitura/gravação (também em bytes) são dados solicitados por syscalls de leitura/gravação.

Receber o status de E/S do kernel

Para despejar o uso de E/S do kernel, use o comando storaged com a opção -u.

Comando: storaged -u

Formato da saída do comando: name/uid fg_rchar fg_wchar fg_rbytes fg_wbytes bg_rchar bg_wchar bg_rbytes bg_wbytes fg_fsync bg_fsync

Observação:essa saída é semelhante à de proc/uid_io/stats. Isso ocorre porque o storaged processa dados de /proc/uid_io/stats e gera dados próprios.

Exemplo de saída:

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