• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import { TraficEnum } from './utils/QueryEnum';
17
18export const chartSMapsDataSqlMem = (args: any): string => {
19  return `SELECT (A.timestamp - ${args.recordStartNS}) as startNs,
20        sum(${args.name}) * 1024 as value
21        FROM smaps A
22        WHERE A.timestamp < ${args.recordEndNS}
23        GROUP by A.timestamp`;
24};
25export const chartDmaDataSqlMem = (args: any): string => {
26  return `SELECT (A.ts - ${args.recordStartNS}) as startNs,
27        sum(A.size) as value
28        FROM memory_dma A
29        WHERE A.flag = 0
30        AND ${args.ipid} = A.ipid
31        AND A.ts < ${args.recordEndNS}
32        GROUP by A.ts`;
33};
34export const chartGpuMemoryDataSqlMem = (args: any): string => {
35  return ` SELECT (A.ts - ${args.recordStartNS}) as startNs,
36        sum(A.used_gpu_size) as value
37        FROM memory_process_gpu A
38        WHERE ${args.ipid} = A.ipid
39        AND A.ts < ${args.recordEndNS}
40        GROUP by A.ts`;
41};
42export const chartGpuResourceDataSqlMem = (args: any): string => {
43  return `SELECT subquery1.startNs,
44        (IFNULL(subquery1.totalSize, 0) - IFNULL(subquery2.size, 0)) AS value
45        FROM
46            (SELECT (ts - ${args.recordStartNS}) AS startNs,SUM(total_size) AS totalSize
47            FROM memory_profile
48            WHERE ts between ${args.recordStartNS} and ${args.recordEndNS}
49            GROUP BY ts) AS subquery1
50        LEFT JOIN
51            (SELECT (ts - ${args.recordStartNS}) AS startNs, SUM(size) AS size
52            FROM memory_window_gpu
53            WHERE ts between ${args.recordStartNS} and ${args.recordEndNS}
54            AND category_name_id = ${args.scratchId}
55            GROUP BY ts) AS subquery2
56        ON subquery1.startNs = subquery2.startNs`;
57};
58export const chartGpuDataSqlMem = (args: any): string => {
59  return `select (ts - ${args.recordStartNS}) startNs,
60        sum(value) * 1024 value
61        from process_measure
62        where filter_id = (
63            select id
64            from process_measure_filter
65            where name = ${args.name} and ipid = ${args.ipid}
66            )
67        and ts between ${args.recordStartNS} AND ${args.recordEndNS}
68        group by ts;`;
69};
70export const chartGpuTotalDataSqlMem = (args: any): string => {
71  let moduleCondition = args.moduleId === null ? '' : `and module_name_id = ${args.moduleId}`;
72  return `select (ts - ${args.recordStartNS}) startNs,
73        sum(size) value
74        from memory_window_gpu
75        where window_name_id = 0 ${moduleCondition}
76        and ts < ${args.recordEndNS}
77        group by ts;`;
78};
79export const chartGpuWindowDataSqlMem = (args: any): string => {
80  let moduleCondition = args.moduleId === null ? '' : `and module_name_id = ${args.moduleId}`;
81  return `select (ts - ${args.recordStartNS}) startNs,
82        sum(size) value
83        from memory_window_gpu
84        where window_name_id = ${args.windowId} ${moduleCondition}
85        and ts < ${args.recordEndNS}
86        group by ts`;
87};
88export const chartShmDataSqlMem = (args: any): string => {
89  return `SELECT (A.ts - ${args.recordStartNS}) as startNs,
90        sum(A.size) as value
91        FROM memory_ashmem A
92        where A.ipid = ${args.ipid}
93        AND A.ts < ${args.recordEndNS}
94        AND flag = 0
95        GROUP by A.ts`;
96};
97export const chartPurgeableDataSqlMem = (args: any): string => {
98  const pinSql = args.isPin ? ' AND a.ref_count > 0' : '';
99  const names = args.isPin ? " ('mem.purg_pin')" : "('mem.purg_sum')";
100  return `SELECT startNs,
101        sum( value ) AS value
102        FROM (SELECT m.ts - ${args.recordStartNS} AS startNs,
103            sum(m.value) AS value
104            FROM process_measure m
105            LEFT JOIN process_measure_filter f ON f.id = m.filter_id
106            WHERE m.ts < ${args.recordEndNS}
107            AND f.name = ${names}
108            AND f.ipid = ${args.ipid}
109            GROUP BY m.ts
110        UNION ALL
111            SELECT a.ts - ${args.recordStartNS} AS startNs,
112            sum( a.pss ) AS value
113            FROM memory_ashmem a
114            WHERE a.ts < ${args.recordEndNS}
115            AND a.flag = 0
116            AND a.ipid = ${args.ipid}
117            ${pinSql}
118            GROUP BY a.ts)
119         GROUP BY startNs`;
120};
121export const abilityPurgeablelDataSqlMem = (args: any): string => {
122  const pinCondition = args.isPin ? ' AND a.ref_count > 0' : '';
123  const names = args.isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')";
124  return `SELECT startNs,
125        sum( value ) AS value
126        FROM (SELECT m.ts - ${args.recordStartNS} AS startNs,
127            sum( m.value ) AS value
128            FROM sys_mem_measure m
129            LEFT JOIN sys_event_filter f ON f.id = m.filter_id
130            WHERE m.ts < ${args.recordEndNS}
131            AND f.name IN ${names}
132            GROUP BY m.ts
133        UNION ALL
134            SELECT a.ts - ${args.recordStartNS} AS startNs,
135            sum( a.size ) AS value
136            FROM  memory_ashmem a
137            WHERE a.ts < ${args.recordEndNS}
138            AND a.flag = 0
139            ${pinCondition}
140            GROUP BY a.ts )
141        GROUP BY startNs`;
142};
143export const abilityDmaDataSqlMem = (args: any): string => {
144  return `SELECT (A.ts - ${args.recordStartNS}) as startNs,
145        sum(A.size) as value,
146        E.data as expTaskComm,
147        A.flag as flag
148        FROM memory_dma A
149        left join data_dict as E on E.id=A.exp_task_comm_id
150        WHERE A.flag = 0
151        AND A.ts < ${args.recordEndNS}
152        GROUP by A.ts;`;
153};
154export const abilityGpuMemoryDataSqlMem = (args: any): string => {
155  return `SELECT
156        (A.ts - ${args.recordStartNS}) as startNs,
157        sum(A.used_gpu_size) as value
158        FROM memory_process_gpu A
159        WHERE A.ts < ${args.recordEndNS}
160        GROUP by A.ts;`;
161};
162
163let sMapsList: Array<any> = [];
164let dmaList: Array<any> = [];
165let gpuMemoryList: Array<any> = [];
166let gpuList: Array<any> = [];
167let gpuResourceList: Array<any> = [];
168let gpuTotalList: Array<any> = [];
169let gpuWindowList: Array<any> = [];
170let shmList: Array<any> = [];
171let purgeableList: Array<any> = [];
172let sMapsMap = new Map<string, Array<any>>();
173let purgeableMap = new Map<string, Array<any>>();
174let gpuMap = new Map<string, Array<any>>();
175let abilityPurgeableMap: Map<string, Array<any>> = new Map();
176let abilityPurgeableList: Array<any> = [];
177let abilityDmaList: Array<any> = [];
178let abilityGpuMemoryList: Array<any> = [];
179
180export function resetVmTracker(): void {
181  sMapsList = [];
182  dmaList = [];
183  gpuMemoryList = [];
184  gpuList = [];
185  gpuResourceList = [];
186  gpuTotalList = [];
187  gpuWindowList = [];
188  shmList = [];
189  purgeableList = [];
190  sMapsMap.clear();
191  purgeableMap.clear();
192  gpuMap.clear();
193}
194
195export function resetAbility(): void {
196  abilityPurgeableList = [];
197  abilityDmaList = [];
198  abilityGpuMemoryList = [];
199  abilityPurgeableMap.clear();
200}
201
202export function sMapsDataReceiver(data: any, proc: Function): void {
203  if (!sMapsMap.has(data.params.name)) {
204    sMapsList = proc(chartSMapsDataSqlMem(data.params));
205    sMapsMap.set(data.params.name, sMapsList);
206  }
207  let list = sMapsMap.get(data.params.name) || [];
208  arrayBufferHandler(data, list, true);
209}
210
211export function dmaDataReceiver(data: any, proc: Function): void {
212  if (dmaList.length === 0) {
213    dmaList = proc(chartDmaDataSqlMem(data.params));
214  }
215  arrayBufferHandler(data, dmaList, true);
216}
217
218export function gpuMemoryDataReceiver(data: any, proc: Function): void {
219  if (gpuMemoryList.length === 0) {
220    gpuMemoryList = proc(chartGpuMemoryDataSqlMem(data.params));
221  }
222  arrayBufferHandler(data, gpuMemoryList, true);
223}
224
225export function gpuDataReceiver(data: any, proc: Function): void {
226  if (!gpuMap.has(data.params.name)) {
227    gpuList = proc(chartGpuDataSqlMem(data.params));
228    gpuMap.set(data.params.name, gpuList);
229  }
230  let list = gpuMap.get(data.params.name) || [];
231  arrayBufferHandler(data, list, true);
232}
233
234export function gpuResourceDataReceiver(data: any, proc: Function): void {
235  if (gpuResourceList.length === 0) {
236    gpuResourceList = proc(chartGpuResourceDataSqlMem(data.params));
237  }
238  arrayBufferHandler(data, gpuResourceList, true);
239}
240
241export function gpuTotalDataReceiver(data: any, proc: Function): void {
242  if (gpuTotalList.length === 0 || data.params.moduleId) {
243    gpuTotalList = proc(chartGpuTotalDataSqlMem(data.params));
244  }
245  arrayBufferHandler(data, gpuTotalList, true);
246}
247
248export function gpuWindowDataReceiver(data: any, proc: Function): void {
249  if (gpuWindowList.length === 0 || data.params.moduleId) {
250    gpuWindowList = proc(chartGpuWindowDataSqlMem(data.params));
251  }
252  arrayBufferHandler(data, gpuWindowList, true);
253}
254
255export function shmDataReceiver(data: any, proc: Function): void {
256  if (shmList.length === 0) {
257    shmList = proc(chartShmDataSqlMem(data.params));
258  }
259  arrayBufferHandler(data, shmList, true);
260}
261
262export function purgeableDataReceiver(data: any, proc: Function): void {
263  let key: string = '';
264  if (data.params.isPin) {
265    key = 'pin';
266  } else {
267    key = 'total';
268  }
269  if (!purgeableMap.has(data.params.isPin)) {
270    purgeableList = proc(chartPurgeableDataSqlMem(data.params));
271    purgeableMap.set(key, purgeableList);
272  }
273  let list = purgeableMap.get(key) || [];
274  arrayBufferHandler(data, list, true);
275}
276
277export function abilityPurgeableDataReceiver(data: any, proc: Function): void {
278  let key = '';
279  if (data.params.isPin) {
280    key = 'pin';
281  } else {
282    key = 'total';
283  }
284  if (!abilityPurgeableMap.has(key)) {
285    abilityPurgeableList = proc(abilityPurgeablelDataSqlMem(data.params));
286    abilityPurgeableMap.set(key, abilityPurgeableList);
287  }
288  let abilityList = abilityPurgeableMap.get(key) || [];
289  arrayBufferHandler(data, abilityList, true);
290}
291
292export function abilityDmaDataReceiver(data: any, proc: Function): void {
293  if (abilityDmaList.length === 0) {
294    abilityDmaList = proc(abilityDmaDataSqlMem(data.params));
295  }
296  arrayBufferHandler(data, abilityDmaList, true);
297}
298
299export function abilityGpuMemoryDataReceiver(data: any, proc: Function): void {
300  if (abilityGpuMemoryList.length === 0) {
301    abilityGpuMemoryList = proc(abilityGpuMemoryDataSqlMem(data.params));
302  }
303  arrayBufferHandler(data, abilityGpuMemoryList, true);
304}
305
306function arrayBufferHandler(data: any, res: any[], transfer: boolean): void {
307  let startNs = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNs);
308  let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value);
309  res.forEach((it, i) => {
310    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.trackerData);
311    startNs[i] = it.startNs;
312    value[i] = it.value;
313  });
314  (self as unknown as Worker).postMessage(
315    {
316      id: data.id,
317      action: data.action,
318      results: transfer
319        ? {
320            startNs: startNs.buffer,
321            value: value.buffer,
322          }
323        : {},
324      len: res.length,
325      transfer: transfer,
326    },
327    transfer ? [startNs.buffer, value.buffer] : []
328  );
329}
330