Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Capa de abstracción de Cgroup

Android 10 incluye una capa de abstracción de cgroup y perfiles de tareas, que los desarrolladores pueden usar para describir un conjunto de restricciones para aplicar a un hilo o proceso. El sistema usa los perfiles para elegir cómo aplicar las restricciones usando cgroups disponibles y puede cambiar el conjunto de características de cgroup subyacente sin afectar las capas de software superiores.

Acerca de los grupos de control (cgroups)

Los grupos de control proporcionan un mecanismo para agregar / dividir conjuntos de tareas (procesos, subprocesos y todos sus futuros hijos) en grupos jerárquicos con comportamiento especializado. Android usa cgroups para controlar y contabilizar los recursos del sistema, como la CPU y la memoria.

En Android 9 y versiones anteriores, el conjunto de cgroups disponibles y sus puntos de montaje y versiones se describieron en el init.rc inicialización init.rc y (hipotéticamente) podrían cambiarse. Debido a que el marco de Android esperaba que existiera un conjunto específico de cgroups en ubicaciones específicas y que tuvieran una versión específica y una jerarquía de subgrupos, la libertad de elegir la siguiente versión de cgroup o cambiar la jerarquía de cgroup para usar nuevas funciones era (en realidad) limitada.

En Android 10:

  • La configuración de Cgroup (anteriormente realizada a través del init.rc inicialización init.rc ) se describe usando el archivo cgroups.json , y todos los cgroups se montan antes de la etapa de inicio temprano del proceso de inicialización.
  • Los perfiles de tareas proporcionan una abstracción que desacopla la funcionalidad requerida de cómo se implementa esa funcionalidad. Los perfiles se describen mediante el archivo task_profiles.json y el marco de Android puede aplicar esos perfiles a un proceso o subproceso mediante las nuevas API SetTaskProfiles y SetProcessProfiles .

Para compatibilidad con versiones anteriores, las set_cpuset_policy heredadas set_cpuset_policy , set_sched_policy y get_sched_policy proporcionan la misma API, pero su implementación se modifica para usar perfiles de tareas. Los OEM, los SoC y los proveedores de servicios pueden usar las API heredadas o pueden usar los perfiles de tareas directamente. Aún se pueden montar cgroups adicionales a través del init.rc inicialización init.rc y el código del proveedor puede usarlos como antes; sin embargo, si se requiere que el marco de Android reconozca estos nuevos cgroups y los use, los grupos deben describirse en el archivo cgroups.json y los nuevos perfiles de tareas deben definirse en el archivo task_profiles.json .

Archivo de descripción de Cgroups

Los grupos C se describen en el archivo cgroups.json ubicado en <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ . Cada controlador se describe en una subsección y debe tener al menos un nombre y una ruta de montaje (los atributos Mode, UID y GID son opcionales).

Ejemplo de archivo cgroups.json :

{
  "Cgroups": [
    {
      "Controller": "cpu",
      "Path": "/dev/cpuctl",
      "Mode": "0755",
      "UID": "system",
      "GID": "system"
    },
    {
      "Controller": "cpuacct",
      "Path": "/acct",
      "Mode": "0555"
    }
}

Este archivo es analizado por el proceso init antes de la etapa de inicio temprano y los cgroups se montan en las ubicaciones especificadas. La ubicación de montaje de cgroup se puede obtener más tarde utilizando la función de API CgroupGetControllerPath .

Archivo de perfiles de tareas

Los perfiles y atributos de tareas se describen en el archivo task_profiles.json ubicado en <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/ . Los perfiles describen un conjunto específico de acciones que se aplicarán a un proceso o subproceso. Un conjunto de acciones está asociado con un nombre de perfil, que se utiliza en las llamadas SetTaskProfiles y SetProcessProfiles para invocar acciones de perfil. Las acciones de perfil admitidas son SetTimerSlack , SetAttribute y JoinCgroup .

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"

          }
        }
      ]
    }
  ]
}

Los atributos nombran archivos cgroup específicos y deben usarse solo cuando el marco requiere acceso directo a esos archivos y el acceso no se puede abstraer usando perfiles de tareas. En todos los demás casos, se deben utilizar perfiles de tareas, ya que proporcionan un mejor desacoplamiento entre el comportamiento requerido y los detalles de implementación.

Cambios en la API existente

Android 10 mantiene las funciones set_cpuset_policy , set_sched_policy y get_sched_policy y no realiza cambios en la API; sin embargo, Android 10 mueve estas funciones a libprocessgroup , que ahora contiene todas las funciones relacionadas con cgroup.

El cutils/sched_policy.h todavía existe y se puede incluir, pero simplemente incluye un nuevo processgroup/sched_policy.h por lo que todo el código nuevo debe incluir directamente processgroup/sched_policy.h .

Los módulos que usan cualquiera de estas funciones deben agregar dependencia en la biblioteca libprocessgroup en su archivo MAKE. Si un módulo no utiliza ninguna otra funcionalidad de libcutils , entonces la dependencia de la biblioteca libcutils debe eliminarse del archivo MAKE.

API de perfiles de tareas

Las siguientes API privadas se introducen y definen en processgroup/processgroup.h :

  • bool SetTaskProfiles(int tid, const std::vector<std::string>& profiles)

    Aplica los perfiles de tarea especificados en profiles al hilo especificado por su ID de hilo usando el parámetro tid .

  • bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector<std::string>& profiles)

    Aplica los perfiles de tareas especificados en los profiles al proceso especificado por su usuario y los ID de proceso mediante los parámetros uid y pid .

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

    Devuelve si existe un controlador cgroup especificado por cgroup_name y establece la variable de path en la raíz de ese cgroup.

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

    Devuelve si existe un atributo de perfil especificado por attr_name y establece la variable de path en la ruta del archivo asociado con ese atributo de perfil.

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

    Devuelve si existe un atributo de perfil especificado por attr_name y establece la variable de path en la ruta del archivo asociado con ese atributo de perfil y el hilo especificado por su ID de hilo usando el parámetro tid .

  • bool UsePerAppMemcg()

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