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 */ 15import { 16 GpuMemory, 17 GpuMemoryComparison, 18 SystemCpuSummary, 19 SystemDiskIOSummary, 20 SystemNetworkSummary 21} from "../../bean/AbilityMonitor"; 22import {query} from "../SqlLite"; 23import {CpuAbilityMonitorStruct} from "../ui-worker/ProcedureWorkerCpuAbility"; 24import {MemoryAbilityMonitorStruct} from "../ui-worker/ProcedureWorkerMemoryAbility"; 25import {DiskAbilityMonitorStruct} from "../ui-worker/ProcedureWorkerDiskIoAbility"; 26import {NetworkAbilityMonitorStruct} from "../ui-worker/ProcedureWorkerNetworkAbility"; 27import type {SnapshotStruct} from "../ui-worker/ProcedureWorkerSnapshot"; 28 29export const getTabCpuAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemCpuSummary>> => 30 query<SystemCpuSummary>( 31 'getTabCpuAbilityData', 32 `SELECT 33 ( n.ts - TR.start_ts ) AS startTime, 34 n.dur AS duration, 35 n.total_load AS totalLoad, 36 n.user_load AS userLoad, 37 n.system_load AS systemLoad, 38 n.process_num AS threads 39 FROM 40 cpu_usage AS n, 41 trace_range AS TR 42 WHERE 43 ( n.ts - TR.start_ts ) >= ifnull(( 44 SELECT 45 ( usage.ts - TR.start_ts ) 46 FROM 47 cpu_usage usage, 48 trace_range TR 49 WHERE 50 ( usage.ts - TR.start_ts ) <= $leftNS 51 ORDER BY 52 usage.ts DESC 53 LIMIT 1 54 ),0) 55 AND ( n.ts - TR.start_ts ) <= $rightNS 56 ORDER BY 57 startTime ASC; 58 `, 59 { $leftNS: leftNs, $rightNS: rightNs } 60 ); 61export const getTabMemoryAbilityData = ( 62 leftNs: number, 63 rightNs: number 64): Promise< 65 Array<{ 66 startTime: number; 67 value: string; 68 name: string; 69 }> 70> => 71 query( 72 'getTabMemoryAbilityData', 73 `SELECT 74 m.ts AS startTime, 75 GROUP_CONCAT( IFNULL( m.value, 0 ) ) AS value, 76 GROUP_CONCAT( f.name ) AS name 77 FROM 78 sys_mem_measure AS m 79 INNER JOIN sys_event_filter AS f ON m.filter_id = f.id 80 AND (f.name = 'sys.mem.total' 81 or f.name = 'sys.mem.free' 82 or f.name = 'sys.mem.buffers' 83 or f.name = 'sys.mem.cached' 84 or f.name = 'sys.mem.shmem' 85 or f.name = 'sys.mem.slab' 86 or f.name = 'sys.mem.swap.total' 87 or f.name = 'sys.mem.swap.free' 88 or f.name = 'sys.mem.mapped' 89 or f.name = 'sys.mem.vmalloc.used' 90 or f.name = 'sys.mem.page.tables' 91 or f.name = 'sys.mem.kernel.stack' 92 or f.name = 'sys.mem.active' 93 or f.name = 'sys.mem.inactive' 94 or f.name = 'sys.mem.unevictable' 95 or f.name = 'sys.mem.vmalloc.total' 96 or f.name = 'sys.mem.slab.unreclaimable' 97 or f.name = 'sys.mem.cma.total' 98 or f.name = 'sys.mem.cma.free' 99 or f.name = 'sys.mem.kernel.reclaimable' 100 or f.name = 'sys.mem.zram' 101 ) 102 AND m.ts >= ifnull(( 103 SELECT 104 m.ts AS startTime 105 FROM 106 sys_mem_measure AS m 107 INNER JOIN sys_event_filter AS f ON m.filter_id = f.id 108 AND m.ts <= $leftNS 109 AND (f.name = 'sys.mem.total' 110 or f.name = 'sys.mem.kernel.stack' 111 or f.name = 'sys.mem.free' 112 or f.name = 'sys.mem.swap.free' 113 or f.name = 'sys.mem.cma.free' 114 or f.name = 'sys.mem.inactive' 115 or f.name = 'sys.mem.buffers' 116 or f.name = 'sys.mem.cached' 117 or f.name = 'sys.mem.shmem' 118 or f.name = 'sys.mem.slab' 119 or f.name = 'sys.mem.swap.total' 120 or f.name = 'sys.mem.vmalloc.used' 121 or f.name = 'sys.mem.page.tables' 122 or f.name = 'sys.mem.active' 123 or f.name = 'sys.mem.unevictable' 124 or f.name = 'sys.mem.vmalloc.total' 125 or f.name = 'sys.mem.slab.unreclaimable' 126 or f.name = 'sys.mem.cma.total' 127 or f.name = 'sys.mem.mapped' 128 or f.name = 'sys.mem.kernel.reclaimable' 129 or f.name = 'sys.mem.zram' 130 ) 131 ORDER BY 132 m.ts DESC 133 LIMIT 1 134 ),0) 135 AND m.ts <= $rightNS GROUP BY m.ts;`, 136 { $leftNS: leftNs, $rightNS: rightNs } 137 ); 138export const getTabNetworkAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemNetworkSummary>> => 139 query<SystemNetworkSummary>( 140 'getTabNetworkAbilityData', 141 `SELECT 142 ( n.ts - TR.start_ts ) AS startTime, 143 n.dur AS duration, 144 n.rx AS dataReceived, 145 n.tx_speed AS dataReceivedSec, 146 n.tx AS dataSend, 147 n.rx_speed AS dataSendSec, 148 n.packet_in AS packetsIn, 149 n.packet_in_sec AS packetsInSec, 150 n.packet_out AS packetsOut, 151 n.packet_out_sec AS packetsOutSec 152 FROM 153 network AS n, 154 trace_range AS TR 155 WHERE 156 ( n.ts - TR.start_ts ) >= ifnull(( 157 SELECT 158 ( nn.ts - T.start_ts ) AS startTime 159 FROM 160 network nn, 161 trace_range T 162 WHERE 163 ( nn.ts - T.start_ts ) <= $leftNS 164 ORDER BY 165 nn.ts DESC 166 LIMIT 1 167 ),0) 168 AND ( n.ts - TR.start_ts ) <= $rightNS 169 ORDER BY 170 startTime ASC`, 171 { $leftNS: leftNs, $rightNS: rightNs } 172 ); 173export const getTabDiskAbilityData = (leftNs: number, rightNs: number): Promise<Array<SystemDiskIOSummary>> => 174 query<SystemDiskIOSummary>( 175 'getTabDiskAbilityData', 176 `SELECT 177 ( n.ts - TR.start_ts ) AS startTime, 178 n.dur AS duration, 179 n.rd AS dataRead, 180 n.rd_speed AS dataReadSec, 181 n.wr AS dataWrite, 182 n.wr_speed AS dataWriteSec, 183 n.rd_count AS readsIn, 184 n.rd_count_speed AS readsInSec, 185 n.wr_count AS writeOut, 186 n.wr_count_speed AS writeOutSec 187 FROM 188 diskio AS n, 189 trace_range AS TR 190 WHERE 191 ( n.ts - TR.start_ts ) >= ifnull(( 192 SELECT 193 ( nn.ts - T.start_ts ) AS startTime 194 FROM 195 diskio AS nn, 196 trace_range AS T 197 WHERE 198 ( nn.ts - T.start_ts ) <= $leftNS 199 ORDER BY 200 nn.ts DESC 201 LIMIT 1 202 ),0) 203 AND ( n.ts - TR.start_ts ) <= $rightNS 204 ORDER BY 205 startTime ASC; 206 `, 207 { $leftNS: leftNs, $rightNS: rightNs } 208 ); 209 210export const queryCpuAbilityData = (): Promise<Array<CpuAbilityMonitorStruct>> => 211 query( 212 'queryCpuAbilityData', 213 `select 214 (t.total_load) as value, 215 (t.ts - TR.start_ts) as startNS 216 from cpu_usage t, trace_range AS TR;` 217 ); 218 219export const queryCpuAbilityUserData = (): Promise<Array<CpuAbilityMonitorStruct>> => 220 query( 221 'queryCpuAbilityUserData', 222 `select 223 t.user_load as value, 224 (t.ts - TR.start_ts) as startNS 225 from cpu_usage t, trace_range AS TR;` 226 ); 227 228export const queryCpuAbilitySystemData = (): Promise<Array<CpuAbilityMonitorStruct>> => 229 query( 230 'queryCpuAbilitySystemData', 231 `select 232 t.system_load as value, 233 (t.ts - TR.start_ts) as startNS 234 from cpu_usage t, trace_range AS TR;` 235 ); 236 237export const queryMemoryUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 238 query( 239 'queryMemoryUsedAbilityData', 240 `select 241 t.value as value, 242 (t.ts - TR.start_ts) as startNS 243 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 244 { $id: id } 245 ); 246 247export const queryCachedFilesAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 248 query( 249 'queryCachedFilesAbilityData', 250 `select 251 t.value as value, 252 (t.ts - TR.start_ts) as startNS 253 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 254 { $id: id } 255 ); 256 257 258export const queryCompressedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 259 query( 260 'queryCompressedAbilityData', 261 `select 262 t.value as value, 263 (t.ts - TR.start_ts) as startNS 264 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 265 { $id: id } 266 ); 267 268export const querySwapUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 269 query( 270 'querySwapUsedAbilityData', 271 `select 272 t.value as value, 273 (t.ts - TR.start_ts) as startNS 274 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 275 { $id: id } 276 ); 277 278export const queryBytesReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 279 query( 280 'queryBytesReadAbilityData', 281 `select 282 t.rd_speed as value, 283 (t.ts - TR.start_ts) as startNS 284 from diskio t, trace_range AS TR;` 285 ); 286 287export const queryBytesWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 288 query( 289 'queryBytesWrittenAbilityData', 290 `select 291 t.wr_speed as value, 292 (t.ts - TR.start_ts) as startNS 293 from diskio t, trace_range AS TR;` 294 ); 295 296export const queryReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 297 query( 298 'queryReadAbilityData', 299 `select 300 t.rd_count_speed as value, 301 (t.ts - TR.start_ts) as startNS 302 from diskio t, trace_range AS TR;` 303 ); 304 305export const queryWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 306 query( 307 'queryWrittenAbilityData', 308 `select 309 t.wr_count_speed as value, 310 (t.ts - TR.start_ts) as startNS 311 from diskio t, trace_range AS TR;` 312 ); 313 314export const queryBytesInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 315 query( 316 'queryBytesInAbilityData', 317 `select 318 t.tx_speed as value, 319 (t.ts - TR.start_ts) as startNS 320 from network t, trace_range AS TR;` 321 ); 322 323export const queryBytesOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 324 query( 325 'queryBytesOutAbilityData', 326 `select 327 t.rx_speed as value, 328 (t.ts - TR.start_ts) as startNS 329 from network t, trace_range AS TR;` 330 ); 331 332export const queryPacketsInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 333 query( 334 'queryPacketsInAbilityData', 335 `select 336 t.packet_in_sec as value, 337 (t.ts - TR.start_ts) as startNS 338 from network t, trace_range AS TR;` 339 ); 340 341export const queryPacketsOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 342 query( 343 'queryPacketsOutAbilityData', 344 `select 345 t.packet_out_sec as value, 346 (t.ts - TR.start_ts) as startNS 347 from network t, trace_range AS TR;` 348 ); 349export const queryAbilityExits = (): Promise<Array<any>> => 350 query( 351 'queryAbilityExits', 352 `select 353 event_name 354 from stat s 355 where s.event_name in ('trace_diskio','trace_network', 'trace_cpu_usage','sys_memory') 356 and s.stat_type ='received' and s.count > 0` 357 ); 358export const queryCPuAbilityMaxData = (): Promise<Array<any>> => 359 query( 360 'queryCPuAbilityMaxData', 361 `select ifnull(max(total_load),0) as totalLoad, 362 ifnull(max(user_load),0) as userLoad, 363 ifnull(max(system_load),0) as systemLoad 364 from cpu_usage` 365 ); 366// Ability Monitor SkiaGpuMemory泳道图 367export const queryGpuMemoryAbilityData = (): Promise<Array<SnapshotStruct>> => 368 query( 369 'queryGpuMemoryAbilityData', 370 `SELECT 371 (A.ts - B.start_ts) as startNs, 372 sum(A.used_gpu_size) as value 373 FROM memory_process_gpu A,trace_range B 374 WHERE A.ts < B.end_ts 375 GROUP by A.ts 376 LIMIT 1;` 377 ); 378 379// Ability Monitor Dma泳道图 380export const queryDmaAbilityData = (): Promise<Array<SnapshotStruct>> => 381 query( 382 'queryDmaAbilityData', 383 `SELECT 384 (A.ts - B.start_ts) as startNs, 385 sum(A.size) as value, 386 E.data as expTaskComm, 387 A.flag as flag 388 FROM memory_dma A,trace_range B 389 left join data_dict as E on E.id=A.exp_task_comm_id 390 WHERE 391 A.flag = 0 392 AND A.ts < B.end_ts 393 GROUP by A.ts 394 LIMIT 1;` 395 ); 396// Ability Monitor Purgeable泳道图 397export const queryPurgeableSysData = (isPin?: boolean): Promise<Array<any>> => { 398 const pinCondition = isPin ? ' AND a.ref_count > 0' : ''; 399 const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')"; 400 return query( 401 'queryPurgeableSysData', 402 `SELECT 403 startNs, 404 sum( value ) AS value 405 FROM 406 ( 407 SELECT 408 m.ts - tr.start_ts AS startNs, 409 sum( m.value ) AS value 410 FROM 411 sys_mem_measure m, 412 trace_range tr 413 LEFT JOIN sys_event_filter f ON f.id = m.filter_id 414 WHERE 415 m.ts < tr.end_ts 416 AND f.name IN ${names} 417 GROUP BY 418 m.ts UNION ALL 419 SELECT 420 a.ts - tr.start_ts AS startNs, 421 sum( a.size ) AS value 422 FROM 423 memory_ashmem a, 424 trace_range tr 425 WHERE 426 a.ts < tr.end_ts 427 AND a.flag = 0 428 ${pinCondition} 429 GROUP BY 430 a.ts 431 ) 432 GROUP BY startNs 433 LIMIT 1` 434 ); 435}; 436 437//Ability Monitor Purgeable 框选 tab页 438export const querySysPurgeableTab = ( 439 leftNs: number, 440 rightNs: number, 441 dur: number, 442 isPin?: boolean 443): Promise<Array<any>> => { 444 let pinsql = isPin ? ' AND ref_count > 0' : ''; 445 const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')"; 446 return query( 447 'querySysPurgeableTab', 448 `SELECT name, MAX( size ) AS maxSize,MIN( size ) AS minSize,AVG( size ) AS avgSize 449 FROM 450 (SELECT 451 'ShmPurg' AS name, 452 ts - tr.start_ts AS startTs, 453 SUM( size ) AS size 454 FROM 455 memory_ashmem, 456 trace_range tr 457 WHERE flag = 0 458 ${pinsql} 459 GROUP BY ts UNION 460 SELECT 461 CASE 462 WHEN 463 f.name = 'sys.mem.active.purg' THEN 464 'ActivePurg' 465 WHEN f.name = 'sys.mem.inactive.purg' THEN 466 'InActivePurg' ELSE 'PinedPurg' 467 END AS name, 468 m.ts - tr.start_ts AS startTs, 469 m.value AS size 470 FROM 471 sys_mem_measure m, 472 trace_range tr 473 LEFT JOIN sys_event_filter f ON f.id = m.filter_id 474 WHERE 475 f.name IN ${names} 476 ), 477 trace_range tr 478 WHERE ${leftNs} <= startTs + ${dur} AND ${rightNs} >= startTs 479 GROUP BY name` 480 ); 481}; 482 483//Ability Monitor Purgeable 点选 tab页 484export const querySysPurgeableSelectionTab = (startNs: number, isPin?: boolean): Promise<Array<any>> => { 485 const pinSql = isPin ? ' AND ref_count > 0' : ''; 486 const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')"; 487 return query( 488 'querySysPurgeableSelectionTab', 489 `SELECT 490 ( CASE WHEN f.name = 'sys.mem.active.purg' THEN 'ActivePurg' WHEN f.name = 'sys.mem.inactive.purg' THEN 'InActivePurg' ELSE 'PinedPurg' END ) AS name, 491 m.value AS value 492 FROM 493 sys_mem_measure m, 494 trace_range tr 495 LEFT JOIN sys_event_filter f ON f.id = m.filter_id 496 WHERE 497 f.name IN ${names} 498 AND m.ts - tr.start_ts = ${startNs} 499 UNION 500 SELECT 501 'ShmPurg' AS name, 502 SUM( size ) AS value 503 FROM 504 memory_ashmem, 505 trace_range tr 506 WHERE 507 memory_ashmem.ts - tr.start_ts = ${startNs} 508 AND flag=0 509 ${pinSql} 510 GROUP BY ts` 511 ); 512}; 513//Ability Monitor SkiaGpuMemory 框选 514export const getTabGpuMemoryAbilityData = (leftNs: number, rightNs: number, dur: number): Promise<Array<GpuMemory>> => 515 query<GpuMemory>( 516 'getTabGpuMemoryAbilityData', 517 `SELECT (S.ts-TR.start_ts) as startNs, 518 gpu_name_id as gpuNameId, 519 MAX(S.used_gpu_size) as maxSize, 520 MIN(S.used_gpu_size) as minSize, 521 Avg(S.used_gpu_size) as avgSize, 522 E.pid as processId, 523 E.name as processName 524 from trace_range as TR,memory_process_gpu as S 525 left join process as E on E.ipid=S.ipid 526 WHERE 527 $leftNS <= startNs + ${dur} 528 and 529 $rightNS >= startNs 530 GROUP by 531 E.pid ,S.gpu_name_id 532 `, 533 { $leftNS: leftNs, $rightNS: rightNs } 534 ); 535//Ability Monitor SkiaGpuMemory 点选 536export const getTabGpuMemoryAbilityClickData = (startNs: number): Promise<Array<GpuMemory>> => 537 query<GpuMemory>( 538 'getTabGpuMemoryAbilityClickData', 539 `SELECT 540 (S.ts-TR.start_ts) as startNs, 541 S.used_gpu_size as size, 542 E.pid as processId, 543 E.name as processName, 544 A.data as gpuName 545 from trace_range as TR,memory_process_gpu as S 546 left join process as E on E.ipid=S.ipid 547 left join data_dict as A on A.id=S.gpu_name_id 548 WHERE 549 startNs = ${startNs} 550 `, 551 { $startNs: startNs } 552 ); 553//Ability Monitor Gpu Memory 点选比较 554export const getTabGpuMemoryComparisonData = (startNs: number): Promise<Array<GpuMemoryComparison>> => 555 query<GpuMemoryComparison>( 556 'getTabGpuMemoryComparisonData', 557 `SELECT 558 (S.ts-TR.start_ts) as startNs, 559 sum(S.used_gpu_size) as value, 560 E.pid as processId, 561 S.gpu_name_id as gpuNameId, 562 E.name as processName 563 from trace_range as TR,memory_process_gpu as S 564 left join process as E on E.ipid=S.ipid 565 WHERE 566 startNs = ${startNs} 567 GROUP by 568 E.pid, S.gpu_name_id 569 `, 570 { $startNs: startNs } 571 ); 572 573 574