xref: /aosp_15_r20/frameworks/av/services/mediaresourcemanager/ResourceManagerMetrics.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker **
3*ec779b8eSAndroid Build Coastguard Worker ** Copyright 2023, The Android Open Source Project
4*ec779b8eSAndroid Build Coastguard Worker **
5*ec779b8eSAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*ec779b8eSAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*ec779b8eSAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*ec779b8eSAndroid Build Coastguard Worker **
9*ec779b8eSAndroid Build Coastguard Worker **     http://www.apache.org/licenses/LICENSE-2.0
10*ec779b8eSAndroid Build Coastguard Worker **
11*ec779b8eSAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*ec779b8eSAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*ec779b8eSAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*ec779b8eSAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*ec779b8eSAndroid Build Coastguard Worker ** limitations under the License.
16*ec779b8eSAndroid Build Coastguard Worker */
17*ec779b8eSAndroid Build Coastguard Worker 
18*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_MEDIA_RESOURCEMANAGERMETRICS_H_
19*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_MEDIA_RESOURCEMANAGERMETRICS_H_
20*ec779b8eSAndroid Build Coastguard Worker 
21*ec779b8eSAndroid Build Coastguard Worker #include "ResourceManagerService.h"
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker namespace android {
24*ec779b8eSAndroid Build Coastguard Worker 
25*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::ClientInfoParcel;
26*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::ClientConfigParcel;
27*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::media::IResourceManagerClient;
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker struct ProcessInfoInterface;
30*ec779b8eSAndroid Build Coastguard Worker 
31*ec779b8eSAndroid Build Coastguard Worker class UidObserver;
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker //
34*ec779b8eSAndroid Build Coastguard Worker // Enumeration for Codec bucket based on:
35*ec779b8eSAndroid Build Coastguard Worker //   - Encoder or Decoder
36*ec779b8eSAndroid Build Coastguard Worker //   - hardware implementation or not
37*ec779b8eSAndroid Build Coastguard Worker //   - Audio/Video/Image codec
38*ec779b8eSAndroid Build Coastguard Worker //
39*ec779b8eSAndroid Build Coastguard Worker enum CodecBucket {
40*ec779b8eSAndroid Build Coastguard Worker     CodecBucketUnspecified = 0,
41*ec779b8eSAndroid Build Coastguard Worker     HwAudioEncoder = 1,
42*ec779b8eSAndroid Build Coastguard Worker     HwAudioDecoder = 2,
43*ec779b8eSAndroid Build Coastguard Worker     HwVideoEncoder = 3,
44*ec779b8eSAndroid Build Coastguard Worker     HwVideoDecoder = 4,
45*ec779b8eSAndroid Build Coastguard Worker     HwImageEncoder = 5,
46*ec779b8eSAndroid Build Coastguard Worker     HwImageDecoder = 6,
47*ec779b8eSAndroid Build Coastguard Worker     SwAudioEncoder = 7,
48*ec779b8eSAndroid Build Coastguard Worker     SwAudioDecoder = 8,
49*ec779b8eSAndroid Build Coastguard Worker     SwVideoEncoder = 9,
50*ec779b8eSAndroid Build Coastguard Worker     SwVideoDecoder = 10,
51*ec779b8eSAndroid Build Coastguard Worker     SwImageEncoder = 11,
52*ec779b8eSAndroid Build Coastguard Worker     SwImageDecoder = 12,
53*ec779b8eSAndroid Build Coastguard Worker     CodecBucketMaxSize = 13,
54*ec779b8eSAndroid Build Coastguard Worker };
55*ec779b8eSAndroid Build Coastguard Worker 
56*ec779b8eSAndroid Build Coastguard Worker // Map of client id and client configuration, when it was started last.
57*ec779b8eSAndroid Build Coastguard Worker typedef std::map<int64_t, ClientConfigParcel> ClientConfigMap;
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker // Map of pid and the uid.
60*ec779b8eSAndroid Build Coastguard Worker typedef std::map<int32_t, uid_t> PidUidMap;
61*ec779b8eSAndroid Build Coastguard Worker 
62*ec779b8eSAndroid Build Coastguard Worker // Map of concurrent codes by Codec type bucket.
63*ec779b8eSAndroid Build Coastguard Worker struct ConcurrentCodecsMap {
64*ec779b8eSAndroid Build Coastguard Worker     int& operator[](CodecBucket index) {
65*ec779b8eSAndroid Build Coastguard Worker         return mCodec[index];
66*ec779b8eSAndroid Build Coastguard Worker     }
67*ec779b8eSAndroid Build Coastguard Worker 
68*ec779b8eSAndroid Build Coastguard Worker     const int& operator[](CodecBucket index) const {
69*ec779b8eSAndroid Build Coastguard Worker         return mCodec[index];
70*ec779b8eSAndroid Build Coastguard Worker     }
71*ec779b8eSAndroid Build Coastguard Worker 
72*ec779b8eSAndroid Build Coastguard Worker private:
73*ec779b8eSAndroid Build Coastguard Worker     int mCodec[CodecBucketMaxSize] = {0};
74*ec779b8eSAndroid Build Coastguard Worker };
75*ec779b8eSAndroid Build Coastguard Worker 
76*ec779b8eSAndroid Build Coastguard Worker // Current and Peak ConcurrentCodecMap for a process.
77*ec779b8eSAndroid Build Coastguard Worker struct ConcurrentCodecs {
78*ec779b8eSAndroid Build Coastguard Worker     ConcurrentCodecsMap mCurrent;
79*ec779b8eSAndroid Build Coastguard Worker     ConcurrentCodecsMap mPeak;
80*ec779b8eSAndroid Build Coastguard Worker     // concurrent HW Video codecs.
81*ec779b8eSAndroid Build Coastguard Worker     int mHWVideoCodecs;
82*ec779b8eSAndroid Build Coastguard Worker     // concurrent SW Video codecs.
83*ec779b8eSAndroid Build Coastguard Worker     int mSWVideoCodecs;
84*ec779b8eSAndroid Build Coastguard Worker     // concurrent Video codecs.
85*ec779b8eSAndroid Build Coastguard Worker     int mVideoCodecs;
86*ec779b8eSAndroid Build Coastguard Worker     // concurrent Audio codecs.
87*ec779b8eSAndroid Build Coastguard Worker     int mAudioCodecs;
88*ec779b8eSAndroid Build Coastguard Worker     // concurrent Image codecs.
89*ec779b8eSAndroid Build Coastguard Worker     int mImageCodecs;
90*ec779b8eSAndroid Build Coastguard Worker };
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker // Current and Peak pixel count for a process.
93*ec779b8eSAndroid Build Coastguard Worker struct PixelCount {
94*ec779b8eSAndroid Build Coastguard Worker     long mCurrent = 0;
95*ec779b8eSAndroid Build Coastguard Worker     long mPeak = 0;
96*ec779b8eSAndroid Build Coastguard Worker };
97*ec779b8eSAndroid Build Coastguard Worker 
98*ec779b8eSAndroid Build Coastguard Worker //
99*ec779b8eSAndroid Build Coastguard Worker //  Resource Manager Metrics is designed to answer some of the questions like:
100*ec779b8eSAndroid Build Coastguard Worker //    - What apps are causing reclaim and what apps are targeted (reclaimed from) in the process?
101*ec779b8eSAndroid Build Coastguard Worker //    - which apps use the most codecs and the most codec memory?
102*ec779b8eSAndroid Build Coastguard Worker //    - What is the % of total successful reclaims?
103*ec779b8eSAndroid Build Coastguard Worker //
104*ec779b8eSAndroid Build Coastguard Worker //  Though, it's not in the context of this class, metrics should also answer:
105*ec779b8eSAndroid Build Coastguard Worker //    - what % of codec errors are due to codec being reclaimed?
106*ec779b8eSAndroid Build Coastguard Worker //    - What % of successful codec creation(start) requires codec reclaims?
107*ec779b8eSAndroid Build Coastguard Worker //    - How often codec start fails even after successful reclaim?
108*ec779b8eSAndroid Build Coastguard Worker //
109*ec779b8eSAndroid Build Coastguard Worker //  The metrics are collected to analyze and understand the codec resource usage
110*ec779b8eSAndroid Build Coastguard Worker //  and use that information to help with:
111*ec779b8eSAndroid Build Coastguard Worker //    - minimize the no of reclaims
112*ec779b8eSAndroid Build Coastguard Worker //    - reduce the codec start delays by minimizing no of times we try to reclaim
113*ec779b8eSAndroid Build Coastguard Worker //    - minimize the reclaim errors in codec records
114*ec779b8eSAndroid Build Coastguard Worker //
115*ec779b8eSAndroid Build Coastguard Worker //  Success metrics for Resource Manager Service could be defined as:
116*ec779b8eSAndroid Build Coastguard Worker //   - increase in sucecssful codec creation for the foreground apps
117*ec779b8eSAndroid Build Coastguard Worker //   - reduce the number of reclaims for codecs
118*ec779b8eSAndroid Build Coastguard Worker //   - reduce the time to create codec
119*ec779b8eSAndroid Build Coastguard Worker //
120*ec779b8eSAndroid Build Coastguard Worker //  We would like to use this data to come up with a better resource management that would:
121*ec779b8eSAndroid Build Coastguard Worker //   - increase the successful codec creation (for all kind of apps)
122*ec779b8eSAndroid Build Coastguard Worker //   - decrease the codec errors due to resources
123*ec779b8eSAndroid Build Coastguard Worker //
124*ec779b8eSAndroid Build Coastguard Worker // This class that maintains concurrent codec counts based on:
125*ec779b8eSAndroid Build Coastguard Worker //
126*ec779b8eSAndroid Build Coastguard Worker //  1. # of concurrent active codecs (initialized, but aren't released yet) of given
127*ec779b8eSAndroid Build Coastguard Worker //     implementation (by codec name) across the system.
128*ec779b8eSAndroid Build Coastguard Worker //
129*ec779b8eSAndroid Build Coastguard Worker //  2. # of concurrent codec usage (started, but not stopped yet), which is
130*ec779b8eSAndroid Build Coastguard Worker //  measured using codec type bucket (CodecBucket) for:
131*ec779b8eSAndroid Build Coastguard Worker //   - each process/application.
132*ec779b8eSAndroid Build Coastguard Worker //   - across the system.
133*ec779b8eSAndroid Build Coastguard Worker //  Also the peak count of the same for each process/application is maintained.
134*ec779b8eSAndroid Build Coastguard Worker //
135*ec779b8eSAndroid Build Coastguard Worker //  3. # of Peak Concurrent Pixels for each process/application.
136*ec779b8eSAndroid Build Coastguard Worker //  This should help with understanding the (video) memory usage per
137*ec779b8eSAndroid Build Coastguard Worker //  application.
138*ec779b8eSAndroid Build Coastguard Worker //
139*ec779b8eSAndroid Build Coastguard Worker 
140*ec779b8eSAndroid Build Coastguard Worker class ResourceManagerMetrics {
141*ec779b8eSAndroid Build Coastguard Worker public:
142*ec779b8eSAndroid Build Coastguard Worker     ResourceManagerMetrics(const sp<ProcessInfoInterface>& processInfo);
143*ec779b8eSAndroid Build Coastguard Worker     ~ResourceManagerMetrics();
144*ec779b8eSAndroid Build Coastguard Worker 
145*ec779b8eSAndroid Build Coastguard Worker     // To be called when a client is created.
146*ec779b8eSAndroid Build Coastguard Worker     void notifyClientCreated(const ClientInfoParcel& clientInfo);
147*ec779b8eSAndroid Build Coastguard Worker 
148*ec779b8eSAndroid Build Coastguard Worker     // To be called when a client is released.
149*ec779b8eSAndroid Build Coastguard Worker     void notifyClientReleased(const ClientInfoParcel& clientInfo);
150*ec779b8eSAndroid Build Coastguard Worker 
151*ec779b8eSAndroid Build Coastguard Worker     // To be called when a client is started.
152*ec779b8eSAndroid Build Coastguard Worker     void notifyClientStarted(const ClientConfigParcel& clientConfig);
153*ec779b8eSAndroid Build Coastguard Worker 
154*ec779b8eSAndroid Build Coastguard Worker     // To be called when a client is stopped.
155*ec779b8eSAndroid Build Coastguard Worker     void notifyClientStopped(const ClientConfigParcel& clientConfig);
156*ec779b8eSAndroid Build Coastguard Worker 
157*ec779b8eSAndroid Build Coastguard Worker     // To be called when a client's configuration has changed.
158*ec779b8eSAndroid Build Coastguard Worker     void notifyClientConfigChanged(const ClientConfigParcel& clientConfig);
159*ec779b8eSAndroid Build Coastguard Worker 
160*ec779b8eSAndroid Build Coastguard Worker     // To be called when after a reclaim event.
161*ec779b8eSAndroid Build Coastguard Worker     void pushReclaimAtom(const ClientInfoParcel& clientInfo,
162*ec779b8eSAndroid Build Coastguard Worker                          const std::vector<int>& priorities,
163*ec779b8eSAndroid Build Coastguard Worker                          const std::vector<ClientInfo>& targetClients,
164*ec779b8eSAndroid Build Coastguard Worker                          bool reclaimed);
165*ec779b8eSAndroid Build Coastguard Worker 
166*ec779b8eSAndroid Build Coastguard Worker     // Add this pid/uid set to monitor for the process termination state.
167*ec779b8eSAndroid Build Coastguard Worker     void addPid(int pid, uid_t uid = 0);
168*ec779b8eSAndroid Build Coastguard Worker 
169*ec779b8eSAndroid Build Coastguard Worker     // Get the peak concurrent pixel count (associated with the video codecs) for the process.
170*ec779b8eSAndroid Build Coastguard Worker     long getPeakConcurrentPixelCount(int pid) const;
171*ec779b8eSAndroid Build Coastguard Worker     // Get the current concurrent pixel count (associated with the video codecs) for the process.
172*ec779b8eSAndroid Build Coastguard Worker     long getCurrentConcurrentPixelCount(int pid) const;
173*ec779b8eSAndroid Build Coastguard Worker 
174*ec779b8eSAndroid Build Coastguard Worker     // retrieves metrics log.
175*ec779b8eSAndroid Build Coastguard Worker     std::string dump() const;
176*ec779b8eSAndroid Build Coastguard Worker 
177*ec779b8eSAndroid Build Coastguard Worker private:
178*ec779b8eSAndroid Build Coastguard Worker     ResourceManagerMetrics(const ResourceManagerMetrics&) = delete;
179*ec779b8eSAndroid Build Coastguard Worker     ResourceManagerMetrics(ResourceManagerMetrics&&) = delete;
180*ec779b8eSAndroid Build Coastguard Worker     ResourceManagerMetrics& operator=(const ResourceManagerMetrics&) = delete;
181*ec779b8eSAndroid Build Coastguard Worker     ResourceManagerMetrics& operator=(ResourceManagerMetrics&&) = delete;
182*ec779b8eSAndroid Build Coastguard Worker 
183*ec779b8eSAndroid Build Coastguard Worker     // To increase/decrease the concurrent codec usage for a given CodecBucket.
184*ec779b8eSAndroid Build Coastguard Worker     void increaseConcurrentCodecs(int32_t pid, CodecBucket codecBucket);
185*ec779b8eSAndroid Build Coastguard Worker     void decreaseConcurrentCodecs(int32_t pid, CodecBucket codecBucket);
186*ec779b8eSAndroid Build Coastguard Worker 
187*ec779b8eSAndroid Build Coastguard Worker     // To increase/update/decrease the concurrent pixels usage for a process.
188*ec779b8eSAndroid Build Coastguard Worker     void increasePixelCount(int32_t pid, long pixels);
189*ec779b8eSAndroid Build Coastguard Worker     void updatePixelCount(int32_t pid, long newPixels, long lastPixels);
190*ec779b8eSAndroid Build Coastguard Worker     void decreasePixelCount(int32_t pid, long pixels);
191*ec779b8eSAndroid Build Coastguard Worker 
192*ec779b8eSAndroid Build Coastguard Worker     // Issued when the process/application with given pid/uid is terminated.
193*ec779b8eSAndroid Build Coastguard Worker     void onProcessTerminated(int32_t pid, uid_t uid);
194*ec779b8eSAndroid Build Coastguard Worker 
195*ec779b8eSAndroid Build Coastguard Worker     // To push conccuret codec usage of a process/application.
196*ec779b8eSAndroid Build Coastguard Worker     void pushConcurrentUsageReport(int32_t pid, uid_t uid);
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker private:
199*ec779b8eSAndroid Build Coastguard Worker     std::mutex mLock;
200*ec779b8eSAndroid Build Coastguard Worker 
201*ec779b8eSAndroid Build Coastguard Worker     // Map of client id and the configuration.
202*ec779b8eSAndroid Build Coastguard Worker     ClientConfigMap mClientConfigMap;
203*ec779b8eSAndroid Build Coastguard Worker 
204*ec779b8eSAndroid Build Coastguard Worker     // Concurrent and Peak Pixel count for each process/application.
205*ec779b8eSAndroid Build Coastguard Worker     std::map<int32_t, PixelCount> mProcessPixelsMap;
206*ec779b8eSAndroid Build Coastguard Worker 
207*ec779b8eSAndroid Build Coastguard Worker     // Map of resources (name) and number of concurrent instances
208*ec779b8eSAndroid Build Coastguard Worker     std::map<std::string, int> mConcurrentResourceCountMap;
209*ec779b8eSAndroid Build Coastguard Worker 
210*ec779b8eSAndroid Build Coastguard Worker     // Map of concurrent codecs by CodecBucket across the system.
211*ec779b8eSAndroid Build Coastguard Worker     ConcurrentCodecsMap mConcurrentCodecsMap;
212*ec779b8eSAndroid Build Coastguard Worker     // Map of concurrent and peak codecs by CodecBucket for each process/application.
213*ec779b8eSAndroid Build Coastguard Worker     std::map<int32_t, ConcurrentCodecs> mProcessConcurrentCodecsMap;
214*ec779b8eSAndroid Build Coastguard Worker 
215*ec779b8eSAndroid Build Coastguard Worker     // Uid Observer to monitor the application termination.
216*ec779b8eSAndroid Build Coastguard Worker     sp<UidObserver> mUidObserver;
217*ec779b8eSAndroid Build Coastguard Worker };
218*ec779b8eSAndroid Build Coastguard Worker 
219*ec779b8eSAndroid Build Coastguard Worker } // namespace android
220*ec779b8eSAndroid Build Coastguard Worker 
221*ec779b8eSAndroid Build Coastguard Worker #endif  // ANDROID_MEDIA_RESOURCEMANAGERMETRICS_H_
222