bzr branch
http://darksoft.org/webbzr/perf/perftools
1
by Suren A. Chilingaryan
initial |
1 |
#define _XOPEN_SOURCE 500
|
2 |
#include <stdio.h> |
|
3 |
#include <stdlib.h> |
|
4 |
#include <unistd.h> |
|
5 |
#include <errno.h> |
|
6 |
#include <sys/mman.h> |
|
7 |
#include <sys/sysinfo.h> |
|
8 |
||
9 |
// 8 bytes page tables + 64 bytes mem map
|
|
10 |
// However may be mem_map (struct page) is already excluded?
|
|
11 |
#define BYTES_PER_PAGE 8
|
|
12 |
||
13 |
int main(int argc, char *argv[]) { |
|
14 |
int err; |
|
15 |
size_t size; |
|
16 |
void *buf; |
|
17 |
FILE *f; |
|
18 |
struct sysinfo info; |
|
19 |
||
20 |
if (argc < 2) { |
|
21 |
printf("Usage: %s [+]<GB>\n", argv[0]); |
|
22 |
printf(" + : lock this amount of memory\n"); |
|
23 |
printf(" = : total memory after lock\n"); |
|
24 |
printf(" - : free memory after lock [default]\n"); |
|
25 |
exit(0); |
|
26 |
}
|
|
27 |
||
28 |
f = fopen("/proc/sys/vm/drop_caches", "w"); |
|
29 |
if (!f) { |
|
30 |
printf("Failed to drop caches...\n"); |
|
31 |
exit(-1); |
|
32 |
}
|
|
33 |
fprintf(f, "3\n"); |
|
34 |
fclose(f); |
|
35 |
||
36 |
err = sysinfo(&info); |
|
37 |
if (err) { |
|
38 |
printf("sysinfo failed with errno: %i\n", errno); |
|
39 |
exit(-1); |
|
40 |
}
|
|
41 |
||
42 |
||
43 |
if ((argv[1][0] < '0')||(argv[1][0] > '9')) |
|
44 |
size = atol(argv[1]+1) * 1024 * 1024 * 1024; |
|
45 |
else
|
|
46 |
size = atol(argv[1]) * 1024 * 1024 * 1024; |
|
47 |
||
48 |
if (argv[1][0]=='+') { |
|
49 |
} else if (argv[1][0]=='=') { |
|
50 |
size_t page_size = getpagesize(); |
|
51 |
size_t pages; |
|
52 |
size_t page_tables; |
|
53 |
||
54 |
pages = (info.totalram * info.mem_unit) / page_size; |
|
55 |
page_tables = pages * BYTES_PER_PAGE; |
|
56 |
||
57 |
printf("Detected %zu units of memory, unit size %u\n", info.totalram, info.mem_unit); |
|
58 |
printf("Expected size of page tables: %zu MB, \n", page_tables / 1024 / 1024); |
|
59 |
printf("Leaving aside %zu bytes\n", size); |
|
60 |
||
61 |
if (info.totalram * info.mem_unit < size) { |
|
62 |
printf("Requested more memory (%zu GB) when available (%zu GB)\n", size / 1024 / 1024 / 1024, info.totalram * info.mem_unit / 1024 / 1024 / 1024); |
|
63 |
exit(-1); |
|
64 |
}
|
|
65 |
size = info.totalram * info.mem_unit - size - page_tables; |
|
66 |
} else { |
|
67 |
if (info.freeram*info.mem_unit < size) { |
|
68 |
printf("Requested more memory (%zu GB) when is currently free (%zu GB)\n", size / 1024 / 1024 / 1024, info.freeram * info.mem_unit / 1024 / 1024 / 1024); |
|
69 |
exit(-1); |
|
70 |
}
|
|
71 |
||
72 |
size = info.freeram * info.mem_unit - size; |
|
73 |
}
|
|
74 |
||
75 |
if (!size) exit(0); |
|
76 |
||
77 |
printf("Trying to get %zu bytes\n", size); |
|
78 |
||
79 |
buf = malloc(size); |
|
80 |
if (!buf) { |
|
81 |
printf("Allocation failed\n"); |
|
82 |
exit(-1); |
|
83 |
}
|
|
84 |
||
85 |
||
86 |
err = mlock(buf, size); |
|
87 |
if (err) { |
|
88 |
printf("Locking memory failed, errno: %i\n", errno); |
|
89 |
exit(-1); |
|
90 |
}
|
|
91 |
||
92 |
printf("Locked %zu GB memory\n", size/1024/1024/1024); |
|
93 |
while (1) sleep(60); |
|
94 |
}
|