1fb726d48Sopenharmony_ci// Copyright (c) 2021 Huawei Device Co., Ltd. 2fb726d48Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 3fb726d48Sopenharmony_ci// you may not use this file except in compliance with the License. 4fb726d48Sopenharmony_ci// You may obtain a copy of the License at 5fb726d48Sopenharmony_ci// 6fb726d48Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 7fb726d48Sopenharmony_ci// 8fb726d48Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 9fb726d48Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 10fb726d48Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11fb726d48Sopenharmony_ci// See the License for the specific language governing permissions and 12fb726d48Sopenharmony_ci// limitations under the License. 13fb726d48Sopenharmony_ci 14fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs'; 15fb726d48Sopenharmony_ciimport { TraficEnum } from '../utils/QueryEnum'; 16fb726d48Sopenharmony_ci 17fb726d48Sopenharmony_ciexport const chartHiperfCpuData10MSProtoSql = (args: Args): string => { 18fb726d48Sopenharmony_ci return `select 19fb726d48Sopenharmony_ci startNS as startNS, 20fb726d48Sopenharmony_ci max(event_count) as eventCount, 21fb726d48Sopenharmony_ci sample_count as sampleCount, 22fb726d48Sopenharmony_ci event_type_id as eventTypeId, 23fb726d48Sopenharmony_ci callchain_id as callchainId, 24fb726d48Sopenharmony_ci (startNS / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px 25fb726d48Sopenharmony_ci from (select s.callchain_id, 26fb726d48Sopenharmony_ci (s.timestamp_trace - ${args.recordStartNS}) / 10000000 * 10000000 startNS, 27fb726d48Sopenharmony_ci sum(event_count) event_count, 28fb726d48Sopenharmony_ci count(event_count) sample_count, 29fb726d48Sopenharmony_ci event_type_id 30fb726d48Sopenharmony_ci from perf_sample s 31fb726d48Sopenharmony_ci where s.thread_id != 0 ${args.cpu >= 0 ? 'and cpu_id =' + args.cpu : ''} ${ 32fb726d48Sopenharmony_ci args.drawType >= 0 ? 'and event_type_id =' + args.drawType : '' 33fb726d48Sopenharmony_ci } 34fb726d48Sopenharmony_ci group by startNS) 35fb726d48Sopenharmony_ci where startNS + 10000000 >= ${Math.floor(args.startNS)} 36fb726d48Sopenharmony_ci and startNS <= ${Math.floor(args.endNS)} 37fb726d48Sopenharmony_ci group by px;`; 38fb726d48Sopenharmony_ci}; 39fb726d48Sopenharmony_ciexport const chartHiperfCpuDataProtoSql = (args: Args): string => { 40fb726d48Sopenharmony_ci return `select 41fb726d48Sopenharmony_ci (s.timestamp_trace - ${args.recordStartNS}) startNS, 42fb726d48Sopenharmony_ci event_count as eventCount, 43fb726d48Sopenharmony_ci 1 as sampleCount, 44fb726d48Sopenharmony_ci event_type_id as eventTypeId, 45fb726d48Sopenharmony_ci s.callchain_id as callchainId, 46fb726d48Sopenharmony_ci (s.timestamp_trace - ${args.recordStartNS}) / (${Math.floor( 47fb726d48Sopenharmony_ci (args.endNS - args.startNS) / args.width 48fb726d48Sopenharmony_ci )}) AS px 49fb726d48Sopenharmony_ci from perf_sample s 50fb726d48Sopenharmony_ci where s.thread_id != 0 ${args.cpu >= 0 ? 'and cpu_id =' + args.cpu : ''} ${ 51fb726d48Sopenharmony_ci args.drawType >= 0 ? 'and event_type_id =' + args.drawType : '' 52fb726d48Sopenharmony_ci } 53fb726d48Sopenharmony_ci and startNS >= ${Math.floor(args.startNS)} 54fb726d48Sopenharmony_ci and startNS <= ${Math.floor(args.endNS)} 55fb726d48Sopenharmony_ci group by px; 56fb726d48Sopenharmony_ci `; 57fb726d48Sopenharmony_ci}; 58fb726d48Sopenharmony_ci 59fb726d48Sopenharmony_ciexport function hiperfCpuDataReceiver(data: unknown, proc: Function): void { 60fb726d48Sopenharmony_ci let sql: string; 61fb726d48Sopenharmony_ci // @ts-ignore 62fb726d48Sopenharmony_ci if (data.params.scale > 30_000_000) { 63fb726d48Sopenharmony_ci // @ts-ignore 64fb726d48Sopenharmony_ci sql = chartHiperfCpuData10MSProtoSql(data.params); 65fb726d48Sopenharmony_ci } else { 66fb726d48Sopenharmony_ci // @ts-ignore 67fb726d48Sopenharmony_ci sql = chartHiperfCpuDataProtoSql(data.params); 68fb726d48Sopenharmony_ci } 69fb726d48Sopenharmony_ci let res = proc(sql); 70fb726d48Sopenharmony_ci // @ts-ignore 71fb726d48Sopenharmony_ci arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 72fb726d48Sopenharmony_ci} 73fb726d48Sopenharmony_ci 74fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 75fb726d48Sopenharmony_ci // @ts-ignore 76fb726d48Sopenharmony_ci let maxCpuCount = data.params.maxCpuCount; 77fb726d48Sopenharmony_ci // @ts-ignore 78fb726d48Sopenharmony_ci let intervalPerf = data.params.intervalPerf; 79fb726d48Sopenharmony_ci // @ts-ignore 80fb726d48Sopenharmony_ci let usage = data.params.drawType === -2; 81fb726d48Sopenharmony_ci let perfCpu = new PerfCpu(data, transfer, res.length); 82fb726d48Sopenharmony_ci let maxEventCount = Math.max( 83fb726d48Sopenharmony_ci ...res.map((it) => { 84fb726d48Sopenharmony_ci // @ts-ignore 85fb726d48Sopenharmony_ci data.params.trafic === TraficEnum.ProtoBuffer && (it = it.hiperfData); 86fb726d48Sopenharmony_ci // @ts-ignore 87fb726d48Sopenharmony_ci return it.eventCount; 88fb726d48Sopenharmony_ci }) 89fb726d48Sopenharmony_ci ); 90fb726d48Sopenharmony_ci res.forEach((it, i) => { 91fb726d48Sopenharmony_ci // @ts-ignore 92fb726d48Sopenharmony_ci data.params.trafic === TraficEnum.ProtoBuffer && (it = it.hiperfData); 93fb726d48Sopenharmony_ci // @ts-ignore 94fb726d48Sopenharmony_ci perfCpu.startNS[i] = it.startNS || it.startNs; //startNS 95fb726d48Sopenharmony_ci // @ts-ignore 96fb726d48Sopenharmony_ci perfCpu.eventCount[i] = it.eventCount; //event_count 97fb726d48Sopenharmony_ci // @ts-ignore 98fb726d48Sopenharmony_ci perfCpu.sampleCount[i] = it.sampleCount; //sample_count 99fb726d48Sopenharmony_ci // @ts-ignore 100fb726d48Sopenharmony_ci perfCpu.eventTypeId[i] = it.eventTypeId; //event_type_id 101fb726d48Sopenharmony_ci // @ts-ignore 102fb726d48Sopenharmony_ci perfCpu.callChainId[i] = it.callchainId; //callchain_id 103fb726d48Sopenharmony_ci if (usage) { 104fb726d48Sopenharmony_ci if (maxCpuCount === -1) { 105fb726d48Sopenharmony_ci // @ts-ignore 106fb726d48Sopenharmony_ci perfCpu.height[i] = Math.floor((it.sampleCount / (10 / intervalPerf)) * 40); 107fb726d48Sopenharmony_ci } else { 108fb726d48Sopenharmony_ci // @ts-ignore 109fb726d48Sopenharmony_ci perfCpu.height[i] = Math.floor((it.sampleCount / (10 / intervalPerf) / maxCpuCount) * 40); 110fb726d48Sopenharmony_ci } 111fb726d48Sopenharmony_ci } else { 112fb726d48Sopenharmony_ci // @ts-ignore 113fb726d48Sopenharmony_ci perfCpu.height[i] = Math.floor((it.eventCount / maxEventCount) * 40); 114fb726d48Sopenharmony_ci } 115fb726d48Sopenharmony_ci }); 116fb726d48Sopenharmony_ci postPerfCpuMessage(data, transfer, perfCpu, res.length); 117fb726d48Sopenharmony_ci} 118fb726d48Sopenharmony_cifunction postPerfCpuMessage(data: unknown, transfer: boolean, perfCpu: PerfCpu, len: number): void { 119fb726d48Sopenharmony_ci (self as unknown as Worker).postMessage( 120fb726d48Sopenharmony_ci { 121fb726d48Sopenharmony_ci transfer: transfer, 122fb726d48Sopenharmony_ci // @ts-ignore 123fb726d48Sopenharmony_ci id: data.id, 124fb726d48Sopenharmony_ci // @ts-ignore 125fb726d48Sopenharmony_ci action: data.action, 126fb726d48Sopenharmony_ci results: transfer 127fb726d48Sopenharmony_ci ? { 128fb726d48Sopenharmony_ci startNS: perfCpu.startNS.buffer, 129fb726d48Sopenharmony_ci eventCount: perfCpu.eventCount.buffer, 130fb726d48Sopenharmony_ci sampleCount: perfCpu.sampleCount.buffer, 131fb726d48Sopenharmony_ci eventTypeId: perfCpu.eventTypeId.buffer, 132fb726d48Sopenharmony_ci callChainId: perfCpu.callChainId.buffer, 133fb726d48Sopenharmony_ci height: perfCpu.height.buffer, 134fb726d48Sopenharmony_ci } 135fb726d48Sopenharmony_ci : {}, 136fb726d48Sopenharmony_ci len: len, 137fb726d48Sopenharmony_ci }, 138fb726d48Sopenharmony_ci transfer 139fb726d48Sopenharmony_ci ? [ 140fb726d48Sopenharmony_ci perfCpu.startNS.buffer, 141fb726d48Sopenharmony_ci perfCpu.eventCount.buffer, 142fb726d48Sopenharmony_ci perfCpu.sampleCount.buffer, 143fb726d48Sopenharmony_ci perfCpu.eventTypeId.buffer, 144fb726d48Sopenharmony_ci perfCpu.callChainId.buffer, 145fb726d48Sopenharmony_ci perfCpu.height.buffer, 146fb726d48Sopenharmony_ci ] 147fb726d48Sopenharmony_ci : [] 148fb726d48Sopenharmony_ci ); 149fb726d48Sopenharmony_ci} 150fb726d48Sopenharmony_ciclass PerfCpu { 151fb726d48Sopenharmony_ci startNS: Float64Array; 152fb726d48Sopenharmony_ci eventCount: Int32Array; 153fb726d48Sopenharmony_ci sampleCount: Int32Array; 154fb726d48Sopenharmony_ci eventTypeId: Int32Array; 155fb726d48Sopenharmony_ci callChainId: Int32Array; 156fb726d48Sopenharmony_ci height: Int32Array; 157fb726d48Sopenharmony_ci constructor(data: unknown, transfer: boolean, len: number) { 158fb726d48Sopenharmony_ci // @ts-ignore 159fb726d48Sopenharmony_ci this.startNS = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.startNS); 160fb726d48Sopenharmony_ci // @ts-ignore 161fb726d48Sopenharmony_ci this.eventCount = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.eventCount); 162fb726d48Sopenharmony_ci // @ts-ignore 163fb726d48Sopenharmony_ci this.sampleCount = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.sampleCount); 164fb726d48Sopenharmony_ci // @ts-ignore 165fb726d48Sopenharmony_ci this.eventTypeId = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.eventTypeId); 166fb726d48Sopenharmony_ci // @ts-ignore 167fb726d48Sopenharmony_ci this.callChainId = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.callChainId); 168fb726d48Sopenharmony_ci // @ts-ignore 169fb726d48Sopenharmony_ci this.height = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.height); 170fb726d48Sopenharmony_ci } 171fb726d48Sopenharmony_ci} 172