Sched_Boost總結


之前遇到一個耗電問題,最后發現是/proc/sys/kernel/sched_boost節點設置異常,一直處於boost狀態。導致所有場景功耗上升。

現在總結一下sched_boost的相關知識。

Sched_Boost

sched_boost主要是通過影響Task placement的方式,來進行boost。它屬於QTI EAS中的一部分。

默認task placement policy

計算每個cpu的負載,並將task分配到負載最輕的cpu上。如果有多個cpu的負載相同(一般是都處於idle),那么就會把task分配到系統中capacity最大的cpu上。

設置sched_boost

通過設置節點:/proc/sys/kernel/sched_boost 或者內核調用 sched_set_boost()函數,可以進行sched_boost,並且在分配任務時,忽略對energy的消耗。

boost一旦設置之后,就必須顯示寫0來關閉。同時也支持個應用同時調用設置,設置會選擇boost等級最高的生效; 而當所有應用都都關閉boost時,boost才會真正失效。

boost等級

sched_boost一共有4個等級,除了0代表關閉boost以外,其他3個等級靈活地控制功耗和性能的不同傾向程度。

相關代碼實現

static struct ctl_table kern_table[] = { //kernel/sysctl.c
    ......
    {
        .procname    = "sched_boost",
        .data        = &sysctl_sched_boost,
        .maxlen        = sizeof(unsigned int),
        .mode        = 0644,
        .proc_handler    = sched_boost_handler, //kernel/sched/boost.c
        .extra1         = &zero,
        .extra2        = &three,
    },
    ......
};

在通過節點設置,會調用sched_boost_handler,sched_boost_handler中經過verify之后,調用_sched_set_boost來設置boost。

static void _sched_set_boost(int old_val, int type)
{
    switch (type) {
    case NO_BOOST: /*0*/
        if (old_val == FULL_THROTTLE_BOOST) /*1*/
            core_ctl_set_boost(false);
        else if (old_val == CONSERVATIVE_BOOST) /*2*/
            restore_cgroup_boost_settings();
        else
            update_freq_aggregate_threshold(freq_aggr_threshold_backup);
        break;

    case FULL_THROTTLE_BOOST:  /*1*/
        core_ctl_set_boost(true);
        boost_kick_cpus();
        break;

    case CONSERVATIVE_BOOST:  /*2*/
        update_cgroup_boost_settings();
        boost_kick_cpus();
        break;

    case RESTRAINED_BOOST:  /*3*/
        freq_aggr_threshold_backup = update_freq_aggregate_threshold(1);
        break;

    default:
        WARN_ON(1);
        return;
    }

    set_boost_policy(type);
    sysctl_sched_boost = type;
    trace_sched_set_boost(type);
}

設置boost policy

在最后一步中,設置policy來體現task是否需要進行up migrate。如下是sched_boost不同等級對應的up migrate遷移策略。

Full throttle和Conservative:SCHED_BOOST_ON_BIG ---在進行task placement時,僅考慮capacity最大的cpu core
無:SCHED_BOOST_ON_ALL ---在進行task placement時,僅不考慮capacity最小的cpu core
No Boost和Restrained:SCHED_BOOST_NONE---正常EAS

static void set_boost_policy(int type)
{
    if (type == SCHED_BOOST_NONE || type == RESTRAINED_BOOST) { //conservative(保守的)和full throttle(全油門)模式才會進行向上遷移
        boost_policy = SCHED_BOOST_NONE;
        return;
    }

    if (boost_policy_dt) {
        boost_policy = boost_policy_dt;
        return;
    }

    if (min_possible_efficiency != max_possible_efficiency) { //左邊是cpu中efficiency最小值,右邊為最大值。big.LITTLE架構應該恆成立
        boost_policy = SCHED_BOOST_ON_BIG;
        return;
    }

    boost_policy = SCHED_BOOST_ON_ALL;
}

 

總結各個boost的效果

Full throttle:

1、通過core control,將所有cpu都進行unisolation
2、通過freq聚合,將load計算放大。從而觸發提升freq,或者遷移等
3、通過設置boost policy= SCHED_BOOST_ON_BIG,遷移挑選target cpu時,只會選擇大核

最終效果應該盡可能把任務都放在大核運行(除了cpuset中有限制)

Conservative:

1、通過更新group boost配置,僅讓top-app和foreground組進行task placement boost
2、提高min_task_util的門限,讓進行up migrate的條件更苛刻。只有load較大(>1ms)的task,會進行up migrate。
3、同上,更改min_task_util門限后,會提醒系統task與cpu是misfit,需要進行遷移。
4、通過設置boost policy= SCHED_BOOST_ON_BIG,遷移挑選target cpu時,只會選擇大核

最終效果:top-app和foreground的一些task會遷移到大核運行

Restrained:

1、通過freq聚合,將load計算放大。從而觸發提升freq,或者遷移等

load放大后,仍遵循基本EAS。提升freq或者遷移,視情況而定。

 

 

參考:
https://www.cnblogs.com/lingjiajun/p/12583220.html

https://www.cnblogs.com/lingjiajun/p/12317090.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM