1*eb293b8fSAndroid Build Coastguard Worker /* 2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project 3*eb293b8fSAndroid Build Coastguard Worker * 4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*eb293b8fSAndroid Build Coastguard Worker * 8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*eb293b8fSAndroid Build Coastguard Worker * 10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License. 15*eb293b8fSAndroid Build Coastguard Worker */ 16*eb293b8fSAndroid Build Coastguard Worker 17*eb293b8fSAndroid Build Coastguard Worker #include <err.h> 18*eb293b8fSAndroid Build Coastguard Worker #include <stdint.h> 19*eb293b8fSAndroid Build Coastguard Worker 20*eb293b8fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h> 21*eb293b8fSAndroid Build Coastguard Worker #include <malloc.h> 22*eb293b8fSAndroid Build Coastguard Worker 23*eb293b8fSAndroid Build Coastguard Worker #include <string> 24*eb293b8fSAndroid Build Coastguard Worker #include <vector> 25*eb293b8fSAndroid Build Coastguard Worker 26*eb293b8fSAndroid Build Coastguard Worker #include <android-base/file.h> 27*eb293b8fSAndroid Build Coastguard Worker #include <android-base/strings.h> 28*eb293b8fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h> 29*eb293b8fSAndroid Build Coastguard Worker 30*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Elf.h> 31*eb293b8fSAndroid Build Coastguard Worker #include <unwindstack/Memory.h> 32*eb293b8fSAndroid Build Coastguard Worker 33*eb293b8fSAndroid Build Coastguard Worker #include "utils/OfflineUnwindUtils.h" 34*eb293b8fSAndroid Build Coastguard Worker 35*eb293b8fSAndroid Build Coastguard Worker #include "Utils.h" 36*eb293b8fSAndroid Build Coastguard Worker GetBenchmarkFilesDirectory()37*eb293b8fSAndroid Build Coastguard Workerstd::string GetBenchmarkFilesDirectory() { 38*eb293b8fSAndroid Build Coastguard Worker std::string path = android::base::GetExecutableDirectory() + "/benchmarks/files/"; 39*eb293b8fSAndroid Build Coastguard Worker unwindstack::DecompressFiles(path); 40*eb293b8fSAndroid Build Coastguard Worker return path; 41*eb293b8fSAndroid Build Coastguard Worker } 42*eb293b8fSAndroid Build Coastguard Worker GetElfFile()43*eb293b8fSAndroid Build Coastguard Workerstd::string GetElfFile() { 44*eb293b8fSAndroid Build Coastguard Worker return GetBenchmarkFilesDirectory() + "libart_arm.so"; 45*eb293b8fSAndroid Build Coastguard Worker } 46*eb293b8fSAndroid Build Coastguard Worker GetSymbolSortedElfFile()47*eb293b8fSAndroid Build Coastguard Workerstd::string GetSymbolSortedElfFile() { 48*eb293b8fSAndroid Build Coastguard Worker return GetBenchmarkFilesDirectory() + "boot_arm.oat"; 49*eb293b8fSAndroid Build Coastguard Worker } 50*eb293b8fSAndroid Build Coastguard Worker GetLargeCompressedFrameElfFile()51*eb293b8fSAndroid Build Coastguard Workerstd::string GetLargeCompressedFrameElfFile() { 52*eb293b8fSAndroid Build Coastguard Worker return GetBenchmarkFilesDirectory() + "libpac.so"; 53*eb293b8fSAndroid Build Coastguard Worker } 54*eb293b8fSAndroid Build Coastguard Worker GetLargeEhFrameElfFile()55*eb293b8fSAndroid Build Coastguard Workerstd::string GetLargeEhFrameElfFile() { 56*eb293b8fSAndroid Build Coastguard Worker return GetBenchmarkFilesDirectory() + "libLLVM_android.so"; 57*eb293b8fSAndroid Build Coastguard Worker } 58*eb293b8fSAndroid Build Coastguard Worker 59*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__) 60*eb293b8fSAndroid Build Coastguard Worker 61*eb293b8fSAndroid Build Coastguard Worker #include <meminfo/procmeminfo.h> 62*eb293b8fSAndroid Build Coastguard Worker #include <procinfo/process_map.h> 63*eb293b8fSAndroid Build Coastguard Worker GetRSSBytes()64*eb293b8fSAndroid Build Coastguard Workeruint64_t GetRSSBytes() { 65*eb293b8fSAndroid Build Coastguard Worker uint64_t total_bytes = 0; 66*eb293b8fSAndroid Build Coastguard Worker android::meminfo::ProcMemInfo proc_mem(getpid()); 67*eb293b8fSAndroid Build Coastguard Worker const std::vector<android::meminfo::Vma>& maps = proc_mem.MapsWithoutUsageStats(); 68*eb293b8fSAndroid Build Coastguard Worker for (auto& vma : maps) { 69*eb293b8fSAndroid Build Coastguard Worker if (vma.name == "[anon:libc_malloc]" || android::base::StartsWith(vma.name, "[anon:scudo:") || 70*eb293b8fSAndroid Build Coastguard Worker android::base::StartsWith(vma.name, "[anon:GWP-ASan")) { 71*eb293b8fSAndroid Build Coastguard Worker android::meminfo::Vma update_vma(vma); 72*eb293b8fSAndroid Build Coastguard Worker if (!proc_mem.FillInVmaStats(update_vma)) { 73*eb293b8fSAndroid Build Coastguard Worker err(1, "FillInVmaStats failed"); 74*eb293b8fSAndroid Build Coastguard Worker } 75*eb293b8fSAndroid Build Coastguard Worker total_bytes += update_vma.usage.rss; 76*eb293b8fSAndroid Build Coastguard Worker } 77*eb293b8fSAndroid Build Coastguard Worker } 78*eb293b8fSAndroid Build Coastguard Worker return total_bytes; 79*eb293b8fSAndroid Build Coastguard Worker } 80*eb293b8fSAndroid Build Coastguard Worker #endif 81*eb293b8fSAndroid Build Coastguard Worker SetBenchmarkCounters(benchmark::State & state)82*eb293b8fSAndroid Build Coastguard Workervoid MemoryTracker::SetBenchmarkCounters(benchmark::State& state) { 83*eb293b8fSAndroid Build Coastguard Worker double total_iterations = static_cast<double>(state.iterations()); 84*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__) 85*eb293b8fSAndroid Build Coastguard Worker state.counters["AVG_RSS_BYTES"] = total_rss_bytes_ / total_iterations; 86*eb293b8fSAndroid Build Coastguard Worker state.counters["MAX_RSS_BYTES"] = max_rss_bytes_; 87*eb293b8fSAndroid Build Coastguard Worker state.counters["MIN_RSS_BYTES"] = min_rss_bytes_; 88*eb293b8fSAndroid Build Coastguard Worker #endif 89*eb293b8fSAndroid Build Coastguard Worker state.counters["AVG_ALLOCATED_BYTES"] = total_alloc_bytes_ / total_iterations; 90*eb293b8fSAndroid Build Coastguard Worker state.counters["MAX_ALLOCATED_BYTES"] = max_alloc_bytes_; 91*eb293b8fSAndroid Build Coastguard Worker state.counters["MIN_ALLOCATED_BYTES"] = min_alloc_bytes_; 92*eb293b8fSAndroid Build Coastguard Worker } 93*eb293b8fSAndroid Build Coastguard Worker StartTrackingAllocations()94*eb293b8fSAndroid Build Coastguard Workervoid MemoryTracker::StartTrackingAllocations() { 95*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__) 96*eb293b8fSAndroid Build Coastguard Worker mallopt(M_PURGE_ALL, 0); 97*eb293b8fSAndroid Build Coastguard Worker rss_bytes_before_ = GetRSSBytes(); 98*eb293b8fSAndroid Build Coastguard Worker #endif 99*eb293b8fSAndroid Build Coastguard Worker alloc_bytes_before_ = mallinfo().uordblks; 100*eb293b8fSAndroid Build Coastguard Worker } 101*eb293b8fSAndroid Build Coastguard Worker StopTrackingAllocations()102*eb293b8fSAndroid Build Coastguard Workervoid MemoryTracker::StopTrackingAllocations() { 103*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__) 104*eb293b8fSAndroid Build Coastguard Worker mallopt(M_PURGE_ALL, 0); 105*eb293b8fSAndroid Build Coastguard Worker #endif 106*eb293b8fSAndroid Build Coastguard Worker uint64_t alloc_bytes = 0; 107*eb293b8fSAndroid Build Coastguard Worker uint64_t alloc_bytes_after = mallinfo().uordblks; 108*eb293b8fSAndroid Build Coastguard Worker if (alloc_bytes_after > alloc_bytes_before_) { 109*eb293b8fSAndroid Build Coastguard Worker alloc_bytes = alloc_bytes_after - alloc_bytes_before_; 110*eb293b8fSAndroid Build Coastguard Worker } 111*eb293b8fSAndroid Build Coastguard Worker total_alloc_bytes_ += alloc_bytes; 112*eb293b8fSAndroid Build Coastguard Worker if (alloc_bytes > max_alloc_bytes_) max_alloc_bytes_ = alloc_bytes; 113*eb293b8fSAndroid Build Coastguard Worker if (alloc_bytes < min_alloc_bytes_) min_alloc_bytes_ = alloc_bytes; 114*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__) 115*eb293b8fSAndroid Build Coastguard Worker uint64_t rss_bytes = 0; 116*eb293b8fSAndroid Build Coastguard Worker uint64_t rss_bytes_after = GetRSSBytes(); 117*eb293b8fSAndroid Build Coastguard Worker if (rss_bytes_after > rss_bytes_before_) { 118*eb293b8fSAndroid Build Coastguard Worker rss_bytes = rss_bytes_after - rss_bytes_before_; 119*eb293b8fSAndroid Build Coastguard Worker } 120*eb293b8fSAndroid Build Coastguard Worker total_rss_bytes_ += rss_bytes; 121*eb293b8fSAndroid Build Coastguard Worker if (rss_bytes > max_rss_bytes_) max_rss_bytes_ = rss_bytes; 122*eb293b8fSAndroid Build Coastguard Worker if (rss_bytes < min_rss_bytes_) min_rss_bytes_ = rss_bytes; 123*eb293b8fSAndroid Build Coastguard Worker #endif 124*eb293b8fSAndroid Build Coastguard Worker } 125