O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Camada de abstração Cgroup

O Android 10 e superior usam uma camada de abstração de grupo de controle (cgroup) com perfis de tarefas, que os desenvolvedores podem usar para descrever um conjunto (ou conjuntos) de restrições a serem aplicadas a um thread ou processo. O sistema então segue as ações prescritas dos perfis de tarefa para selecionar um ou mais cgroups apropriados, através dos quais as restrições são aplicadas, e as alterações no conjunto de recursos do cgroup subjacente podem ser feitas sem afetar as camadas de software superiores.

Sobre cgroups

Os cgroups fornecem um mecanismo para agregar e particionar conjuntos de tarefas (que consistem em processos, threads e todos os seus futuros filhos) em grupos hierárquicos com comportamento especializado. Android usa cgroups para o controle e conta para os recursos do sistema, tais como o uso de CPU e memória e alocação, com suporte para Linux kernel do cgroups v1 e cgroups v2 .

Android 9 e inferior

Em Android 9 e inferior, o init.rc script de inicialização continha o conjunto de cgroups disponíveis, seus pontos de montagem, e versões. Embora eles pudessem ser alterados, a estrutura do Android esperava que existisse um conjunto específico de cgroups em locais específicos com uma versão específica e hierarquia de subgrupo, com base no script. Isso limitou a capacidade de escolher a próxima versão do cgroup a ser usada ou de alterar a hierarquia do cgroup para usar novos recursos.

Android 10 e superior

O Android 10 e superior usam cgroups com perfis de tarefas:

  • Configuração cgroup - promotores descrevem a configuração cgroups em sua cgroups.json arquivo para definir conjuntos de cgroups, e os seus locais de montagem e atributos. Todos os cgroups são montados durante o estágio inicial de inicialização do processo de inicialização.
  • Perfis de tarefas - fornecem uma abstração que separa a funcionalidade necessária dos detalhes de sua implementação. O quadro Android aplica os perfis de tarefas, conforme descrito na task_profiles.json arquivo para um processo ou segmento usando os SetTaskProfiles e SetProcessProfiles APIs. (Essas APIs são exclusivas do Android 11 e superior.)

Para fornecer compatibilidade com versões anteriores, as funções de legado set_cpuset_policy , set_sched_policy e get_sched_policy fornecer a mesma API e funcionalidade, mas a sua aplicação foi modificado para usar perfis de tarefas. Para os novos casos de uso AOSP recomenda o uso de novas APIs perfis de tarefas em vez do legado set_sched_policy função.

Arquivo de descrição Cgroups

Cgroups são descritos na cgroups.json arquivo localizado sob <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ . Cada controlador é descrito em uma subseção e deve ter no mínimo o seguinte:

  • Nome, definido pelo campo Controller.
  • Caminho de montagem, definido pelo campo Path.
  • Mode, UID (ID de usuário) e GID (ID do grupo) descrevendo o proprietário e Modos de Acesso para os arquivos sob esse caminho (todos opcionais).
  • Atributo opcional, definido como verdadeiro para que o sistema ignorar o erro de montagem causado por um controlador de cgroup que o kernel faz ser não suporte montado.

Exemplo de arquivo cgroups.json

O exemplo a seguir mostra, para descrições v1 cgroup ( Cgroups ) e cgroup v2 ( Cgroups2 controladores) com os seus respectivos caminhos.

{
  "Cgroups": [
    {
      "Controller": "cpu",
      "Path": "/dev/cpuctl",
      "Mode": "0755",
      "UID": "system",
      "GID": "system"
    },
    {
      "Controller": "memory",
      "Path": "/dev/memcg",
      "Mode": "0700",
      "Optional": true
    }
  ],
 "Cgroups2": {
   "Path": "/sys/fs/cgroup",
   "Mode": "0755",
   "UID": "system",
   "GID": "system",
   "Controllers": [
     {
       "Controller": "freezer",
       "Path": ".",
       "Mode": "0755",
       "UID": "system",
       "GID": "system"
     }
   ]
 }
}

Este ficheiro contém duas secções exemplo, Cgroups (descrevendo os controladores cgroup v1) e Cgroups2 (descrevendo os controladores cgroup v2). Todos os controladores na hierarquia cgroups v2 são montados no mesmo local. Portanto, a seção Cgroups2 tem o seu próprio caminho, Mode, UID, e atributos GID para descrever a localização e atributos para a raiz da hierarquia. O atributo Path para controladores sob Cgroups2 é relativo a esse caminho raiz. Em Android 12 e superior, você pode definir um controlador cgroup que é especificado com o caminho eo modo como "Optional" , definindo-a true .

O cgroups.json arquivo é analisado como parte do processo de inicialização, durante a fase inicial-init, e os cgroups são montados, nos locais especificados. Para obter mais tarde os locais de montagem cgroup, utilize o CgroupGetControllerPath função API.

Arquivo de perfis de tarefas

O task_profiles.json arquivo está localizado em <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ . Use-o para descrever um conjunto específico de ações a serem aplicadas a um processo ou thread. Um conjunto de ações está associado a um nome de perfil, que é usado em SetTaskProfiles e SetProcessProfiles chamadas para invocar ações em seu perfil.

Exemplo de arquivo task_profiles.json

{
  "Attributes": [
    {
      "Name": "MemSoftLimit",
      "Controller": "memory",
      "File": "memory.soft_limit_in_bytes"
    },
    {
      "Name": "MemSwappiness",
      "Controller": "memory",
      "File": "memory.swappiness"
    }
  ],
  "Profiles": [
    {
      "Name": "MaxPerformance",
      "Actions" : [
        {
          "Name" : "JoinCgroup",
          "Params" :
          {
            "Controller": "schedtune",
            "Path": "top-app"
          }
        }
      ]
    },
    {
      "Name": "TimerSlackHigh",
      "Actions" : [
        {
          "Name" : "SetTimerSlack",
          "Params" :
          {
            "Slack": "40000000"
          }
        }
      ]
    },
    {
      "Name": "LowMemoryUsage",
      "Actions" : [
        {
          "Name" : "SetAttribute",
          "Params" :
          {
            "Name" : "MemSoftLimit",
            "Value" : "16MB"
          }
        },
        {
          "Name" : "SetAttribute",
          "Params" :
          {
            "Name" : "MemSwappiness",
            "Value" : "150"

          }
        }
      ]
    }
  ]
  "AggregateProfiles": [
     {
       "Name": "SCHED_SP_DEFAULT",
       "Profiles": [ "TimerSlackHigh", "MaxPerformance" ]
     },
     {
       "Name": "SCHED_SP_BACKGROUND",
       "Profiles": [ "LowMemoryUsage" ]
     }
}

Nomes atribuir a arquivos cgroup específicas como entradas na lista de atributos. Cada entrada contém o seguinte:

  • Campo de nome - especifica o nome do atributo.
  • Campo Controller - referências de um controlador cgroup do cgroups.json arquivo, pelo seu nome.
  • Campo Arquivo - nomes de um arquivo específico no âmbito deste controlador.

Os atributos são referências em definições de perfis tarefa. Fora de perfis de tarefas, usá-los apenas quando o quadro requer acesso direto a esses arquivos, e acesso não pode ser abstraída usando perfis de tarefas. Em todos os outros casos, use perfis de tarefas; eles fornecem uma melhor dissociação entre o comportamento necessário e seus detalhes de implementação.

A seção Perfis contém definições de perfis tarefa com as seguintes:

  • Campo Nome - define o nome do perfil.
  • Acções seção - listas um conjunto de ações realizadas quando o perfil é aplicado. Cada ação tem o seguinte:

    • Campo Nome especificando as medidas
    • Seção de parâmetros que especifica um conjunto de parâmetros para a ação

As ações com suporte estão listadas na tabela abaixo.

Açao Parâmetro Descrição
SetTimerSlack Slack Folga do temporizador em ns
SetAttribute Name Um nome fazendo referência a um atributo da seção Atributos
Value Um valor a ser escrito no arquivo representado pelo atributo nomeado
WriteFile FilePath caminho para o arquivo
Value um valor a ser escrito no arquivo
JoinCgroup Controller Um nome do controlador cgroup de cgroups.json
Path Um caminho de subgrupo na hierarquia do controlador cgroup

Característica Android 12 e uma secção superior que contém AggregateProfiles perfis de agregação, cada uma das quais é uma abreviatura para um conjunto de um ou mais perfis. As definições de perfil agregado consistem no seguinte:

  • Campo de nome - especifica o nome do perfil de agregação.
  • Campo de perfis - Lista os nomes dos perfis incluídos no perfil agregada.

Quando um perfil agregado é aplicado, todos os perfis contidos também são aplicados automaticamente. Os perfis agregados podem conter perfis individuais ou outros perfis agregados, desde que não haja recursões (um perfil que inclui a si mesmo).

task_profiles init language command

A task_profiles comando no Android Init Idioma está disponível para Android 12 e superior para facilitar a ativação perfil tarefa para um processo específico. Ele substitui o writepid comando (preterido no Android 12) que foi usado para migrar um processo entre cgroups. O task_profiles comando proporciona flexibilidade para mudar implementações subjacentes, sem qualquer efeito sobre as camadas superiores. No exemplo abaixo, esses dois comandos executam efetivamente a mesma operação:

  • writepid /dev/cpuctl/top-app/tasks

    Preterida no Android 12 - foi usado para escrever o PID da tarefa atual no /dev/cpuctl/top-app/tasks de arquivo.

  • task_profiles MaxPerformance

    Junta-se ao processo atual para o grupo top-aplicativo sob controle "CPU" ( cpuctl ), o que resulta em escrever o PID do processo para dev/cpuctl/top-app/tasks .

Sempre use as task_profiles comando para migrar tarefas em hierarquias cgroup no Android 12 e superior. Ele aceita um ou mais parâmetros, representando os nomes dos perfis especificados no task_profiles.json arquivo.

Por perfis de tarefa de nível de API

Em Android 12 e superior, você pode alterar ou definições de substituição do padrão cgroups.json e task_profiles.json arquivos, quer basear a sua mudança no nível API Android, ou tornando-se a partir da partição fornecedor.

Para substituir as definições com base no nível da API, os seguintes arquivos devem estar presentes no dispositivo:

  • pro/system/etc/task_profiles/cgroups_<API level>.json

    Use isso para cgroups específicos para um nível de API.

  • /system/etc/task_profiles/task_profiles_<API level>.json

    Use isso para perfis específicos para um nível de API.

Para substituir as definições da partição do fornecedor, os seguintes arquivos devem estar presentes no dispositivo:

  • /vendor/etc/cgroups.json
  • /vendor/etc/task_profiles.json

Se um atributo ou uma definição de perfil nesses arquivos usar o mesmo nome que no arquivo padrão, a definição do arquivo (nível de API ou nível de fornecedor) substitui a definição anterior. Observe também que as definições no nível do fornecedor substituem as definições no nível da API. Se a nova definição tiver um novo nome, o conjunto de atributos ou perfis será alterado com a nova definição.

As cargas do sistema Android do cgroup e task_profile arquivos na seguinte ordem:

  1. Padrão cgroups.json e task_profiles.json arquivos.
  2. Arquivos específicos do nível da API, se houver.
  3. Arquivos de partição do fornecedor, se houver.

Mudanças na API existente

Android 10 e superior mantém as funções set_cpuset_policy , set_sched_policy e get_sched_policy sem alterações para a API. No entanto, o Android 10 se move essas funções em libprocessgroup , que agora contém todas as funcionalidades relacionadas com o cgroup.

Embora o cutils/sched_policy.h cabeçalho ainda existe, para evitar a quebra existente código assegurar que o novo código inclui um novo processgroup/sched_policy.h cabeçalho vez.

Módulos que usam qualquer uma destas funções deve adicionar dependência do libprocessgroup biblioteca em seu makefile. Se um módulo não usa qualquer outro libcutils funcionalidade, solte os libcutils dependência biblioteca do makefile.

APIs de perfis de tarefas

As APIs privadas em processgroup/processgroup.h são definidos na tabela abaixo:

Modelo API e definição
bool SetTaskProfiles(int tid, const std::vector & profiles) SetTaskProfiles(int tid, const std::vector & profiles)

Aplica-se os perfis de tarefas especificadas no profiles para o segmento especificado por um ID thread (tid) usando seu tid parâmetro.

bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector & profiles) SetProcessProfiles(uid_t uid, pid_t pid, const std::vector & profiles)

Aplica-se os perfis de tarefas especificadas em profiles para o processo especificado pelas suas IDs de utilizador e do processo utilizando uid e pid parâmetros

bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path)

Retorna se um controlador cgroup especificado pelo cgroup_name existe; Se true , define o path variável para a raiz do que cgroup

bool CgroupGetAttributePath(const std::string& attr_name, std::string* path)

Retorna se um atributo de perfil especificados pelo attr_name existe; Se true , define o path variável para o caminho do arquivo associado a esse atributo perfil.

bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path)

Retorna se um atributo de perfil especificados pelo attr_name existe; Se true , define o path variável para o caminho do arquivo associado a esse atributo perfil, e para o segmento especificado pelo seu ID segmento usando o tid parâmetro.

bool UsePerAppMemcg()

Retorna se o sistema está configurado para usar cgroups de memória por aplicativo.