• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 
16 #include "ecmascript/platform/dfx_hisys_event.h"
17 #ifdef ENABLE_HISYSEVENT
18 #include "hisysevent.h"
19 #endif
20 #ifdef ENABLE_UCOLLECTION
21 #include "cpu_collector_client.h"
22 #endif
23 #include "ecmascript/pgo_profiler/pgo_profiler_manager.h"
24 #include "ecmascript/log_wrapper.h"
25 
26 namespace panda::ecmascript {
27 using PGOProfilerManager = pgo::PGOProfilerManager;
28 
SendLongGCEvent(LongGCStats * longGCStats)29 void DFXHiSysEvent::SendLongGCEvent([[maybe_unused]] LongGCStats *longGCStats)
30 {
31 #ifdef ENABLE_HISYSEVENT
32     LOG_GC(DEBUG) << "SendLongGCEvent: GC_TYPE" << longGCStats->GetGCType()
33         << ";GC_REASON" << longGCStats->GetGCReason()
34         << ";GC_IS_SENSITIVE" << longGCStats->GetGCIsSensitive()
35         << ";GC_TOTAL_TIME" << longGCStats->GetGCTotalTime();
36     int32_t ret = HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::ARKTS_RUNTIME,
37         "ARK_GC_LONG_TIME", OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
38         "BUNDLE_NAME", PGOProfilerManager::GetInstance()->GetBundleName(),
39         "PID", getpid(),
40         "TID", syscall(SYS_gettid),
41         "GC_TYPE", longGCStats->GetGCType(),
42         "GC_REASON", longGCStats->GetGCReason(),
43         "MARK_REASON", longGCStats->GetMarkReason(),
44         "GC_IS_SENSITIVE", static_cast<int>(longGCStats->GetGCIsSensitive()),
45         "GC_IS_INBACKGROUND", static_cast<int>(longGCStats->GetGCIsInBackground()),
46         "GC_TOTAL_TIME", longGCStats->GetGCTotalTime(),
47         "GC_MARK_TIME", longGCStats->GetGCMarkTime(),
48         "GC_EVACUATE_TIME", longGCStats->GetGCEvacuateTime(),
49         "GC_UPDATE_ROOT_TIME", longGCStats->GetGCUpdateRootTime(),
50         "GC_UPDATE_WEEKREF_TIME", longGCStats->GetGCUpdateWeekRefTime(),
51         "GC_UPDATE_REFERENCE_TIME", longGCStats->GetGCUpdateReferenceTime(),
52         "GC_SWEEPNEWTOOLD_TIME", longGCStats->GetGCSweepNewToOldTime(),
53         "GC_FINALIZE_TIME", longGCStats->GetGCFinalizeTime(),
54         "GC_INVOKE_CALLBACK_TIME", longGCStats->GetGCInvokeCallbackTime(),
55         "BEFORE_GC_TOTAL_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCTotalMemUsed()),
56         "BEFORE_GC_TOTAL_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCTotalMemCommitted()),
57         "BEFORE_GC_ACTIVE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCActiveMemUsed()),
58         "BEFORE_GC_ACTIVE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCActiveMemCommitted()),
59         "BEFORE_GC_OLD_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCOldMemUsed()),
60         "BEFORE_GC_OLD_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCOldMemCommitted()),
61         "BEFORE_GC_HUGE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCHugeMemUsed()),
62         "BEFORE_GC_HUGE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCHugeMemCommitted()),
63         "BEFORE_GC_NATIVE_BINDING_SIZE", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCNativeBindingSize()),
64         "BEFORE_GC_NATIVE_LIMIT", LongGCStats::SizeToIntKB(longGCStats->GetBeforeGCNativeLimit()),
65         "AFTER_GC_TOTAL_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCTotalMemUsed()),
66         "AFTER_GC_TOTAL_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCTotalMemCommitted()),
67         "AFTER_GC_ACTIVE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCActiveMemUsed()),
68         "AFTER_GC_ACTIVE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCActiveMemCommitted()),
69         "AFTER_GC_OLD_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCOldMemUsed()),
70         "AFTER_GC_OLD_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCOldMemCommitted()),
71         "AFTER_GC_HUGE_MEM_USED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCHugeMemUsed()),
72         "AFTER_GC_HUGE_MEM_COMMITTED", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCHugeMemCommitted()),
73         "AFTER_GC_NATIVE_BINDING_SIZE", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCNativeBindingSize()),
74         "AFTER_GC_NATIVE_LIMIT", LongGCStats::SizeToIntKB(longGCStats->GetAfterGCNativeLimit()),
75         "CPU_LOAD", longGCStats->GetCpuLoad());
76     if (ret != 0) {
77         LOG_GC(ERROR) << "GCKeyStats HiSysEventWrite ARK_GC_LONG_TIME Failed! ret = " << ret;
78     }
79 #endif
80 }
81 
IsEnableDFXHiSysEvent()82 bool DFXHiSysEvent::IsEnableDFXHiSysEvent()
83 {
84     return true;
85 }
86 
GetCpuUsage()87 double DFXHiSysEvent::GetCpuUsage()
88 {
89 #ifdef ENABLE_UCOLLECTION
90     auto collector = OHOS::HiviewDFX::UCollectClient::CpuCollector::Create();
91     auto collectResult = collector->GetSysCpuUsage();
92     if (collectResult.retCode == OHOS::HiviewDFX::UCollect::UcError::SUCCESS) {
93         LOG_GC(DEBUG) << "GCKeyStats cpu usage: " << collectResult.data;
94         return collectResult.data;
95     }
96     LOG_GC(ERROR) << "GCKeyStats get cpu usage failed, error code: " << collectResult.retCode;
97     return -1.0;
98 #else
99     return -1.0;
100 #endif
101 }
102 }  // namespace panda::ecmascript
103