1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _CPU_USAGE_H_
18 #define _CPU_USAGE_H_
19 
20 #include <statstype.h>
21 
22 #define CPU_USAGE_BUFFER_SIZE (6 * 30)
23 #define TOP_PROCESS_COUNT (5)
24 #define CPU_USAGE_PROFILE_THRESHOLD (50)
25 
26 #define PROCPROF_THRESHOLD "cpu.procprof.threshold"
27 #define CPU_DISABLED "cpu.disabled"
28 #define CPU_DEBUG "cpu.debug"
29 #define CPU_TOPCOUNT "cpu.topcount"
30 
31 namespace android {
32 namespace pixel {
33 namespace perfstatsd {
34 
35 struct CpuData {
36     uint64_t cpuUsage;
37     uint64_t cpuTime;
38     uint64_t userUsage;
39     uint64_t sysUsage;
40     uint64_t ioUsage;
41 };
42 
43 struct ProcData {
44     uint32_t pid;
45     std::string name;
46     float usageRatio;
47     uint64_t usage;
48     uint64_t user;
49     uint64_t system;
50 };
51 
52 class CpuUsage : public StatsType {
53   public:
54     CpuUsage(void);
55     void refresh(void);
56     void setOptions(const std::string &key, const std::string &value);
57 
58   private:
59     std::chrono::system_clock::time_point mLast;
60     uint32_t mCores;  // cpu core num
61     uint32_t mProfileThreshold;
62     uint32_t mTopcount;
63     bool mDisabled;
64     bool mProfileProcess;
65     CpuData mPrevUsage;                                    // cpu usage of last record
66     std::vector<CpuData> mPrevCoresUsage;                  // cpu usage per core of last record
67     std::unordered_map<uint32_t, ProcData> mPrevProcdata;  // <pid, last_usage>
68     uint64_t mDiffCpu;
69     float mTotalRatio;
70     void getOverallUsage(std::chrono::system_clock::time_point &, std::string *);
71     void profileProcess(std::string *);
72 };
73 
74 struct ProcdataCompare {
75     // sort process by usage percentage in descending order
operatorProcdataCompare76     bool operator()(const ProcData &a, const ProcData &b) const {
77         return a.usageRatio < b.usageRatio;
78     }
79 };
80 
81 }  // namespace perfstatsd
82 }  // namespace pixel
83 }  // namespace android
84 
85 #endif /*  _CPU_USAGE_H_ */
86