blob: 2660a4d5834cdc03568f473ac79d598fdb6998ef [file] [log] [blame]
Sandeep Patila60a7762018-08-29 17:10:47 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <meminfo/sysmeminfo.h>
18
19#include <fcntl.h>
Sandeep Patil9f4028d2018-11-09 19:18:29 -080020#include <inttypes.h>
21#include <stdio.h>
Sandeep Patila60a7762018-08-29 17:10:47 -070022#include <sys/stat.h>
23#include <sys/types.h>
24
25#include <string>
26
27#include <android-base/file.h>
28#include <android-base/logging.h>
Sandeep Patila60a7762018-08-29 17:10:47 -070029
30#include <benchmark/benchmark.h>
31
Sandeep Patile473d7e2018-12-11 09:28:38 -080032using ::android::meminfo::SysMemInfo;
33
Sandeep Patila60a7762018-08-29 17:10:47 -070034enum {
35 MEMINFO_TOTAL,
36 MEMINFO_FREE,
37 MEMINFO_BUFFERS,
38 MEMINFO_CACHED,
39 MEMINFO_SHMEM,
40 MEMINFO_SLAB,
41 MEMINFO_SLAB_RECLAIMABLE,
42 MEMINFO_SLAB_UNRECLAIMABLE,
43 MEMINFO_SWAP_TOTAL,
44 MEMINFO_SWAP_FREE,
45 MEMINFO_ZRAM_TOTAL,
46 MEMINFO_MAPPED,
47 MEMINFO_VMALLOC_USED,
48 MEMINFO_PAGE_TABLES,
49 MEMINFO_KERNEL_STACK,
50 MEMINFO_COUNT
51};
52
Sandeep Patil9f4028d2018-11-09 19:18:29 -080053static void get_mem_info(uint64_t mem[], const char* file) {
Sandeep Patila60a7762018-08-29 17:10:47 -070054 char buffer[4096];
55 unsigned int numFound = 0;
56
57 int fd = open(file, O_RDONLY);
58
59 if (fd < 0) {
60 printf("Unable to open %s: %s\n", file, strerror(errno));
61 return;
62 }
63
64 const int len = read(fd, buffer, sizeof(buffer) - 1);
65 close(fd);
66
67 if (len < 0) {
68 printf("Empty %s\n", file);
69 return;
70 }
71 buffer[len] = 0;
72
73 static const char* const tags[] = {
Sandeep Patil9f4028d2018-11-09 19:18:29 -080074 "MemTotal:", "MemFree:", "Buffers:", "Cached:", "Shmem:", "Slab:",
75 "SReclaimable:", "SUnreclaim:", "SwapTotal:", "SwapFree:", "ZRam:", "Mapped:",
Sandeep Patile473d7e2018-12-11 09:28:38 -080076 "VmallocUsed:", "PageTables:", "KernelStack:", NULL};
Sandeep Patila60a7762018-08-29 17:10:47 -070077
78 static const int tagsLen[] = {9, 8, 8, 7, 6, 5, 13, 11, 10, 9, 5, 7, 12, 11, 12, 0};
79
80 memset(mem, 0, sizeof(uint64_t) * 15);
81 char* p = buffer;
82 while (*p && (numFound < (sizeof(tagsLen) / sizeof(tagsLen[0])))) {
83 int i = 0;
84 while (tags[i]) {
Sandeep Patil9f4028d2018-11-09 19:18:29 -080085 // std::cout << "tag =" << tags[i] << " p = " << std::string(p, tagsLen[i]) <<
86 // std::endl;
Sandeep Patila60a7762018-08-29 17:10:47 -070087 if (strncmp(p, tags[i], tagsLen[i]) == 0) {
88 p += tagsLen[i];
89 while (*p == ' ') p++;
90 char* num = p;
91 while (*p >= '0' && *p <= '9') p++;
92 if (*p != 0) {
93 *p = 0;
94 p++;
95 }
96 mem[i] = atoll(num);
97 numFound++;
98 break;
99 }
100 i++;
101 }
102 while (*p && *p != '\n') {
103 p++;
104 }
105 if (*p) p++;
106 }
107}
108
Sandeep Patile473d7e2018-12-11 09:28:38 -0800109static void BM_ReadMemInfo_old(benchmark::State& state) {
Sandeep Patila60a7762018-08-29 17:10:47 -0700110 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
111MemFree: 1809728 kB
112MemAvailable: 2546560 kB
113Buffers: 54736 kB
114Cached: 776052 kB
115SwapCached: 0 kB
116Active: 445856 kB
117Inactive: 459092 kB
118Active(anon): 78492 kB
119Inactive(anon): 2240 kB
120Active(file): 367364 kB
121Inactive(file): 456852 kB
122Unevictable: 3096 kB
123Mlocked: 3096 kB
124SwapTotal: 0 kB
125SwapFree: 0 kB
126Dirty: 32 kB
127Writeback: 0 kB
128AnonPages: 74988 kB
129Mapped: 62624 kB
130Shmem: 4020 kB
131Slab: 86464 kB
132SReclaimable: 44432 kB
133SUnreclaim: 42032 kB
134KernelStack: 4880 kB
135PageTables: 2900 kB
136NFS_Unstable: 0 kB
137Bounce: 0 kB
138WritebackTmp: 0 kB
139CommitLimit: 1509868 kB
140Committed_AS: 80296 kB
141VmallocTotal: 263061440 kB
142VmallocUsed: 0 kB
143VmallocChunk: 0 kB
144AnonHugePages: 6144 kB
145ShmemHugePages: 0 kB
146ShmemPmdMapped: 0 kB
147CmaTotal: 131072 kB
148CmaFree: 130380 kB
149HugePages_Total: 0
150HugePages_Free: 0
151HugePages_Rsvd: 0
152HugePages_Surp: 0
153Hugepagesize: 2048 kB)meminfo";
154
155 TemporaryFile tf;
156 ::android::base::WriteStringToFd(meminfo, tf.fd);
157
158 uint64_t mem[MEMINFO_COUNT];
159 for (auto _ : state) {
160 get_mem_info(mem, tf.path);
161 }
162}
Sandeep Patile473d7e2018-12-11 09:28:38 -0800163BENCHMARK(BM_ReadMemInfo_old);
Sandeep Patila60a7762018-08-29 17:10:47 -0700164
Sandeep Patile473d7e2018-12-11 09:28:38 -0800165static void BM_ReadMemInfo_new(benchmark::State& state) {
Sandeep Patila60a7762018-08-29 17:10:47 -0700166 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
167MemFree: 1809728 kB
168MemAvailable: 2546560 kB
169Buffers: 54736 kB
170Cached: 776052 kB
171SwapCached: 0 kB
172Active: 445856 kB
173Inactive: 459092 kB
174Active(anon): 78492 kB
175Inactive(anon): 2240 kB
176Active(file): 367364 kB
177Inactive(file): 456852 kB
178Unevictable: 3096 kB
179Mlocked: 3096 kB
180SwapTotal: 0 kB
181SwapFree: 0 kB
182Dirty: 32 kB
183Writeback: 0 kB
184AnonPages: 74988 kB
185Mapped: 62624 kB
186Shmem: 4020 kB
187Slab: 86464 kB
188SReclaimable: 44432 kB
189SUnreclaim: 42032 kB
190KernelStack: 4880 kB
191PageTables: 2900 kB
192NFS_Unstable: 0 kB
193Bounce: 0 kB
194WritebackTmp: 0 kB
195CommitLimit: 1509868 kB
196Committed_AS: 80296 kB
197VmallocTotal: 263061440 kB
198VmallocUsed: 0 kB
199VmallocChunk: 0 kB
200AnonHugePages: 6144 kB
201ShmemHugePages: 0 kB
202ShmemPmdMapped: 0 kB
203CmaTotal: 131072 kB
204CmaFree: 130380 kB
205HugePages_Total: 0
206HugePages_Free: 0
207HugePages_Rsvd: 0
208HugePages_Surp: 0
209Hugepagesize: 2048 kB)meminfo";
210
211 TemporaryFile tf;
212 android::base::WriteStringToFd(meminfo, tf.fd);
213
214 std::string file = std::string(tf.path);
Sandeep Patile473d7e2018-12-11 09:28:38 -0800215 std::vector<uint64_t> mem(MEMINFO_COUNT);
216 const std::vector<std::string> tags = {
217 SysMemInfo::kMemTotal, SysMemInfo::kMemFree, SysMemInfo::kMemBuffers,
218 SysMemInfo::kMemCached, SysMemInfo::kMemShmem, SysMemInfo::kMemSlab,
219 SysMemInfo::kMemSReclaim, SysMemInfo::kMemSUnreclaim, SysMemInfo::kMemSwapTotal,
220 SysMemInfo::kMemSwapFree, SysMemInfo::kMemMapped, SysMemInfo::kMemVmallocUsed,
221 SysMemInfo::kMemPageTables, SysMemInfo::kMemKernelStack,
222 };
223
224 SysMemInfo smi;
Sandeep Patila60a7762018-08-29 17:10:47 -0700225 for (auto _ : state) {
Sandeep Patile473d7e2018-12-11 09:28:38 -0800226 smi.ReadMemInfo(tags, &mem, file);
Sandeep Patila60a7762018-08-29 17:10:47 -0700227 }
228}
Sandeep Patile473d7e2018-12-11 09:28:38 -0800229BENCHMARK(BM_ReadMemInfo_new);
Sandeep Patila60a7762018-08-29 17:10:47 -0700230
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800231static uint64_t get_zram_mem_used(const std::string& zram_dir) {
232 FILE* f = fopen((zram_dir + "mm_stat").c_str(), "r");
233 if (f) {
234 uint64_t mem_used_total = 0;
235
236 int matched = fscanf(f, "%*d %*d %" SCNu64 " %*d %*d %*d %*d", &mem_used_total);
237 if (matched != 1)
238 fprintf(stderr, "warning: failed to parse %s\n", (zram_dir + "mm_stat").c_str());
239
240 fclose(f);
241 return mem_used_total;
242 }
243
244 f = fopen((zram_dir + "mem_used_total").c_str(), "r");
245 if (f) {
246 uint64_t mem_used_total = 0;
247
248 int matched = fscanf(f, "%" SCNu64, &mem_used_total);
249 if (matched != 1)
250 fprintf(stderr, "warning: failed to parse %s\n", (zram_dir + "mem_used_total").c_str());
251
252 fclose(f);
253 return mem_used_total;
254 }
255
256 return 0;
257}
258
Sandeep Patile473d7e2018-12-11 09:28:38 -0800259static void BM_ZramTotal_old(benchmark::State& state) {
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800260 std::string exec_dir = ::android::base::GetExecutableDirectory();
261 std::string zram_mmstat_dir = exec_dir + "/testdata1/";
262 for (auto _ : state) {
263 uint64_t zram_total __attribute__((unused)) = get_zram_mem_used(zram_mmstat_dir) / 1024;
264 }
265}
Sandeep Patile473d7e2018-12-11 09:28:38 -0800266BENCHMARK(BM_ZramTotal_old);
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800267
Sandeep Patile473d7e2018-12-11 09:28:38 -0800268static void BM_ZramTotal_new(benchmark::State& state) {
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800269 std::string exec_dir = ::android::base::GetExecutableDirectory();
270 std::string zram_mmstat_dir = exec_dir + "/testdata1/";
Sandeep Patile473d7e2018-12-11 09:28:38 -0800271 SysMemInfo smi;
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800272 for (auto _ : state) {
Sandeep Patile473d7e2018-12-11 09:28:38 -0800273 uint64_t zram_total __attribute__((unused)) = smi.mem_zram_kb(zram_mmstat_dir);
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800274 }
275}
Sandeep Patile473d7e2018-12-11 09:28:38 -0800276BENCHMARK(BM_ZramTotal_new);
277
278static void BM_MemInfoWithZram_old(benchmark::State& state) {
279 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
280MemFree: 1809728 kB
281MemAvailable: 2546560 kB
282Buffers: 54736 kB
283Cached: 776052 kB
284SwapCached: 0 kB
285Active: 445856 kB
286Inactive: 459092 kB
287Active(anon): 78492 kB
288Inactive(anon): 2240 kB
289Active(file): 367364 kB
290Inactive(file): 456852 kB
291Unevictable: 3096 kB
292Mlocked: 3096 kB
293SwapTotal: 0 kB
294SwapFree: 0 kB
295Dirty: 32 kB
296Writeback: 0 kB
297AnonPages: 74988 kB
298Mapped: 62624 kB
299Shmem: 4020 kB
300Slab: 86464 kB
301SReclaimable: 44432 kB
302SUnreclaim: 42032 kB
303KernelStack: 4880 kB
304PageTables: 2900 kB
305NFS_Unstable: 0 kB
306Bounce: 0 kB
307WritebackTmp: 0 kB
308CommitLimit: 1509868 kB
309Committed_AS: 80296 kB
310VmallocTotal: 263061440 kB
311VmallocUsed: 0 kB
312VmallocChunk: 0 kB
313AnonHugePages: 6144 kB
314ShmemHugePages: 0 kB
315ShmemPmdMapped: 0 kB
316CmaTotal: 131072 kB
317CmaFree: 130380 kB
318HugePages_Total: 0
319HugePages_Free: 0
320HugePages_Rsvd: 0
321HugePages_Surp: 0
322Hugepagesize: 2048 kB)meminfo";
323
324 TemporaryFile tf;
325 ::android::base::WriteStringToFd(meminfo, tf.fd);
326 std::string exec_dir = ::android::base::GetExecutableDirectory();
327 std::string zram_mmstat_dir = exec_dir + "/testdata1/";
328 uint64_t mem[MEMINFO_COUNT];
329 for (auto _ : state) {
330 get_mem_info(mem, tf.path);
331 mem[MEMINFO_ZRAM_TOTAL] = get_zram_mem_used("/sys/block/zram0/") / 1024;
332 CHECK_EQ(mem[MEMINFO_KERNEL_STACK], 4880u);
333 }
334}
335BENCHMARK(BM_MemInfoWithZram_old);
336
337static void BM_MemInfoWithZram_new(benchmark::State& state) {
338 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
339MemFree: 1809728 kB
340MemAvailable: 2546560 kB
341Buffers: 54736 kB
342Cached: 776052 kB
343SwapCached: 0 kB
344Active: 445856 kB
345Inactive: 459092 kB
346Active(anon): 78492 kB
347Inactive(anon): 2240 kB
348Active(file): 367364 kB
349Inactive(file): 456852 kB
350Unevictable: 3096 kB
351Mlocked: 3096 kB
352SwapTotal: 0 kB
353SwapFree: 0 kB
354Dirty: 32 kB
355Writeback: 0 kB
356AnonPages: 74988 kB
357Mapped: 62624 kB
358Shmem: 4020 kB
359Slab: 86464 kB
360SReclaimable: 44432 kB
361SUnreclaim: 42032 kB
362KernelStack: 4880 kB
363PageTables: 2900 kB
364NFS_Unstable: 0 kB
365Bounce: 0 kB
366WritebackTmp: 0 kB
367CommitLimit: 1509868 kB
368Committed_AS: 80296 kB
369VmallocTotal: 263061440 kB
370VmallocUsed: 0 kB
371VmallocChunk: 0 kB
372AnonHugePages: 6144 kB
373ShmemHugePages: 0 kB
374ShmemPmdMapped: 0 kB
375CmaTotal: 131072 kB
376CmaFree: 130380 kB
377HugePages_Total: 0
378HugePages_Free: 0
379HugePages_Rsvd: 0
380HugePages_Surp: 0
381Hugepagesize: 2048 kB)meminfo";
382
383 TemporaryFile tf;
384 android::base::WriteStringToFd(meminfo, tf.fd);
385
386 std::string file = std::string(tf.path);
387 std::vector<uint64_t> mem(MEMINFO_COUNT);
388 std::vector<std::string> tags(SysMemInfo::kDefaultSysMemInfoTags);
389 auto it = tags.begin();
390 tags.insert(it + MEMINFO_ZRAM_TOTAL, "Zram:");
391 SysMemInfo smi;
392
393 for (auto _ : state) {
394 smi.ReadMemInfo(tags, &mem, file);
395 CHECK_EQ(mem[MEMINFO_KERNEL_STACK], 4880u);
396 }
397}
398BENCHMARK(BM_MemInfoWithZram_new);
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800399
Sandeep Patila60a7762018-08-29 17:10:47 -0700400BENCHMARK_MAIN();