@@ -112,8 +112,8 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
112
112
loop {
113
113
let mem_state = Memstate :: new ( ) . await ?;
114
114
115
- let mem_total = mem_state. mem_total as f64 * 1024. ;
116
- let mem_free = mem_state. mem_free as f64 * 1024. ;
115
+ let mem_total = mem_state. mem_total as f64 ;
116
+ let mem_free = mem_state. mem_free as f64 ;
117
117
118
118
// TODO: possibly remove this as it is confusing to have `mem_total_used` and `mem_used`
119
119
// htop and such only display equivalent of `mem_used`
@@ -126,8 +126,7 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
126
126
min ( mem_state. mem_available , mem_state. mem_total )
127
127
} else {
128
128
mem_state. mem_free
129
- } as f64
130
- * 1024. ;
129
+ } as f64 ;
131
130
132
131
// While zfs_arc_cache can be considered "available" memory,
133
132
// it can only free a maximum of (zfs_arc_cache - zfs_arc_min) amount.
@@ -137,14 +136,14 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
137
136
. saturating_sub ( mem_state. zfs_arc_min ) as f64 ;
138
137
let mem_avail = mem_avail + zfs_shrinkable_size;
139
138
140
- let pagecache = mem_state. pagecache as f64 * 1024. ;
141
- let reclaimable = mem_state. s_reclaimable as f64 * 1024. ;
142
- let shmem = mem_state. shmem as f64 * 1024. ;
139
+ let pagecache = mem_state. pagecache as f64 ;
140
+ let reclaimable = mem_state. s_reclaimable as f64 ;
141
+ let shmem = mem_state. shmem as f64 ;
143
142
144
143
// See https://lore.kernel.org/lkml/[email protected] /
145
144
let cached = pagecache + reclaimable - shmem + zfs_shrinkable_size;
146
145
147
- let buffers = mem_state. buffers as f64 * 1024. ;
146
+ let buffers = mem_state. buffers as f64 ;
148
147
149
148
// same logic as htop
150
149
let used_diff = mem_free + buffers + pagecache + reclaimable;
@@ -157,14 +156,14 @@ pub async fn run(config: &Config, api: &CommonApi) -> Result<()> {
157
156
// account for ZFS ARC cache
158
157
let mem_used = mem_used - zfs_shrinkable_size;
159
158
160
- let swap_total = mem_state. swap_total as f64 * 1024. ;
161
- let swap_free = mem_state. swap_free as f64 * 1024. ;
162
- let swap_cached = mem_state. swap_cached as f64 * 1024. ;
159
+ let swap_total = mem_state. swap_total as f64 ;
160
+ let swap_free = mem_state. swap_free as f64 ;
161
+ let swap_cached = mem_state. swap_cached as f64 ;
163
162
let swap_used = swap_total - swap_free - swap_cached;
164
163
165
164
// Zswap usage
166
- let zswap_compressed = mem_state. zswap_compressed as f64 * 1024. ;
167
- let zswap_decompressed = mem_state. zswap_decompressed as f64 * 1024. ;
165
+ let zswap_compressed = mem_state. zswap_compressed as f64 ;
166
+ let zswap_decompressed = mem_state. zswap_decompressed as f64 ;
168
167
169
168
let zswap_comp_ratio = if zswap_compressed != 0.0 {
170
169
zswap_decompressed / zswap_compressed
@@ -310,19 +309,23 @@ impl Memstate {
310
309
. and_then ( |x| u64:: from_str ( x) . ok ( ) )
311
310
. error ( "failed to parse /proc/meminfo" ) ?;
312
311
312
+ // These values are reported as “kB” but are actually “kiB”.
313
+ // Convert them into bytes to avoid having to handle this later.
314
+ // Source: https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-meminfo#s2-proc-meminfo
315
+ const KIB : u64 = 1024 ;
313
316
match name {
314
- "MemTotal:" => mem_state. mem_total = val,
315
- "MemFree:" => mem_state. mem_free = val,
316
- "MemAvailable:" => mem_state. mem_available = val,
317
- "Buffers:" => mem_state. buffers = val,
318
- "Cached:" => mem_state. pagecache = val,
319
- "SReclaimable:" => mem_state. s_reclaimable = val,
320
- "Shmem:" => mem_state. shmem = val,
321
- "SwapTotal:" => mem_state. swap_total = val,
322
- "SwapFree:" => mem_state. swap_free = val,
323
- "SwapCached:" => mem_state. swap_cached = val,
324
- "Zswap:" => mem_state. zswap_compressed = val,
325
- "Zswapped:" => mem_state. zswap_decompressed = val,
317
+ "MemTotal:" => mem_state. mem_total = val * KIB ,
318
+ "MemFree:" => mem_state. mem_free = val * KIB ,
319
+ "MemAvailable:" => mem_state. mem_available = val * KIB ,
320
+ "Buffers:" => mem_state. buffers = val * KIB ,
321
+ "Cached:" => mem_state. pagecache = val * KIB ,
322
+ "SReclaimable:" => mem_state. s_reclaimable = val * KIB ,
323
+ "Shmem:" => mem_state. shmem = val * KIB ,
324
+ "SwapTotal:" => mem_state. swap_total = val * KIB ,
325
+ "SwapFree:" => mem_state. swap_free = val * KIB ,
326
+ "SwapCached:" => mem_state. swap_cached = val * KIB ,
327
+ "Zswap:" => mem_state. zswap_compressed = val * KIB ,
328
+ "Zswapped:" => mem_state. zswap_decompressed = val * KIB ,
326
329
_ => ( ) ,
327
330
}
328
331
0 commit comments