首页 > 其他分享 >Cgroup学习笔记1—Cgroup 抽象层

Cgroup学习笔记1—Cgroup 抽象层

时间:2022-09-06 23:13:26浏览次数:72  
标签:Name 配置文件 笔记 json 抽象 profiles cgroup Cgroup cpu

一、理论介绍

1. 新版本Android不建议在 init.rc 初始化脚本来安装其他 cgroup,需要在 cgroups.json 文件中描述相应的组,并在 task_profiles.json 文件中定义新的任务配置文件以使用这些 cgroup 来执行操作。

2. cgroups.json cgroup 描述文件

cgroup 设置 - 开发者在其 cgroups.json 文件中描述 cgroup 设置,以便定义 cgroup 组及其装载位置和属性。所有 cgroup 均会在初始化过程的 early-init 阶段装载。

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

注意,cgroup1 和 cgroup2 的挂载点是不一样的!"Cgroups" 描述 cgroup v1 控制器,"Cgroups2" 描述 cgroup v2 控制器。cgroup v2 层次结构中的所有控制器均在同一位置装载。因此,Cgroups2 部分有自己的 Path、Mode、UID 和 GID 属性,用于描述层次结构的根的位置和属性。Cgroups2 下的 Controllers 的 Path 属性是相对于该根路径而言的。在 Android 12 及更高版本中,您可以将已指定路径和模式的 cgroup 控制器定义为 "Optional"(方法是将其设置为 true)。

各个控制器在子部分中描述,且必须至少包含以下内容:
名称:由 Controller 字段定义。
装载路径:由 Path 字段定义。
Mode、UID、GID:用于描述该路径下文件的所有者模式和访问模式(均为可选字段)。
Optional 属性: 将其设置为 true,让系统忽略内核不支持装载的 cgroup 控制器引起的装载错误。

系统会在 init 进程的 early-init 阶段解析 cgroups.json 文件,并在指定位置装载 cgroup。如果以后需要获取 cgroup 装载位置,请使用 CgroupGetControllerPath API 函数。

 

3. task_profiles.json 任务配置文件

任务配置文件 - 这些配置文件提供了一种抽象概念,将必需的功能与该功能的实现详情分离。Android 框架使用 SetTaskProfiles 和 SetProcessProfiles API,按照 task_profiles.json 文件中的描述将任务配置文件应用于进程或线程(这些 API 是 Android 11 及更高版本所独有的)。

//system/core/libprocessgroup/profiles/task_profiles.json

{
  "Attributes": [
    ...
    {
      "Name": "UClampMin",
      "Controller": "cpu",
      "File": "cpu.uclamp.min"
    },
    {
      "Name": "UClampMax",
      "Controller": "cpu",
      "File": "cpu.uclamp.max"
    },
    {
      "Name": "UClampLatencySensitive",
      "Controller": "cpu",
      "File": "cpu.uclamp.latency_sensitive"
    },
    ...
  ],

  "Profiles": [
    {
      "Name": "HighEnergySaving",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "background"
          }
        }
      ]
    },
    ...
    {
      "Name": "NormalPerformance",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "system"
          }
        }
      ]
    },
    {
      "Name": "ServicePerformance",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "system-background"
          }
        }
      ]
    },
    {
      "Name": "HighPerformance",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "foreground"
          }
        }
      ]
    },
    {
      "Name": "MaxPerformance", //这个名字就表示join cpu top-app 分组。
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "top-app"
          }
        }
      ]
    },
    {
      "Name": "RealtimePerformance",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "rt"
          }
        }
      ]
    },
    {
      "Name": "CameraServicePerformance",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "camera-daemon"
          }
        }
      ]
    },
    ...
    {
      "Name": "NNApiHALPerformance",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "nnapi-hal"
          }
        }
      ]
    },
    ...
      "Name": "Dex2oatPerformance",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "cpu",
            "Path": "dex2oat"
          }
        }
      ]
    },
    ...
  ],

  "AggregateProfiles": [
    {
      "Name": "SCHED_SP_DEFAULT",
      "Profiles": [ "TimerSlackNormal" ]
    },
    {
      "Name": "SCHED_SP_BACKGROUND",
      "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ]
    },
    {
      "Name": "SCHED_SP_FOREGROUND",
      "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ]
    },
    {
      "Name": "SCHED_SP_TOP_APP",
      "Profiles": [ "MaxPerformance", "MaxIoPriority", "TimerSlackNormal" ]
    },
    {
      "Name": "SCHED_SP_SYSTEM",
      "Profiles": [ "ServicePerformance", "LowIoPriority", "TimerSlackNormal" ]
    },
    {
      "Name": "SCHED_SP_RT_APP",
      "Profiles": [ "RealtimePerformance", "MaxIoPriority", "TimerSlackNormal" ]
    },
    {
      "Name": "SCHED_SP_DISPLAY",
      "Profiles": [ "HighPerformance", "HighIoPriority", "TimerSlackNormal" ]
    },
    {
      "Name": "CPUSET_SP_DEFAULT",
      "Profiles": [ "TimerSlackNormal" ]
    },
    ...
    {
      "Name": "Dex2OatBootComplete",
      "Profiles": [ "Dex2oatPerformance", "LowIoPriority", "TimerSlackHigh" ]
    }
  ]
}

注:这里只列出了 cpu cgroup 相关的。

该文件用于描述要应用于进程或线程的一组特定操作。这组操作与一个配置文件名称相关联,后者在 SetTaskProfiles 和 SetProcessProfiles 调用中用于调用配置文件操作。

(1) Attributes 列表中每个条目都包含

Name - 指定 Attribute 的名称。
Controller - 按名称引用 cgroups.json 文件中的 cgroup 控制器。
File - 为相应控制器下的特定文件命名。

Attributes 是任务配置文件定义中的引用。在任务配置文件之外,仅当框架需要直接访问相应文件且无法使用任务配置文件抽象访问时,才应使用属性。在所有其他情况下,请使用任务配置文件;它们可以更好地分离所需行为及其实现详情。

(2) Profiles 列表每个条目包含

Name - 定义配置文件的名称。
Actions - 列出了应用配置文件后执行的一组操作,每项操作都包含以下几项:
Name:用于指定操作
Params:用于指定操作的一组参数

下表列出了受支持的操作和参数的匹配关系:

操作            参数        说明
--------------------------------------------------------------
SetTimerSlack    Slack        定时器可宽延时间(以纳秒为单位)
--------------------------------------------------------------
SetAttribute    Name        引用 Attributes 部分中某一属性的名称
                Value        要写入到由指定属性表示的文件的值
--------------------------------------------------------------
WriteFile        FilePath    文件的路径
                Value        要写入文件的值
--------------------------------------------------------------
JoinCgroup        Controller    cgroups.json 中的 cgroup 控制器的名称
                Path        cgroup 控制器层次结构中的子组路径
--------------------------------------------------------------

(3) AggregateProfiles 列表

Android 12 及更高版本具有一个 AggregateProfiles 部分,其中包含聚合配置文件,每个聚合配置文件都是一个或多个配置文件的别名。聚合配置文件定义由以下内容组成:

Name - 指定聚合配置文件的名称。
Profiles - 列出聚合配置文件中包含的配置文件的名称。

应用聚合配置文件时,也会自动应用所含的所有配置文件。只要没有递归(包括其自身的配置文件),聚合配置文件就可以包含单个配置文件或其他聚合配置文件。

 

4. task_profile init 语言命令

Android Init 语言中的 task_profiles 命令可用于 Android 12 及更高版本,促进为特定进程激活任务配置文件。它取代了用于在 cgroup 之间迁移进程的 writepid 命令(在 Android 12 中已弃用)。借助 task_profiles 命令,您可以灵活地更改底层实现,而不会影响上层。在以下示例中,这两个命令实际上会执行相同的操作:

writepid /dev/cpuctl/top-app/tasks //在 Android 12 中已弃用 - 用于将当前任务的 PID 写入 /dev/cpuctl/top-app/tasks 文件。
task_profiles MaxPerformance //将当前进程联接到 "cpu" 控制器 (cpuctl) 下的热门应用组中,这会将进程的 PID 写入 dev/cpuctl/top-app/tasks。

在 Android 12 及更高版本中,请务必使用 task_profiles 命令迁移 cgroup 层次结构中的任务。它接受一个或多个参数,参数yoga task_profiles.json 文件中指定的配置文件的名称表示。

 

5. 按 API 级别任务配置文件

在 Android 12 及更高版本中,您可以根据 Android API 级别或从 vendor 分区,修改或替换默认 cgroups.json 和 task_profiles.json 文件中的定义。

如需根据 API 级别替换定义,设备上必须存在以下文件:

/system/etc/task_profiles/cgroups_<API level>.json //此文件用于特定于 API 级别的 cgroup。
/system/etc/task_profiles/task_profiles_<API level>.json //此文件用于特定于 API 级别的配置文件。

如需从 vendor 分区中替换定义,设备上必须存在以下文件:

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

如果这些文件中的某个属性或配置文件定义使用与默认文件中相同的名称,该文件(API 级别或供应商级别)定义将替换先前的定义。另请注意,供应商级别定义会替换 API 级别定义。如果新定义有新名称,则将使用新定义修改属性集或配置文件集。

Android 系统会按照以下顺序加载 cgroup 和 task_profile 文件:

(1) 默认 cgroups.json 和 task_profiles.json 文件。
(2) 特定于 API 级别的文件(如果存在)。
(3) vendor 分区文件(如果存在)。

 

6. 对现有 API 的更改

Android 10 及更高版本保留了 set_cpuset_policy、set_sched_policy 和 get_sched_policy 函数,而未对 API 进行任何更改。不过,Android 10 将这些函数移到了 libprocessgroup 中(其中现在包含所有与 cgroup 相关的功能)。

虽然 cutils/sched_policy.h 头文件仍然存在,但为了避免破坏现有代码,请确保新代码改为包含新的 processgroup/sched_policy.h 头文件。

使用上述任何函数的模块应该将对 libprocessgroup 库的依赖项添加到其 makefile 中。如果某个模块不使用任何其他 libcutils 功能,请从 makefile 中删除相应的 libcutils 库依赖项。

 

7. 任务配置文件 API

下表定义了 processgroup/processgroup.h 中的私有 API:

//将 profiles 中指定的任务配置文件应用于由线程 ID (tid) 使用其 tid 参数指定的线程。
bool SetTaskProfiles(int tid, const std::vector& profiles)

//将 profiles 中指定的任务配置文件应用于由其用户 ID 和进程 ID 使用 uid 和 pid 参数指定的进程
bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector& profiles)

//返回值指示 cgroup_name 指定的 cgroup 控制器是否存在;如果为 true,则将 path 变量设为该 cgroup 的根
bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path)

//返回值指示 attr_name 指定的配置文件属性是否存在;如果为 true,则将 path 变量设为与该配置文件属性相关联的文件的路径。
bool CgroupGetAttributePath(const std::string& attr_name, std::string* path)

//返回值指示 attr_name 指定的配置文件属性是否存在;如果为 true,则将 path 变量设为与该配置文件属性相关联的文件的路径,以及由其线程 ID 使用 tid 参数指定的线程。
bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path)

//返回值指示系统是否配置为使用应用级别内存 cgroup。
bool UsePerAppMemcg()

 

 

参考:
1. Cgroup 抽象层: https://source.android.com/docs/core/perf/cgroups?hl=zh-cn
  Control Groups version 1:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/#control-groups-version-1
  Control Group v2:https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
  Android Init Language:https://android.googlesource.com/platform/system/core/+/c5c532fc312c9e5a2f2b8fecbfc535af4ffcd245/init/README.md

 

标签:Name,配置文件,笔记,json,抽象,profiles,cgroup,Cgroup,cpu
From: https://www.cnblogs.com/hellokitty2/p/16663669.html

相关文章

  • Python爬虫入门笔记
    一、requests请求库requests安装:pipinstallrequestsrequest使用3步骤①导入模块②发送get请求,获取响应:response=requests.get(url)③从响应中获取数据#1.导......
  • 【旧书,科研相关】 读书笔记
    在大多数之前的系统中,图像捕获和处理模块被分离为两个独立的部分,不存在交互。视觉芯片将两层集成的交互行为提高了速度(并行传输带宽增加,传输信息冗余减少),增加了局部光强自......
  • Linux学习笔记:mkdir创建文件夹
    Linux学习笔记:mkdir创建文件夹文件夹,即目录,在linux中使用mkdir创建。语法:mkdirdir_name通过mkdir命令可以实现在指定位置创建以dir_name(指定的文件名......
  • 【前端学习笔记】Vue 3.0 带来的变化
    主要变化更小的体积和更快的速度API设计的一致性增强Typescript支持开放更多底层APICompositionAPI(Vue2则是OptionsAPI)原先学过一点react,对rea......
  • zotero与obsidian笔记联动教程【转】
    主要参考链接https://blog.csdn.net/qq_43309940/article/details/125150487?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~C......
  • 关于nodejs的一些笔记
    node.js和JavaScript还是有一定的渊源的简单来说,Nodejs就是运行在服务端的JavaScript浏览器有一个引擎比如谷歌的chrome里的叫做V8这个引擎可以翻译JavaScript脚本,然......
  • ar9485 win10 笔记本电脑 无线网间歇性掉线
    问题 新安装了系统,刚开始上网正常,下载东西或者待机一段时间后掉线了。wifi都能搜到,就是连不上,重启电脑可以解决,但是每次重启很麻烦,必须找到治本的方法。排除问题1、......
  • 代码笔记24 windows+opencv4.5.5安装中出现的IPPICV: Download: ippicv_2020_win_inte
    1环境介绍:windows10,visualstudio2019,CMake,OPENCV4.5.5出现问题IPPICV:Download:ippicv_2020_win_intel64_20191018_general.zipTry1failedCMakeWarninga......
  • MySQL笔记(更新中)
    注意点:如果字段或者数据库或者表名和关键字重复可以使用``来规避关键字1、查看所有数据库>showdatabases;2、选择数据库>usedatabasedbName;3、创建数据库>......
  • 计算机网络学习笔记4(网络层)
    计算机网络学习笔记4(网络层)1.概述从发送端主机向接收端主机之间传输报文段在发送端要把报文段封装为数据包在接收端要传递报文段给运输层在每一个主机和路由......