xref: /haiku/src/bin/vmstat.cpp (revision f5fb43c94f2cef988b5de1d96ec20200876b7dc5)
1 /*
2  * Copyright 2008, Axel Dörfler, axeld@pinc-software.de.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include <getopt.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 
12 #include <system_info.h>
13 
14 
15 static struct option const kLongOptions[] = {
16 	{"periodic", no_argument, 0, 'p'},
17 	{"rate", required_argument, 0, 'r'},
18 	{"help", no_argument, 0, 'h'},
19 	{NULL}
20 };
21 
22 extern const char *__progname;
23 static const char *kProgramName = __progname;
24 
25 
26 void
usage(int status)27 usage(int status)
28 {
29 	fprintf(stderr, "usage: %s [-p] [-r <time>]\n"
30 		" -p,--periodic\tDumps changes periodically every second.\n"
31 		" -r,--rate\tDumps changes periodically every <time> milli seconds.\n",
32 		kProgramName);
33 
34 	exit(status);
35 }
36 
37 
38 int
main(int argc,char ** argv)39 main(int argc, char** argv)
40 {
41 	bool periodically = false;
42 	bigtime_t rate = 1000000LL;
43 
44 	int c;
45 	while ((c = getopt_long(argc, argv, "pr:h", kLongOptions, NULL)) != -1) {
46 		switch (c) {
47 			case 0:
48 				break;
49 			case 'p':
50 				periodically = true;
51 				break;
52 			case 'r':
53 				rate = atoi(optarg) * 1000LL;
54 				if (rate <= 0) {
55 					fprintf(stderr, "%s: Invalid rate: %s\n",
56 						kProgramName, optarg);
57 					return 1;
58 				}
59 				periodically = true;
60 				break;
61 			case 'h':
62 				usage(0);
63 				break;
64 			default:
65 				usage(1);
66 				break;
67 		}
68 	}
69 	system_info info;
70 	status_t status = get_system_info(&info);
71 	if (status != B_OK) {
72 		fprintf(stderr, "%s: cannot get system info: %s\n", kProgramName,
73 			strerror(status));
74 		return 1;
75 	}
76 
77 	printf("max memory:\t\t%" B_PRIu64 "\n", info.max_pages * B_PAGE_SIZE);
78 	printf("free memory:\t\t%" B_PRIu64 "\n", info.free_memory);
79 	printf("needed memory:\t\t%" B_PRIu64 "\n", info.needed_memory);
80 	printf("block cache memory:\t%" B_PRIu64 "\n",
81 		info.block_cache_pages * B_PAGE_SIZE);
82 	printf("max swap space:\t\t%" B_PRIu64 "\n",
83 		info.max_swap_pages * B_PAGE_SIZE);
84 	printf("free swap space:\t%" B_PRIu64 "\n",
85 		info.free_swap_pages * B_PAGE_SIZE);
86 	printf("page faults:\t\t%" B_PRIu32 "\n", info.page_faults);
87 
88 	if (periodically) {
89 		puts("\npage faults  used memory    used swap  block cache");
90 		system_info lastInfo = info;
91 
92 		while (true) {
93 			snooze(rate);
94 
95 			get_system_info(&info);
96 
97 			int32 pageFaults = info.page_faults - lastInfo.page_faults;
98 			int64 usedMemory
99 				= (info.max_pages * B_PAGE_SIZE - info.free_memory)
100 					- (lastInfo.max_pages * B_PAGE_SIZE - lastInfo.free_memory);
101 			int64 usedSwap
102 				= ((info.max_swap_pages - info.free_swap_pages)
103 						- (lastInfo.max_swap_pages - lastInfo.free_swap_pages))
104 					* B_PAGE_SIZE;
105 			int64 blockCache
106 				= (info.block_cache_pages - lastInfo.block_cache_pages)
107 					* B_PAGE_SIZE;
108 			printf("%11" B_PRId32 "  %11" B_PRId64 "  %11" B_PRId64 "  %11"
109 				B_PRId64 "\n", pageFaults, usedMemory, usedSwap, blockCache);
110 
111 			lastInfo = info;
112 		}
113 	}
114 
115 	return 0;
116 }
117