[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"
          }
        }
      ]
    },

此處真相大白。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章