106f6ba60Sopenharmony_ci/* 206f6ba60Sopenharmony_ci * Copyright (C) 2021 Huawei Device Co., Ltd. 306f6ba60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 406f6ba60Sopenharmony_ci * you may not use this file except in compliance with the License. 506f6ba60Sopenharmony_ci * You may obtain a copy of the License at 606f6ba60Sopenharmony_ci * 706f6ba60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 806f6ba60Sopenharmony_ci * 906f6ba60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1006f6ba60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1106f6ba60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1206f6ba60Sopenharmony_ci * See the License for the specific language governing permissions and 1306f6ba60Sopenharmony_ci * limitations under the License. 1406f6ba60Sopenharmony_ci */ 1506f6ba60Sopenharmony_ci 1606f6ba60Sopenharmony_ci#include "include/CPU.h" 1706f6ba60Sopenharmony_ci#include <sstream> 1806f6ba60Sopenharmony_ci#include <cstdio> 1906f6ba60Sopenharmony_ci#include <unistd.h> 2006f6ba60Sopenharmony_ci#include <cstring> 2106f6ba60Sopenharmony_ci#include <string> 2206f6ba60Sopenharmony_ci#include <iostream> 2306f6ba60Sopenharmony_ci#include <climits> 2406f6ba60Sopenharmony_ci#include "securec.h" 2506f6ba60Sopenharmony_ci#include "include/sp_utils.h" 2606f6ba60Sopenharmony_ci#include "cpu_collector.h" 2706f6ba60Sopenharmony_ci#include "collect_result.h" 2806f6ba60Sopenharmony_ci#include "include/startup_delay.h" 2906f6ba60Sopenharmony_ci#include "include/sp_log.h" 3006f6ba60Sopenharmony_ci 3106f6ba60Sopenharmony_ciusing namespace OHOS::HiviewDFX; 3206f6ba60Sopenharmony_ciusing namespace OHOS::HiviewDFX::UCollectUtil; 3306f6ba60Sopenharmony_ciusing namespace OHOS::HiviewDFX::UCollect; 3406f6ba60Sopenharmony_ci 3506f6ba60Sopenharmony_cinamespace OHOS { 3606f6ba60Sopenharmony_cinamespace SmartPerf { 3706f6ba60Sopenharmony_cistd::map<std::string, std::string> CPU::ItemData() 3806f6ba60Sopenharmony_ci{ 3906f6ba60Sopenharmony_ci std::map<std::string, std::string> result; 4006f6ba60Sopenharmony_ci std::vector<CpuFreqs> cpuFreqInfo = GetCpuFreq(); 4106f6ba60Sopenharmony_ci for (size_t i = 0; i < cpuFreqInfo.size(); i++) { 4206f6ba60Sopenharmony_ci std::string cpuFreqStr = std::to_string(cpuFreqInfo[i].curFreq); 4306f6ba60Sopenharmony_ci std::string cpuId = std::to_string(cpuFreqInfo[i].cpuId); 4406f6ba60Sopenharmony_ci result["cpu" + cpuId + "Frequency"] = cpuFreqStr; 4506f6ba60Sopenharmony_ci } 4606f6ba60Sopenharmony_ci std::vector<CpuUsageInfos> workLoads = GetCpuUsage(); 4706f6ba60Sopenharmony_ci const size_t oneHundred = 100; 4806f6ba60Sopenharmony_ci if (workLoads.empty()) { 4906f6ba60Sopenharmony_ci return result; 5006f6ba60Sopenharmony_ci } 5106f6ba60Sopenharmony_ci for (size_t i = 0; i < workLoads.size(); i++) { 5206f6ba60Sopenharmony_ci std::string cpuIdStr = workLoads[i].cpuId; 5306f6ba60Sopenharmony_ci std::string userUsageStr = std::to_string(workLoads[i].userUsage * oneHundred); 5406f6ba60Sopenharmony_ci std::string niceUsageStr = std::to_string(workLoads[i].niceUsage * oneHundred); 5506f6ba60Sopenharmony_ci std::string systemUsageStr = std::to_string(workLoads[i].systemUsage * oneHundred); 5606f6ba60Sopenharmony_ci std::string idleUsageStr = std::to_string(workLoads[i].idleUsage * oneHundred); 5706f6ba60Sopenharmony_ci std::string ioWaitUsageStr = std::to_string(workLoads[i].ioWaitUsage * oneHundred); 5806f6ba60Sopenharmony_ci std::string irqUsageStr = std::to_string(workLoads[i].irqUsage * oneHundred); 5906f6ba60Sopenharmony_ci std::string softIrqUsageStr = std::to_string(workLoads[i].softIrqUsage * oneHundred); 6006f6ba60Sopenharmony_ci std::string totalUsageStr = std::to_string((workLoads[i].userUsage + workLoads[i].niceUsage + 6106f6ba60Sopenharmony_ci workLoads[i].systemUsage + workLoads[i].ioWaitUsage + workLoads[i].irqUsage + workLoads[i].softIrqUsage) * 6206f6ba60Sopenharmony_ci oneHundred); 6306f6ba60Sopenharmony_ci if (cpuIdStr == cpustr) { 6406f6ba60Sopenharmony_ci cpuIdStr = totalcpu; 6506f6ba60Sopenharmony_ci } 6606f6ba60Sopenharmony_ci result[cpuIdStr + "userUsage"] = userUsageStr; 6706f6ba60Sopenharmony_ci result[cpuIdStr + "niceUsage"] = niceUsageStr; 6806f6ba60Sopenharmony_ci result[cpuIdStr + "systemUsage"] = systemUsageStr; 6906f6ba60Sopenharmony_ci result[cpuIdStr + "idleUsage"] = idleUsageStr; 7006f6ba60Sopenharmony_ci result[cpuIdStr + "ioWaitUsage"] = ioWaitUsageStr; 7106f6ba60Sopenharmony_ci result[cpuIdStr + "irqUsage"] = irqUsageStr; 7206f6ba60Sopenharmony_ci result[cpuIdStr + "softIrqUsage"] = softIrqUsageStr; 7306f6ba60Sopenharmony_ci result[cpuIdStr + "Usage"] = totalUsageStr; 7406f6ba60Sopenharmony_ci } 7506f6ba60Sopenharmony_ci if (!packageName.empty() && !hapFlag) { 7606f6ba60Sopenharmony_ci std::map<std::string, std::string> processCpuInfo = CPU::GetSysProcessCpuLoad(); 7706f6ba60Sopenharmony_ci if (!processCpuInfo.empty()) { 7806f6ba60Sopenharmony_ci for (auto it = processCpuInfo.begin(); it != processCpuInfo.end(); ++it) { 7906f6ba60Sopenharmony_ci result.insert(*it); 8006f6ba60Sopenharmony_ci } 8106f6ba60Sopenharmony_ci } 8206f6ba60Sopenharmony_ci } 8306f6ba60Sopenharmony_ci 8406f6ba60Sopenharmony_ci LOGI("CPU::ItemData map size(%u)", result.size()); 8506f6ba60Sopenharmony_ci return result; 8606f6ba60Sopenharmony_ci} 8706f6ba60Sopenharmony_ci 8806f6ba60Sopenharmony_civoid CPU::SetPackageName(const std::string &pName) 8906f6ba60Sopenharmony_ci{ 9006f6ba60Sopenharmony_ci packageName = pName; 9106f6ba60Sopenharmony_ci LOGI("CPU SetPackageName name(%s)", pName.c_str()); 9206f6ba60Sopenharmony_ci} 9306f6ba60Sopenharmony_ci 9406f6ba60Sopenharmony_civoid CPU::SetProcessId(const std::string &pid) 9506f6ba60Sopenharmony_ci{ 9606f6ba60Sopenharmony_ci processId = pid; 9706f6ba60Sopenharmony_ci} 9806f6ba60Sopenharmony_ci 9906f6ba60Sopenharmony_cistd::vector<CpuFreqs> CPU::GetCpuFreq() 10006f6ba60Sopenharmony_ci{ 10106f6ba60Sopenharmony_ci OHOS::SmartPerf::CpuFreqs cpuFreqs; 10206f6ba60Sopenharmony_ci std::vector<CpuFreqs> cpuFrequency; 10306f6ba60Sopenharmony_ci std::shared_ptr<CpuCollector> collector = CpuCollector::Create(); 10406f6ba60Sopenharmony_ci CollectResult<std::vector<CpuFreq>> result = collector->CollectCpuFrequency(); 10506f6ba60Sopenharmony_ci std::vector<CpuFreq> &cpufreq = result.data; 10606f6ba60Sopenharmony_ci for (size_t i = 0; i < cpufreq.size(); i++) { 10706f6ba60Sopenharmony_ci cpuFreqs.cpuId = cpufreq[i].cpuId; 10806f6ba60Sopenharmony_ci cpuFreqs.curFreq = cpufreq[i].curFreq; 10906f6ba60Sopenharmony_ci cpuFrequency.push_back(cpuFreqs); 11006f6ba60Sopenharmony_ci LOGI("cpuFreqs.cpuId: %s", std::to_string(cpufreq[i].cpuId).c_str()); 11106f6ba60Sopenharmony_ci LOGI("cpuFreqs.curFreq: %s", std::to_string(cpufreq[i].curFreq).c_str()); 11206f6ba60Sopenharmony_ci } 11306f6ba60Sopenharmony_ci return cpuFrequency; 11406f6ba60Sopenharmony_ci} 11506f6ba60Sopenharmony_ci 11606f6ba60Sopenharmony_cistd::vector<CpuUsageInfos> CPU::GetCpuUsage() 11706f6ba60Sopenharmony_ci{ 11806f6ba60Sopenharmony_ci OHOS::SmartPerf::CpuUsageInfos cpuUsageInfos; 11906f6ba60Sopenharmony_ci std::vector<CpuUsageInfos> workload; 12006f6ba60Sopenharmony_ci std::shared_ptr<CpuCollector> collector = CpuCollector::Create(); 12106f6ba60Sopenharmony_ci CollectResult<SysCpuUsage> result = collector->CollectSysCpuUsage(true); 12206f6ba60Sopenharmony_ci SysCpuUsage &sysCpuUsage = result.data; 12306f6ba60Sopenharmony_ci if (sysCpuUsage.cpuInfos.empty()) { 12406f6ba60Sopenharmony_ci return workload; 12506f6ba60Sopenharmony_ci } 12606f6ba60Sopenharmony_ci for (auto &cpuInfo : sysCpuUsage.cpuInfos) { 12706f6ba60Sopenharmony_ci cpuUsageInfos.cpuId = cpuInfo.cpuId; 12806f6ba60Sopenharmony_ci cpuUsageInfos.userUsage = cpuInfo.userUsage; 12906f6ba60Sopenharmony_ci cpuUsageInfos.niceUsage = cpuInfo.niceUsage; 13006f6ba60Sopenharmony_ci cpuUsageInfos.systemUsage = cpuInfo.systemUsage; 13106f6ba60Sopenharmony_ci cpuUsageInfos.idleUsage = cpuInfo.idleUsage; 13206f6ba60Sopenharmony_ci cpuUsageInfos.ioWaitUsage = cpuInfo.ioWaitUsage; 13306f6ba60Sopenharmony_ci cpuUsageInfos.irqUsage = cpuInfo.irqUsage; 13406f6ba60Sopenharmony_ci cpuUsageInfos.softIrqUsage = cpuInfo.softIrqUsage; 13506f6ba60Sopenharmony_ci workload.push_back(cpuUsageInfos); 13606f6ba60Sopenharmony_ci LOGI("UsageCpuId: %s", cpuInfo.cpuId.c_str()); 13706f6ba60Sopenharmony_ci LOGI("userUsage: %s", std::to_string(cpuInfo.userUsage).c_str()); 13806f6ba60Sopenharmony_ci LOGI("niceUsage: %s", std::to_string(cpuInfo.niceUsage).c_str()); 13906f6ba60Sopenharmony_ci LOGI("systemUsage: %s", std::to_string(cpuInfo.systemUsage).c_str()); 14006f6ba60Sopenharmony_ci LOGI("idleUsage: %s", std::to_string(cpuInfo.idleUsage).c_str()); 14106f6ba60Sopenharmony_ci LOGI("ioWaitUsage: %s", std::to_string(cpuInfo.ioWaitUsage).c_str()); 14206f6ba60Sopenharmony_ci LOGI("irqUsage: %s", std::to_string(cpuInfo.irqUsage).c_str()); 14306f6ba60Sopenharmony_ci LOGI("softIrqUsage: %s", std::to_string(cpuInfo.softIrqUsage).c_str()); 14406f6ba60Sopenharmony_ci } 14506f6ba60Sopenharmony_ci return workload; 14606f6ba60Sopenharmony_ci} 14706f6ba60Sopenharmony_ci 14806f6ba60Sopenharmony_cistd::map<std::string, std::string> CPU::GetSysProcessCpuLoad() const 14906f6ba60Sopenharmony_ci{ 15006f6ba60Sopenharmony_ci std::map<std::string, std::string> processCpuInfo; 15106f6ba60Sopenharmony_ci const size_t oneHundred = 100; 15206f6ba60Sopenharmony_ci if (!processId.empty()) { 15306f6ba60Sopenharmony_ci int32_t procId = 0; 15406f6ba60Sopenharmony_ci procId = std::stoi(processId); 15506f6ba60Sopenharmony_ci std::shared_ptr<CpuCollector> collector = CpuCollector::Create(); 15606f6ba60Sopenharmony_ci auto collectResult = collector->CollectProcessCpuStatInfo(procId, true); 15706f6ba60Sopenharmony_ci auto data = collectResult.data; 15806f6ba60Sopenharmony_ci processCpuInfo["ProcId"] = std::to_string(data.pid); 15906f6ba60Sopenharmony_ci processCpuInfo["ProcAppName"] = data.procName; 16006f6ba60Sopenharmony_ci processCpuInfo["ProcCpuLoad"] = std::to_string(data.cpuLoad * oneHundred); 16106f6ba60Sopenharmony_ci processCpuInfo["ProcCpuUsage"] = std::to_string(data.cpuUsage * oneHundred); 16206f6ba60Sopenharmony_ci processCpuInfo["ProcUCpuUsage"] = std::to_string(data.uCpuUsage * oneHundred); 16306f6ba60Sopenharmony_ci processCpuInfo["ProcSCpuUsage"] = std::to_string(data.sCpuUsage * oneHundred); 16406f6ba60Sopenharmony_ci LOGI("ProcId: %s", std::to_string(data.pid).c_str()); 16506f6ba60Sopenharmony_ci LOGI("ProcAppName: %s", data.procName.c_str()); 16606f6ba60Sopenharmony_ci LOGI("ProcCpuLoad: %s", std::to_string(data.cpuLoad).c_str()); 16706f6ba60Sopenharmony_ci LOGI("ProcCpuUsage: %s", std::to_string(data.cpuUsage).c_str()); 16806f6ba60Sopenharmony_ci LOGI("ProcUCpuUsage: %s", std::to_string(data.uCpuUsage).c_str()); 16906f6ba60Sopenharmony_ci LOGI("ProcSCpuUsage: %s", std::to_string(data.sCpuUsage).c_str()); 17006f6ba60Sopenharmony_ci } else { 17106f6ba60Sopenharmony_ci processCpuInfo["ProcId"] = "NA"; 17206f6ba60Sopenharmony_ci processCpuInfo["ProcAppName"] = packageName; 17306f6ba60Sopenharmony_ci processCpuInfo["ProcCpuLoad"] = "NA"; 17406f6ba60Sopenharmony_ci processCpuInfo["ProcCpuUsage"] = "NA"; 17506f6ba60Sopenharmony_ci processCpuInfo["ProcUCpuUsage"] = "NA"; 17606f6ba60Sopenharmony_ci processCpuInfo["ProcSCpuUsage"] = "NA"; 17706f6ba60Sopenharmony_ci } 17806f6ba60Sopenharmony_ci if (processCpuInfo.find("ProcAppName") != processCpuInfo.end() && processCpuInfo["ProcAppName"].empty()) { 17906f6ba60Sopenharmony_ci processCpuInfo["ProcId"] = "0"; 18006f6ba60Sopenharmony_ci processCpuInfo["ProcAppName"] = packageName; 18106f6ba60Sopenharmony_ci processCpuInfo["ProcCpuLoad"] = "0"; 18206f6ba60Sopenharmony_ci processCpuInfo["ProcCpuUsage"] = "0"; 18306f6ba60Sopenharmony_ci processCpuInfo["ProcUCpuUsage"] = "0"; 18406f6ba60Sopenharmony_ci processCpuInfo["ProcSCpuUsage"] = "0"; 18506f6ba60Sopenharmony_ci } 18606f6ba60Sopenharmony_ci return processCpuInfo; 18706f6ba60Sopenharmony_ci} 18806f6ba60Sopenharmony_civoid CPU::IsFindHap() 18906f6ba60Sopenharmony_ci{ 19006f6ba60Sopenharmony_ci hapFlag = true; 19106f6ba60Sopenharmony_ci} 19206f6ba60Sopenharmony_ci} 19306f6ba60Sopenharmony_ci} 194