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