之前遇到一個耗電問題,最后發現是/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