Рассмотрим следующее:
$ dmesg | grep 'Memory:'
[ 0.000000] Memory: 8009456K/8272776K available (8474K kernel code, 1293K rwdata, 3984K rodata, 1488K init, 1316K bss, 263320K reserved, 0K cma-reserved)
Фактически, это говорит о том, что при загрузке система имеет 8009456K, доступных для задач (за исключением зарезервированных ресурсов). Тем не менее, после загрузки free
и vmstat
сообщают о чем-то очень странном
$ free -k ; vmstat -s | head -n 1
total used free shared buff/cache available
Mem: 8059880 2774996 2667600 394196 2617284 4529964
Swap: 1048572 412 1048160
8059880 K total memory
Как ни странно, система, которая уже загрузилась, имеет больше доступной памяти, что кажется логически противоположной что и следовало ожидать - во время загрузки должно быть запущено меньше процессов, поэтому должно быть доступно больше общего объема используемой памяти. Как это можно объяснить?
Во время загрузки и на более поздней стадии, чем извлеченная строка dmseg, обычно освобождается некоторая память. Давайте рассмотрим пример с моего компьютера:
Сначала немного изменим команду извлечения dmesg (отредактировано):
$ dmesg | grep -i 'Memory:'
...[snip]...
[ 0.000000] Memory: 15829128K/16472972K available (8480K kernel code, 1294K rwdata, 3984K rodata, 1492K init, 1316K bss, 643844K reserved, 0K cma-reserved)
[ 0.009844] Freeing SMP alternatives memory: 32K
[ 0.868465] Freeing initrd memory: 37044K
[ 2.621648] Freeing unused kernel memory: 1492K
[ 2.624095] Freeing unused kernel memory: 1748K
[ 2.625334] Freeing unused kernel memory: 112K
Обратите внимание на освобожденную память выше, после итоговой строки. Суммируя их все, я получаю, что у меня должно быть всего 15869556. Теперь давайте проверим, используя ту же команду:
$ free -k ; vmstat -s | head -n 1
total used free shared buff/cache available
Mem: 15869556 113352 15461820 9792 294384 15454760
Swap: 16472060 0 16472060
15869556 K total memory
Обратите внимание, что ожидаемая сумма точно равна фактической сумме.