Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Capa de abstracción de Cgroup

Android 10 y versiones posteriores usan una capa de abstracción de grupo de control (cgroup) con perfiles de tareas, que los desarrolladores pueden usar para describir un conjunto (o conjuntos) de restricciones para aplicar a un hilo o proceso. Luego, el sistema sigue las acciones prescritas de los perfiles de tareas para seleccionar uno o más cgroups apropiados, a través de los cuales se aplican restricciones, y se pueden realizar cambios en el conjunto de funciones de cgroup subyacente sin afectar las capas de software superiores.

Acerca de cgroups

Cgroups proporciona un mecanismo para agregar y dividir conjuntos de tareas (que consisten en procesos, subprocesos y todos sus hijos futuros) en grupos jerárquicos con comportamiento especializado. Usos Android cgroups para el control y dar cuenta de los recursos del sistema, tales como el uso de la CPU y la memoria y la asignación, con soporte para Linux kernel cgroups v1 y cgroups v2 .

Android 9 y versiones anteriores

En Android 9 e inferior, la init.rc script de inicialización contiene el conjunto de cgroups disponibles, sus puntos de montaje, y versiones. Si bien estos podrían cambiarse, el marco de Android esperaba que existiera un conjunto específico de cgroups en ubicaciones específicas con una versión específica y una jerarquía de subgrupos, según el script. Esto limitó la capacidad de elegir la próxima versión de cgroup para usar, o de cambiar la jerarquía de cgroup para usar nuevas funciones.

Android 10 y superior

Android 10 y versiones posteriores usan cgroups con perfiles de tareas:

  • Configuración cgroup - los desarrolladores describen la configuración cgroups en su cgroups.json archivo para definir conjuntos de cgroups, y sus localizaciones y atributos de montaje. Todos los cgroups se montan durante la etapa de inicio temprano del proceso de inicialización.
  • Perfiles de tareas: proporcionan una abstracción que desacopla la funcionalidad requerida de los detalles de su implementación. El marco Android aplica los perfiles de función como la descrita en el task_profiles.json archivo a un proceso o subproceso mediante los SetTaskProfiles y SetProcessProfiles API. (Estas API son exclusivas de Android 11 y versiones posteriores).

Para proporcionar compatibilidad con versiones anteriores, las funciones de legado set_cpuset_policy , set_sched_policy y get_sched_policy proporcionar la misma API y funcionalidad, pero su aplicación se ha modificado para utilizar perfiles de tareas. Para los nuevos casos de uso AOSP recomienda el uso de las nuevas API de perfiles de trabajo en lugar de la herencia set_sched_policy función.

Archivo de descripción de Cgroups

Cgroups se describen en la cgroups.json archivo que se encuentra bajo <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ . Cada controlador se describe en una subsección y debe tener un mínimo de lo siguiente:

  • Nombre, definida por el campo Controlador.
  • Ruta de montaje, que se define por el campo Ruta.
  • Modo, UID (identificador de usuario), y GID (ID de grupo) que describe los modos de propietario y de acceso a los archivos en esta ruta (todos opcionales).
  • Atributo opcional, el valor true para dejar que el sistema ignore el error de montaje causado por un controlador cgroup que el kernel hace ser no soporte montado.

Ejemplo de archivo cgroups.json

El siguiente ejemplo muestra descripciones de v1 cgroup ( Cgroups ) y cgroup v2 ( Cgroups2 controladores) con sus respectivos caminos.

{
  "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 archivo de ejemplo contiene dos secciones, cgroups (describiendo los controladores cgroup V1) y Cgroups2 (describiendo los controladores cgroup V2). Todos los controladores de la jerarquía de cgroups v2 están montados en la misma ubicación. Por lo tanto, la sección Cgroups2 tiene su propio camino, de modo, UID y GID atributos para describir la ubicación y las características de la raíz de la jerarquía. El atributo de ruta para los controladores de bajo Cgroups2 es relativa a la ruta raíz. En Android 12 y más alto se puede definir un controlador de cgroup que se especifica con la ruta y el modo como "Optional" estableciéndolo en true .

El cgroups.json archivo se analiza como parte del proceso init, durante la etapa temprana-init, y los cgroups están montados en las posiciones especificadas. Para obtener más tarde los lugares de montaje cgroup, utilice el CgroupGetControllerPath función de la API.

Archivo de perfiles de tareas

El task_profiles.json archivo se encuentra bajo <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ . Úselo para describir un conjunto específico de acciones que se aplicarán a un proceso o subproceso. Un conjunto de acciones está asociada a un nombre de perfil, que se utiliza en SetTaskProfiles y SetProcessProfiles llamadas a invocar acciones perfil.

Ejemplo de archivo 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" ]
     }
}

Nombres asigna a los archivos cgroup específicos como entradas en la lista de atributos. Cada entrada contiene lo siguiente:

  • Campo de nombre - especifica el nombre del atributo.
  • Controlador de Campo - referencias cgroup un controlador de la cgroups.json archivo, por su nombre.
  • Campo de archivo - Los nombres de un archivo específico en virtud de este controlador.

Los atributos son referencias en definiciones de perfiles tarea. Fuera de los perfiles de trabajo, los utilizan sólo cuando el marco requiere acceso directo a esos archivos, y el acceso no se puede abstraer el uso de perfiles de trabajo. En todos los demás casos, utilice perfiles de tareas; proporcionan un mejor desacoplamiento entre el comportamiento requerido y los detalles de su implementación.

La sección de los perfiles contiene definiciones de perfiles tarea con lo siguiente:

  • Campo de nombre - define el nombre del perfil.
  • Acciones sección de listas - un conjunto de acciones que se realizan cuando se aplica el perfil. Cada acción tiene lo siguiente:

    • Nombre de campo que especifica la acción
    • Sección Parámetros especificación de un conjunto de parámetros para la acción

Las acciones admitidas se enumeran en la tabla siguiente.

Acción Parámetro Descripción
SetTimerSlack Slack Temporizador flojo en ns
SetAttribute Name Un nombre hace referencia a un atributo de la sección Atributos
Value Un valor que se escribirá en el archivo representado por el atributo nombrado
WriteFile FilePath ruta al archivo
Value un valor que se escribirá en el archivo
JoinCgroup Controller Un nombre del controlador de cgroup de cgroups.json
Path Una ruta de subgrupo en la jerarquía del controlador de cgroup

Android 12 y superior característica una sección AggregateProfiles que contiene perfiles de agregados, cada uno de los cuales es un alias para un conjunto de uno o más perfiles. Las definiciones de perfil agregadas consisten en lo siguiente:

  • Campo de nombre - especifica el nombre del perfil agregado.
  • Campo Perfiles - enumera los nombres de los perfiles incluidos en el perfil agregado.

Cuando se aplica un perfil agregado, todos los perfiles que lo contienen también se aplican automáticamente. Los perfiles agregados pueden contener tanto perfiles individuales como otros perfiles agregados, siempre que no haya recursiones (un perfil que se incluya a sí mismo).

task_profiles comando de idioma init

Un task_profiles comando en el Android Init Lenguaje está disponible para Android 12 y superior para facilitar la activación perfil tarea para un proceso específico. Sustituye a la writepid de comandos (en desuso en Android 12) que se utilizó para migrar un proceso entre cgroups. El task_profiles comando proporciona flexibilidad para el cambio de las implementaciones subyacentes, sin efecto sobre las capas superiores. En el siguiente ejemplo, estos dos comandos realizan efectivamente la misma operación:

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

    Obsoleto en Android 12 - Se utiliza para escribir el PID de la tarea actual en el /dev/cpuctl/top-app/tasks archivo.

  • task_profiles MaxPerformance

    Se une el proceso actual en el grupo superior aplicación bajo controlador "CPU" ( cpuctl ), que resulta en escribir el PID del proceso a dev/cpuctl/top-app/tasks .

Siempre use los task_profiles comando para migrar tareas en las jerarquías cgroup en Android 12 y superior. Se acepta uno o más parámetros, que representan los nombres de los perfiles especificados en el task_profiles.json archivo.

Perfiles de tareas por nivel de API

En Android 12 y superior, puede modificar o definiciones de sustitución en el valor por defecto cgroups.json y task_profiles.json archivos, ya sea basando su cambio en el nivel de la API de Android, o lo que es desde la partición vendedor.

Para anular las definiciones basadas en el nivel de API, los siguientes archivos deben estar presentes en el dispositivo:

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

    Use esto para cgroups específicos a un nivel de API.

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

    Úselo para perfiles específicos de un nivel de API.

Para anular las definiciones de la partición del proveedor, los siguientes archivos deben estar presentes en el dispositivo:

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

Si un atributo o una definición de perfil en estos archivos utiliza el mismo nombre que en el archivo predeterminado, la definición del archivo (nivel de API o nivel de proveedor) anula la definición anterior. Tenga en cuenta también que las definiciones de nivel de proveedor anulan las definiciones de nivel de API. Si la nueva definición tiene un nuevo nombre, entonces el conjunto de atributos o perfiles se modifica con la nueva definición.

El sistema carga los Android cgroup y task_profile archivos en este orden:

  1. Predeterminado cgroups.json y task_profiles.json archivos.
  2. Archivos específicos del nivel de API, si están presentes.
  3. Archivos de partición del proveedor, si están presentes.

Cambios en la API existente

Android 10 y superior mantiene las funciones set_cpuset_policy , set_sched_policy y get_sched_policy sin cambios en el API. Sin embargo, Android 10 se desplaza estas funciones en libprocessgroup , que ahora contiene toda la funcionalidad relacionada cgroup.

Aunque el cutils/sched_policy.h todavía existe cabecera, para evitar romper el código existente asegurar que el nuevo código incluye un nuevo processgroup/sched_policy.h cabecera en su lugar.

Los módulos que utilizan cualquiera de estas funciones deben añadir la dependencia de la libprocessgroup biblioteca en su makefile. Si un módulo no utiliza ningún otro libcutils funcionalidad, la caída de los libcutils dependencias de bibliotecas del makefile.

API de perfiles de tareas

Las APIs privadas en processgroup/processgroup.h se definen en la siguiente tabla:

Escribe API y definición
bool SetTaskProfiles(int tid, const std::vector & profiles) SetTaskProfiles(int tid, const std::vector & profiles)

Aplica los perfiles tarea especificada en profiles la rosca especificado por un identificador de hilo (tid) utilizando su 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 los perfiles tarea especificada en profiles con el proceso especificado por sus identificadores de usuario y de proceso usando uid y pid parámetros

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

Devuelve si un controlador cgroup especificado por cgroup_name existe; Si true , establece la path la variable a la raíz de esa cgroup

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

Indica si un atributo de perfil especificado por attr_name existe; Si true , establece la path variable a la ruta del archivo asociado a ese atributo de perfil.

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

Indica si un atributo de perfil especificado por attr_name existe; si true , establece la path variable a la ruta del archivo asociado con ese atributo de perfil, y al hilo especificado por su ID hilo usando el tid parámetro.

bool UsePerAppMemcg()

Devuelve si el sistema está configurado para utilizar cgroups de memoria por aplicación.