2 * Copyright (c) 1999-2016 Apple Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
22 * @APPLE_LICENSE_HEADER_END@
26 * Author: Avadis Tevanian, Jr.
28 * Copyright (C) 1986, Avadis Tevanian, Jr.
31 * Display Mach VM statistics.
33 ************************************************************************
35 * 6-Jun-86 Avadis Tevanian, Jr. (avie) at Carnegie-Mellon University
36 * Use official Mach interface.
38 * 25-mar-99 A.Ramesh at Apple
41 * 22-Jan-09 R.Branche at Apple
42 * Changed some fields to 64-bit to alleviate overflows
43 ************************************************************************
52 #include <mach/mach.h>
53 #include <mach/vm_page_size.h>
55 vm_statistics64_data_t vm_stat
, last
;
61 void sspstat(char *str
, uint64_t n
);
63 void print_stats(void);
64 void get_stats(vm_statistics64_t stat
);
66 void pstat(uint64_t n
, int width
);
69 main(int argc
, char *argv
[])
79 while ((c
= getopt (argc
, argv
, "c:")) != -1) {
82 count
= (int)strtol(optarg
, NULL
, 10);
84 warnx("count must be positive");
94 argc
-= optind
; argv
+= optind
;
97 delay
= strtod(argv
[0], NULL
);
100 } else if (argc
> 1) {
104 myHost
= mach_host_self();
110 for (int i
= 1; i
< count
|| count
== 0; i
++ ){
111 usleep((int)(delay
* USEC_PER_SEC
));
121 fprintf(stderr
, "usage: %s [[-c count] interval]\n", pgmname
);
129 printf("Mach Virtual Memory Statistics: (page size of %llu bytes)\n", (mach_vm_size_t
)vm_kernel_page_size
);
131 sspstat("Pages free:", (uint64_t) (vm_stat
.free_count
- vm_stat
.speculative_count
));
132 sspstat("Pages active:", (uint64_t) (vm_stat
.active_count
));
133 sspstat("Pages inactive:", (uint64_t) (vm_stat
.inactive_count
));
134 sspstat("Pages speculative:", (uint64_t) (vm_stat
.speculative_count
));
135 sspstat("Pages throttled:", (uint64_t) (vm_stat
.throttled_count
));
136 sspstat("Pages wired down:", (uint64_t) (vm_stat
.wire_count
));
137 sspstat("Pages purgeable:", (uint64_t) (vm_stat
.purgeable_count
));
138 sspstat("\"Translation faults\":", (uint64_t) (vm_stat
.faults
));
139 sspstat("Pages copy-on-write:", (uint64_t) (vm_stat
.cow_faults
));
140 sspstat("Pages zero filled:", (uint64_t) (vm_stat
.zero_fill_count
));
141 sspstat("Pages reactivated:", (uint64_t) (vm_stat
.reactivations
));
142 sspstat("Pages purged:", (uint64_t) (vm_stat
.purges
));
143 sspstat("File-backed pages:", (uint64_t) (vm_stat
.external_page_count
));
144 sspstat("Anonymous pages:", (uint64_t) (vm_stat
.internal_page_count
));
145 sspstat("Pages stored in compressor:", (uint64_t) (vm_stat
.total_uncompressed_pages_in_compressor
));
146 sspstat("Pages occupied by compressor:", (uint64_t) (vm_stat
.compressor_page_count
));
147 sspstat("Decompressions:", (uint64_t) (vm_stat
.decompressions
));
148 sspstat("Compressions:", (uint64_t) (vm_stat
.compressions
));
149 sspstat("Pageins:", (uint64_t) (vm_stat
.pageins
));
150 sspstat("Pageouts:", (uint64_t) (vm_stat
.pageouts
));
151 sspstat("Swapins:", (uint64_t) (vm_stat
.swapins
));
152 sspstat("Swapouts:", (uint64_t) (vm_stat
.swapouts
));
156 sspstat(char *str
, uint64_t n
)
158 printf("%-30s %16llu.\n", str
, n
);
165 printf("Mach Virtual Memory Statistics: ");
166 printf("(page size of %llu bytes)\n", (mach_vm_size_t
)vm_kernel_page_size
);
167 printf("%8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %11s %9s %8s %8s %8s %8s %8s %8s %8s %8s\n",
190 bzero(&last
, sizeof(last
));
196 static int count
= 0;
205 pstat((uint64_t) (vm_stat
.free_count
- vm_stat
.speculative_count
), 8);
206 pstat((uint64_t) (vm_stat
.active_count
), 8);
207 pstat((uint64_t) (vm_stat
.speculative_count
), 8);
208 pstat((uint64_t) (vm_stat
.inactive_count
), 8);
209 pstat((uint64_t) (vm_stat
.throttled_count
), 8);
210 pstat((uint64_t) (vm_stat
.wire_count
), 8);
211 pstat((uint64_t) (vm_stat
.purgeable_count
), 8);
212 pstat((uint64_t) (vm_stat
.faults
- last
.faults
), 8);
213 pstat((uint64_t) (vm_stat
.cow_faults
- last
.cow_faults
), 8);
214 pstat((uint64_t) (vm_stat
.zero_fill_count
- last
.zero_fill_count
), 8);
215 pstat((uint64_t) (vm_stat
.reactivations
- last
.reactivations
), 8);
216 pstat((uint64_t) (vm_stat
.purges
- last
.purges
), 8);
217 pstat((uint64_t) (vm_stat
.external_page_count
), 11);
218 pstat((uint64_t) (vm_stat
.internal_page_count
), 9);
219 pstat((uint64_t) (vm_stat
.total_uncompressed_pages_in_compressor
), 8);
220 pstat((uint64_t) (vm_stat
.compressor_page_count
), 8);
221 pstat((uint64_t) (vm_stat
.decompressions
- last
.decompressions
), 8);
222 pstat((uint64_t) (vm_stat
.compressions
- last
.compressions
), 8);
223 pstat((uint64_t) (vm_stat
.pageins
- last
.pageins
), 8);
224 pstat((uint64_t) (vm_stat
.pageouts
- last
.pageouts
), 8);
225 pstat((uint64_t) (vm_stat
.swapins
- last
.swapins
), 8);
226 pstat((uint64_t) (vm_stat
.swapouts
- last
.swapouts
), 8);
232 pstat(uint64_t n
, int width
)
235 if (width
>= sizeof(buf
)) {
236 width
= sizeof(buf
) -1;
239 /* Now that we have the speculative field, there is really not enough
240 space, but we were actually overflowing three or four fields before
241 anyway. So any field that overflows we drop some insignifigant
242 digets and slap on the appropriate suffix
244 int w
= snprintf(buf
, sizeof(buf
), "%*llu", width
, n
);
246 w
= snprintf(buf
, sizeof(buf
), "%*lluK", width
-1, n
/ 1000);
248 w
= snprintf(buf
, sizeof(buf
), "%*lluM", width
-1, n
/ 1000000);
250 w
= snprintf(buf
, sizeof(buf
), "%*lluG", width
-1, n
/ 1000000000);
259 get_stats(vm_statistics64_t stat
)
261 unsigned int count
= HOST_VM_INFO64_COUNT
;
263 if ((ret
= host_statistics64(myHost
, HOST_VM_INFO64
, (host_info64_t
)stat
, &count
) != KERN_SUCCESS
)) {
264 fprintf(stderr
, "%s: failed to get statistics. error %d\n", pgmname
, ret
);