Android12 中的 cgroup

系统开机配置

开机进行cgroup的配置

在 init 阶段进行相关子系统的初始化

on init
    mkdir /dev/stune/foreground
    mkdir /dev/stune/background
    mkdir /dev/stune/top-app
    mkdir /dev/stune/rt
    ............................

可以通过查看当前系统支持哪些subsystem

# cat /proc/cgroups                                     
#subsys_name    hierarchy       num_cgroups     enabled
cpuset          3               7               1
cpu             2               10              1
cpuacct         0               116             1
schedtune       5               6               1
blkio           1               2               1
memory          4               159             1
freezer         0               116             1

通过命令可以查看具体的挂载目录

# mount | grep cgroup
none on /dev/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
none on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
none on /dev/cpuctl type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)
none on /dev/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset,noprefix,release_agent=/sbin/cpuset_release_agent)
none on /dev/memcg type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
none on /dev/stune type cgroup (rw,nosuid,nodev,noexec,relatime,schedtune)
  1. processgroup 在 init secondstate 的 SetupCgroupAction 时进行初始化

应用通过解析cgroups.jsontask_profiles.json两类文件可以让上层控制应用知道怎样控制kernel的配置

cgroups.json 文件解析

可以发现,cgroups.json文件中Cgroups下的子节点与mount | grep cgroup命令下的挂载点一一对应

"Cgroups": [
    {
      "Controller": "blkio",
      "Path": "/dev/blkio",
      "Mode": "0755",
      "UID": "system",
      "GID": "system"
    },
    {
      "Controller": "cpu",
      "Path": "/dev/cpuctl",
      "Mode": "0755",
      "UID": "system",
      "GID": "system"
    },
    {
      "Controller": "cpuset",
      "Path": "/dev/cpuset",
      "Mode": "0755",
      "UID": "system",
      "GID": "system"
    },
    {
      "Controller": "memory",
      "Path": "/dev/memcg",
      "Mode": "0700",
      "UID": "root",
      "GID": "system",
      "Optional": true
    },
    {
      "Controller": "schedtune",
      "Path": "/dev/stune",
      "Mode": "0755",
      "UID": "system",
      "GID": "system",
      "Optional": true
    }
  ],

task_profiles.json 文件解析

  1. Attributes类型数据
{
   "Name": "LowCapacityCPUs",
   "Controller": "cpuset",
   "File": "background/cpus"
}

Name: 表示当前类型的名称

Controller:表示使用的子系统,与Cgroups中的Controller对应

File:表示需要进行操作的文件或目录

  1. Profiles类型数据
{
  "Name": "HighEnergySaving",
  "Actions": [
    {
      "Name": "JoinCgroup",
      "Params":
      {
        "Controller": "cpu",
        "Path": "background"
      }
    }
  ]
},
{
  "Name": "Frozen",
  "Actions": [
    {
      "Name": "SetAttribute",
      "Params":
      {
        "Name": "FreezerState",
        "Value": "1"
      }
    }
  ]
},

Name: 表示当前类型的名称

Actions:表示需要进行的操作

Actions.Name:表示进行操作的类型。JoinCgroup:将进程移动到指定的目录下;SetAttribute:设置进程目录下文件值

Actions.Params:表示配置Actions进行操作的参数

  1. AggregateProfiles类型数据
{
  "Name": "SCHED_SP_BACKGROUND",
  "Profiles": [ "HighEnergySaving", "LowIoPriority", "TimerSlackHigh" ]
}

Name: 表示当前类型的名称

Profiles:表示对应进行的Profiles操作,与Profiles.Name对应

冻结某个进程

获取到具体进程的 id 号

使用命令ps -A查找到需要修改进程的uid

# ps -A
u0_a29        1517   257 1071104 123368 ep_poll             0 S com.android.calculator2

获取进程的cgroup信息

# cat /proc/1517/cgroup                                              
5:schedtune:/top-app
4:memory:/apps/uid_10029/pid_1517
3:cpuset:/top-app
2:cpu:/
1:blkio:/
0::/uid_10029/pid_1517

通过最后一行可知,当前进程的cgroup设置,在/sys/fs/cgroup/uid_10029/pid_1517/目录下

冻结和解冻指定的进程

echo 1 > /sys/fs/cgroup/uid_10029/pid_1517/cgroup.freeze

当前应用已经被冻结,并且点击鼠标没有反应。使用下面命令解冻

echo 0 > /sys/fs/cgroup/uid_10029/pid_1517/cgroup.freeze

将某个进程设置为 background

获取到具体进程的 id 号

使用命令ps -A查找到需要修改进程的uid

# ps -A
u0_a29        3946   257 1072152 100800 ep_poll             0 S com.android.calculator2

将当前进程添加到 background 中

echo 3946 > /dev/cpuctl/background/tasks

降低 background 的 cpu 占比

echo 512 /dev/cpuctl/background/cpu.shares
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值