[Android Q][cgroup][blkio]关于blkio分组bg在Android Q上失效的分析

新项目,Android Q,按照之前的惯例,在配置blkio的前后台weight比例。

今天在验证效果时发现,/bg分组下的tasks为空——即表示没有任何task被移入此组。

第一反应是cgroup的blkio没有生效,但是在ls -al /dev/blkio查看后发现,存在一个我并没有创建的目录(分组):/dev/blkio/background:

XXX:/ $ ls -al dev/blkio/                                                                                                                                                                                 
total 0
drwxr-xr-x  3 root   system    0 2019-09-29 10:31 .
drwxr-xr-x 21 root   root   4640 2019-09-29 10:31 ..
drwxr-xr-x  2 system system    0 2019-09-29 10:31 background
drwxr-xr-x  2 system system    0 2019-09-29 10:31 bg
-rw-r--r--  1 root   root      0 2019-09-29 10:31 blkio.group_idle
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_merged
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_merged_recursive
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_queued
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_queued_recursive
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_service_bytes
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_service_bytes_recursive
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_service_time
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_service_time_recursive
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_serviced
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_serviced_recursive
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_wait_time
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.io_wait_time_recursive
-rw-r--r--  1 root   root      0 2019-09-29 11:27 blkio.leaf_weight
-rw-r--r--  1 root   root      0 2019-09-29 11:27 blkio.leaf_weight_device
--w-------  1 root   root      0 2019-09-29 11:27 blkio.reset_stats
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.sectors
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.sectors_recursive
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.time
-r--r--r--  1 root   root      0 2019-09-29 11:27 blkio.time_recursive
-rw-r--r--  1 root   system    0 2019-09-29 10:31 blkio.weight
-rw-r--r--  1 root   root      0 2019-09-29 11:27 blkio.weight_device
-rw-r--r--  1 root   root      0 2019-09-29 11:27 cgroup.clone_children
-rw-r--r--  1 root   root      0 2019-09-29 11:27 cgroup.procs
-r--r--r--  1 root   root      0 2019-09-29 11:27 cgroup.sane_behavior
-rw-r--r--  1 root   root      0 2019-09-29 11:27 notify_on_release
-rw-r--r--  1 root   root      0 2019-09-29 11:27 release_agent
-rw-rw-r--  1 root   system    0 2019-09-29 10:31 tasks

查看background分组中的tasks发现有大量task号,且在动态变动:

XXX:/ $ cat dev/blkio/background/tasks | wc -l                                                                                                                                                                
339
XXX:/ $ cat dev/blkio/background/tasks | wc -l                                                                                                                                                                
315

基本确定Android Q上的AMS与LMKD在修改进程优先级时控制前后台blkio.weight的分组已经从以前的/与/bg,变更为了/与/background。

为了进一步确认这一点,开始跟代码。

发现sched_policy.cpp中的set_cpuset_policy函数实现变化较大:

int set_cpuset_policy(int tid, SchedPolicy policy) {
    if (tid == 0) {
        tid = GetThreadId();
    }
    policy = _policy(policy);

    switch (policy) {
        case SP_BACKGROUND:
            return SetTaskProfiles(tid,
                                   {"HighEnergySaving", "ProcessCapacityLow", "LowIoPriority",
                                    "TimerSlackHigh"},
                                   true)
                           ? 0
                           : -1;
        case SP_FOREGROUND:
        case SP_AUDIO_APP:
        case SP_AUDIO_SYS:
            return SetTaskProfiles(tid,
                                   {"HighPerformance", "ProcessCapacityHigh", "HighIoPriority",
                                    "TimerSlackNormal"},
                                   true)
                           ? 0
                           : -1;
        case SP_TOP_APP:
            return SetTaskProfiles(tid,
                                   {"MaxPerformance", "ProcessCapacityMax", "MaxIoPriority",
                                    "TimerSlackNormal"},
                                   true)
                           ? 0
                           : -1;
        case SP_SYSTEM:
            return SetTaskProfiles(tid, {"ServiceCapacityLow", "TimerSlackNormal"}, true) ? 0 : -1;
        case SP_RESTRICTED:
            return SetTaskProfiles(tid, {"ServiceCapacityRestricted", "TimerSlackNormal"}, true)
                           ? 0
                           : -1;
        default:
            break;
    }

    return 0;
}

SetTaskProfiles为配置文件,具体定义在system/core/libprocessgroup/profiles/task_profiles.json,比如LowIoPriority定义则为:

    {
      "Name": "LowIoPriority",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "blkio",
            "Path": "background"
          }
        }
      ]
    },

此处真相大白。

发布了15 篇原创文章 · 获赞 14 · 访问量 9422

猜你喜欢

转载自blog.csdn.net/u014175785/article/details/101680897