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 257export const queryCompressedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 258 query( 259 'queryCompressedAbilityData', 260 `select 261 t.value as value, 262 (t.ts - TR.start_ts) as startNS 263 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 264 { $id: id } 265 ); 266 267export const querySwapUsedAbilityData = (id: string): Promise<Array<MemoryAbilityMonitorStruct>> => 268 query( 269 'querySwapUsedAbilityData', 270 `select 271 t.value as value, 272 (t.ts - TR.start_ts) as startNS 273 from sys_mem_measure t, trace_range AS TR where t.filter_id = $id;`, 274 { $id: id } 275 ); 276 277export const queryBytesReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 278 query( 279 'queryBytesReadAbilityData', 280 `select 281 t.rd_speed as value, 282 (t.ts - TR.start_ts) as startNS 283 from diskio t, trace_range AS TR;` 284 ); 285 286export const queryBytesWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 287 query( 288 'queryBytesWrittenAbilityData', 289 `select 290 t.wr_speed as value, 291 (t.ts - TR.start_ts) as startNS 292 from diskio t, trace_range AS TR;` 293 ); 294 295export const queryReadAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 296 query( 297 'queryReadAbilityData', 298 `select 299 t.rd_count_speed as value, 300 (t.ts - TR.start_ts) as startNS 301 from diskio t, trace_range AS TR;` 302 ); 303 304export const queryWrittenAbilityData = (): Promise<Array<DiskAbilityMonitorStruct>> => 305 query( 306 'queryWrittenAbilityData', 307 `select 308 t.wr_count_speed as value, 309 (t.ts - TR.start_ts) as startNS 310 from diskio t, trace_range AS TR;` 311 ); 312 313export const queryBytesInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 314 query( 315 'queryBytesInAbilityData', 316 `select 317 t.tx_speed as value, 318 (t.ts - TR.start_ts) as startNS 319 from network t, trace_range AS TR;` 320 ); 321 322export const queryBytesOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 323 query( 324 'queryBytesOutAbilityData', 325 `select 326 t.rx_speed as value, 327 (t.ts - TR.start_ts) as startNS 328 from network t, trace_range AS TR;` 329 ); 330 331export const queryPacketsInAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 332 query( 333 'queryPacketsInAbilityData', 334 `select 335 t.packet_in_sec as value, 336 (t.ts - TR.start_ts) as startNS 337 from network t, trace_range AS TR;` 338 ); 339 340export const queryPacketsOutAbilityData = (): Promise<Array<NetworkAbilityMonitorStruct>> => 341 query( 342 'queryPacketsOutAbilityData', 343 `select 344 t.packet_out_sec as value, 345 (t.ts - TR.start_ts) as startNS 346 from network t, trace_range AS TR;` 347 ); 348export const queryAbilityExits = (): //@ts-ignore 349Promise<Array<unknown>> => 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 = (): //@ts-ignore 359Promise<Array<unknown>> => 360 query( 361 'queryCPuAbilityMaxData', 362 `select ifnull(max(total_load),0) as totalLoad, 363 ifnull(max(user_load),0) as userLoad, 364 ifnull(max(system_load),0) as systemLoad 365 from cpu_usage` 366 ); 367// Ability Monitor SkiaGpuMemory泳道图 368export const queryGpuMemoryAbilityData = (): Promise<Array<SnapshotStruct>> => 369 query( 370 'queryGpuMemoryAbilityData', 371 `SELECT 372 (A.ts - B.start_ts) as startNs, 373 sum(A.used_gpu_size) as value 374 FROM memory_process_gpu A,trace_range B 375 WHERE A.ts < B.end_ts 376 GROUP by A.ts 377 LIMIT 1;` 378 ); 379 380// Ability Monitor Dma泳道图 381export const queryDmaAbilityData = (): Promise<Array<SnapshotStruct>> => 382 query( 383 'queryDmaAbilityData', 384 `SELECT 385 (A.ts - B.start_ts) as startNs, 386 sum(A.size) as value, 387 E.data as expTaskComm, 388 A.flag as flag 389 FROM memory_dma A,trace_range B 390 left join data_dict as E on E.id=A.exp_task_comm_id 391 WHERE 392 A.flag = 0 393 AND A.ts < B.end_ts 394 GROUP by A.ts 395 LIMIT 1;` 396 ); 397// Ability Monitor Purgeable泳道图 398export const queryPurgeableSysData = ( 399 isPin?: boolean 400): //@ts-ignore 401Promise<Array<unknown>> => { 402 const pinCondition = isPin ? ' AND a.ref_count > 0' : ''; 403 const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')"; 404 return query( 405 'queryPurgeableSysData', 406 `SELECT 407 startNs, 408 sum( value ) AS value 409 FROM 410 ( 411 SELECT 412 m.ts - tr.start_ts AS startNs, 413 sum( m.value ) AS value 414 FROM 415 sys_mem_measure m, 416 trace_range tr 417 LEFT JOIN sys_event_filter f ON f.id = m.filter_id 418 WHERE 419 m.ts < tr.end_ts 420 AND f.name IN ${names} 421 GROUP BY 422 m.ts UNION ALL 423 SELECT 424 a.ts - tr.start_ts AS startNs, 425 sum( a.size ) AS value 426 FROM 427 memory_ashmem a, 428 trace_range tr 429 WHERE 430 a.ts < tr.end_ts 431 AND a.flag = 0 432 ${pinCondition} 433 GROUP BY 434 a.ts 435 ) 436 GROUP BY startNs 437 LIMIT 1` 438 ); 439}; 440 441//Ability Monitor Purgeable 框选 tab页 442export const querySysPurgeableTab = ( 443 leftNs: number, 444 rightNs: number, 445 dur: number, 446 isPin?: boolean 447): //@ts-ignore 448Promise<Array<unknown>> => { 449 let pinsql = isPin ? ' AND ref_count > 0' : ''; 450 const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')"; 451 return query( 452 'querySysPurgeableTab', 453 `SELECT name, MAX( size ) AS maxSize,MIN( size ) AS minSize,AVG( size ) AS avgSize 454 FROM 455 (SELECT 456 'ShmPurg' AS name, 457 ts - tr.start_ts AS startTs, 458 SUM( size ) AS size 459 FROM 460 memory_ashmem, 461 trace_range tr 462 WHERE flag = 0 463 ${pinsql} 464 GROUP BY ts UNION 465 SELECT 466 CASE 467 WHEN 468 f.name = 'sys.mem.active.purg' THEN 469 'ActivePurg' 470 WHEN f.name = 'sys.mem.inactive.purg' THEN 471 'InActivePurg' ELSE 'PinedPurg' 472 END AS name, 473 m.ts - tr.start_ts AS startTs, 474 m.value AS size 475 FROM 476 sys_mem_measure m, 477 trace_range tr 478 LEFT JOIN sys_event_filter f ON f.id = m.filter_id 479 WHERE 480 f.name IN ${names} 481 ), 482 trace_range tr 483 WHERE ${leftNs} <= startTs + ${dur} AND ${rightNs} >= startTs 484 GROUP BY name` 485 ); 486}; 487 488//Ability Monitor Purgeable 点选 tab页 489export const querySysPurgeableSelectionTab = ( 490 startNs: number, 491 isPin?: boolean 492): //@ts-ignore 493Promise<Array<unknown>> => { 494 const pinSql = isPin ? ' AND ref_count > 0' : ''; 495 const names = isPin ? " ('sys.mem.pined.purg')" : "('sys.mem.active.purg','sys.mem.inactive.purg')"; 496 return query( 497 'querySysPurgeableSelectionTab', 498 `SELECT 499 ( CASE WHEN f.name = 'sys.mem.active.purg' THEN 'ActivePurg' WHEN f.name = 'sys.mem.inactive.purg' THEN 'InActivePurg' ELSE 'PinedPurg' END ) AS name, 500 m.value AS value 501 FROM 502 sys_mem_measure m, 503 trace_range tr 504 LEFT JOIN sys_event_filter f ON f.id = m.filter_id 505 WHERE 506 f.name IN ${names} 507 AND m.ts - tr.start_ts = ${startNs} 508 UNION 509 SELECT 510 'ShmPurg' AS name, 511 SUM( size ) AS value 512 FROM 513 memory_ashmem, 514 trace_range tr 515 WHERE 516 memory_ashmem.ts - tr.start_ts = ${startNs} 517 AND flag=0 518 ${pinSql} 519 GROUP BY ts` 520 ); 521}; 522//Ability Monitor SkiaGpuMemory 框选 523export const getTabGpuMemoryAbilityData = (leftNs: number, rightNs: number, dur: number): Promise<Array<GpuMemory>> => 524 query<GpuMemory>( 525 'getTabGpuMemoryAbilityData', 526 `SELECT (S.ts-TR.start_ts) as startNs, 527 gpu_name_id as gpuNameId, 528 MAX(S.used_gpu_size) as maxSize, 529 MIN(S.used_gpu_size) as minSize, 530 Avg(S.used_gpu_size) as avgSize, 531 E.pid as processId, 532 E.name as processName 533 from trace_range as TR,memory_process_gpu as S 534 left join process as E on E.ipid=S.ipid 535 WHERE 536 $leftNS <= startNs + ${dur} 537 and 538 $rightNS >= startNs 539 GROUP by 540 E.pid ,S.gpu_name_id 541 `, 542 { $leftNS: leftNs, $rightNS: rightNs } 543 ); 544//Ability Monitor SkiaGpuMemory 点选 545export const getTabGpuMemoryAbilityClickData = (startNs: number): Promise<Array<GpuMemory>> => 546 query<GpuMemory>( 547 'getTabGpuMemoryAbilityClickData', 548 `SELECT 549 (S.ts-TR.start_ts) as startNs, 550 S.used_gpu_size as size, 551 E.pid as processId, 552 E.name as processName, 553 A.data as gpuName 554 from trace_range as TR,memory_process_gpu as S 555 left join process as E on E.ipid=S.ipid 556 left join data_dict as A on A.id=S.gpu_name_id 557 WHERE 558 startNs = ${startNs} 559 `, 560 { $startNs: startNs } 561 ); 562//Ability Monitor Gpu Memory 点选比较 563export const getTabGpuMemoryComparisonData = (startNs: number): Promise<Array<GpuMemoryComparison>> => 564 query<GpuMemoryComparison>( 565 'getTabGpuMemoryComparisonData', 566 `SELECT 567 (S.ts-TR.start_ts) as startNs, 568 sum(S.used_gpu_size) as value, 569 E.pid as processId, 570 S.gpu_name_id as gpuNameId, 571 E.name as processName 572 from trace_range as TR,memory_process_gpu as S 573 left join process as E on E.ipid=S.ipid 574 WHERE 575 startNs = ${startNs} 576 GROUP by 577 E.pid, S.gpu_name_id 578 `, 579 { $startNs: startNs } 580 ); 581