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)
- processgroup 在 init secondstate 的 SetupCgroupAction 时进行初始化
应用通过解析cgroups.json
和task_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
文件解析
Attributes
类型数据
{
"Name": "LowCapacityCPUs",
"Controller": "cpuset",
"File": "background/cpus"
}
Name
: 表示当前类型的名称
Controller
:表示使用的子系统,与Cgroups
中的Controller
对应
File
:表示需要进行操作的文件或目录
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
进行操作的参数
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