The percentage is equivalent to 100*used/total, as you imagined.
The percentage is 100*(1-available/total), confusingly different from 100*used/total.
Here, "available" means the same as shown in free.
Related threads:
Reference manual
The behavior is documented in the reference manual.
In the alternate memory display modes, two abbreviated summary lines are
shown consisting of these elements:
a b c
GiB Mem : 18.7/15.738 [ ... ]
GiB Swap: 0.0/7.999 [ ... ]
Where: a) is the percentage used; b) is the total available; and c) > is
one of two visual graphs of those representations.
In the case of physical memory, the percentage represents the total
minus the estimated avail noted above. The `Mem' graph itself is
divided between the non-cached portion of used and any remaining
memory not otherwise accounted for by avail. See topic 4b. SUMMARY
AREA Commands and the `m' command for additional information on that
special 4-way toggle.
Source code of top
As of now, it can be verified by investigating the source code.
#ifdef MEMGRAPH_OLD
my_misc = my_qued;
#else
my_misc = MEM_VAL(mem_TOT) - MEM_VAL(mem_AVL) - my_used;
#endif
Graph_mems->total = MEM_VAL(mem_TOT);
Graph_mems->part1 = my_used;
Graph_mems->part2 = my_misc;
if (these->total > 0)
scale = 100.0 / these->total;
rx.pcnt_one = scale * these->part1;
rx.pcnt_two = scale * these->part2;
if (rx.pcnt_one + rx.pcnt_two > 100.0 || rx.pcnt_two < 0)
rx.pcnt_two = 0;
rx.pcnt_tot = rx.pcnt_one + rx.pcnt_two;
prT(bfT(0), mkM(MEM_VAL(mem_TOT))); prT(bfT(1), mkM(MEM_VAL(mem_FRE)));
prT(bfT(2), mkM(MEM_VAL(mem_USE))); prT(bfT(3), mkM(my_qued));
prT(bfT(4), mkM(MEM_VAL(swp_TOT))); prT(bfT(5), mkM(MEM_VAL(swp_FRE)));
prT(bfT(6), mkM(MEM_VAL(swp_USE))); prT(bfT(7), mkM(MEM_VAL(mem_AVL)));
snprintf(row, sizeof(row), N_unq(MEMORY_line1_fmt)
, scT(label), N_txt(WORD_abv_mem_txt), bfT(0), bfT(1), bfT(2), bfT(3));
Msg_row += sum_see(row, mem2UP);
On the reported inconsistency
- Did you check if your snapshots that you're matching are produced at the same system state? If printed at the same time, the used memory might be just 88.7% even in the default view.
- What is the version of your
top? The current behavior of memory window has been introduced in 3.3.10.
- Which platform are you running it on?
It seems there are some flags that can change the data passed to graph.
Corrected after further information and reveiw.