一、关键字:

CPU;资源调度;统一调频;卡顿; socperf

二、问题描述

设备型号:黄鹂

系统版本:OpenHarmony 5.0

代码版本:OpenHarmony-5.0

问题现象:应用冷启动,资源调度统一调频失效,cpu大中小核没有持续锁定高频点运行。

三、原因分析

3.1 正常机制

应用冷启动阶段,cpu大中小核持续锁定高频点运行。

3.2 异常机制

应用冷启动,资源调度统一调频失效,cpu大中小核没有持续锁定高频点运行。

img

3.2.1分析trace,发现资源调度子系统有下发应用冷启动场景(cmdID:10000)限频,统一调频插件有执行PerfRequest。

    <cmd id="10000" name="app_start">
        <Action>
            <duration>1000</duration>
            <lit_cpu0_min_freq>2002000</lit_cpu0_min_freq>
            <lit_cpu4_min_freq>2210000</lit_cpu4_min_freq>
            <lit_cpu7_min_freq>2548000</lit_cpu7_min_freq>
        </Action>
        <Action>
            <duration>1500</duration>
            <gpu_min_freq>384000000</gpu_min_freq>
        </Action>
    </cmd>

img

3.2.2 通过log分析代码,发现在写调频节点时,定制函数判断拦截提前,导致通用写节点方法没有执行ReportToRssExe。

void SocPerfThreadWrap::SendResStatusToPerfSo()
{
    SOC_PERF_LOGI("lly SendResStatusToPerfSo");
    if (!socPerfConfig_.reportFunc_) {
        return;
    }
    std::vector<int32_t> qosId;
    std::vector<int64_t> value;
    std::vector<int64_t> endTime;
    std::vector<int32_t> qosIdToRssEx;
    std::vector<int64_t> valueToRssEx;
    std::vector<int64_t> endTimeToRssEx;
    for (auto iter = resStatusInfo_.begin(); iter != resStatusInfo_.end(); ++iter) {
        int32_t resId = iter->first;
        std::shared_ptr<ResStatus> resStatus = iter->second;
        if (socPerfConfig_.resourceNodeInfo_.find(resId) != socPerfConfig_.resourceNodeInfo_.end() &&
            (resStatus->previousValue != resStatus->currentValue ||
            resStatus->previousEndTime != resStatus->currentEndTime)) {
                SOC_PERF_LOGI("lly qosId:%{public}d value:%{public}ld endTime:%{public}ld", resId, resStatus->currentValue, resStatus->currentEndTime);
            if (socPerfConfig_.resourceNodeInfo_[resId]->persistMode == REPORT_TO_PERFSO) 
                 ...
        }
    }
    
    SOC_PERF_LOGI("lly ReportToPerfSo");
    ReportToPerfSo(qosId, value, endTime);
    SOC_PERF_LOGI("ReportToRssExe ");
    ReportToRssExe(qosIdToRssEx, valueToRssEx, endTimeToRssEx);
}

四、方案优化

把定制socPerfConfig_.reportFunc_函数判断,移到定制SO执行函数前面,保证通用方案可以正常执行。
https://gitee.com/openharmony/resourceschedule_soc_perf/pulls/103

img

修改后应用冷启动统一调频可以正常调频

img

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐