2 #include <sys/sysctl.h>
26 static char sbuff
[32];
31 fprintf(stderr
, "usage: %s [-bghkmpt]\n", getprogname());
36 getphysmem(int unused
)
41 size_t len
= sizeof(physcnt
);
43 if (sysctlbyname("hw.physmem", &physcnt
, &len
, NULL
, 0) < 0)
53 unsigned int freecnt
, inactcnt
;
55 len
= sizeof(freecnt
);
56 if (sysctlbyname("vm.stats.vm.v_free_count", &freecnt
, &len
, NULL
, 0) < 0)
57 err(1, "vm.stats.vm.v_free_count");
58 if (sysctlbyname("vm.stats.vm.v_inactive_count", &inactcnt
, &len
, NULL
, 0) < 0)
59 err(1, "vm.stats.vm.v_inactive_count");
62 return (long long)(getphysmem(0) - (freecnt
+ inactcnt
) * pgsz
);
64 return (long long)(freecnt
* pgsz
);
66 return (long long)((freecnt
+ inactcnt
) * pgsz
);
70 getwiredmem(int unused
)
77 len
= sizeof(wirecnt
);
78 if (sysctlbyname("vm.stats.vm.v_wire_count", &wirecnt
, &len
, NULL
, 0) < 0)
79 err(1, "vm.stats.vm.v_wire_count");
81 return (long long)(wirecnt
* pgsz
);
86 getbufcachestats(int unused
)
91 long bufspace
, arcspace
;
92 unsigned int cachecnt
;
94 len
= sizeof(bufspace
);
95 if (sysctlbyname("vfs.bufspace", &bufspace
, &len
, NULL
, 0) < 0)
96 err(1, "vfs.bufspace");
97 /* Ignore failure in case ZFS is not used */
98 (void)sysctlbyname("kstat.zfs.misc.arcstats.size", &arcspace
, &len
, NULL
, 0);
100 len
= sizeof(cachecnt
);
101 if (sysctlbyname("vm.stats.vm.v_cache_count", &cachecnt
, &len
, NULL
, 0) < 0)
102 err(1, "vm.stats.vm.v_inactive_count");
104 return (long long)(cachecnt
* pgsz
+ bufspace
+ arcspace
);
108 getswapstats(int flag
)
111 struct kvm_swap swap
;
113 if ((nswap
= kvm_getswapinfo(kd
, &swap
, 1, 0)) < 0)
114 errx(1, "kvm_getswapinfo: %s", kvm_geterr(kd
));
117 return (long long)(swap
.ksw_total
* pgsz
);
119 return (long long)(swap
.ksw_used
* pgsz
);
121 return (long long)((swap
.ksw_total
- swap
.ksw_used
) * pgsz
);
125 tohumansize(long long bytes
, char **buff
, ConvFlags flag
)
128 double size
= (double)bytes
;
129 char units
[] = {'\0', 'K', 'M', 'G', 'T', 'P'};
132 memset(units
, '\0', sizeof(units
));
134 return asprintf(buff
, "%.0f", size
);
136 while (i
< (int)flag
) {
137 if (size
<= 1024 && flag
== HU_CONV
) break;
142 if (i
== 0 || size
< 0.1)
143 return asprintf(buff
, "%.0f", size
);
145 return asprintf(buff
, "%.1f%c", size
, units
[i
]);
147 return asprintf(buff
, "%.0f%c", size
, units
[i
]);
151 sprintfaligned(char *buff
, size_t len
)
157 ind
= sbuff
+ len
- blen
;
159 size_t t
= sbuff
- ind
;
165 strlcpy(ind
, buff
, blen
+ 1);
171 main(int argc
, char *argv
[])
177 long long (*getmemstats
[])(int) =
178 {getphysmem
, getavailmem
, getavailmem
, getwiredmem
, getbufcachestats
, getavailmem
};
181 while ((c
= getopt(argc
, argv
, "bghkmpt")) >= 0) {
184 flags
= NO_CONV
; break;
186 flags
= KB_CONV
; break;
188 flags
= MB_CONV
; break;
190 flags
= GB_CONV
; break;
192 flags
= TB_CONV
; break;
194 flags
= PB_CONV
; break;
196 flags
= HU_CONV
; break;
202 pgsz
= sysconf(_SC_PAGESIZE
);
204 /* initializing kvm device for swap stats */
205 if (!(kd
= kvm_open(NULL
, "/dev/null", NULL
, 0, "kvm_open")))
208 printf("%16s%12s%12s%12s%12s%12s\nMem:",
209 "total", "used", "free", "wired", "buff/cache", "available");
212 for (i
= 0; i
< 6; i
++) {
213 memset(sbuff
, ' ', sizeof(sbuff
));
214 tohumansize(getmemstats
[i
](i
), &buff
, flags
);
215 sprintfaligned(buff
, offset
);
222 for (i
= 0; i
< 3; i
++) {
223 memset(sbuff
, ' ', sizeof(sbuff
));
224 tohumansize(getswapstats(i
), &buff
, flags
);
225 sprintfaligned(buff
, offset
);