1

Несколько ресурсов в сети (извините за отсутствие удобных ссылок) рекомендуют определять общий объем доступной физической памяти в системе Linux по второму значению в строке "-/+ buffers/cache" в выводе free , с объяснение того, что буферы и кэш могут быть немедленно отброшены, если процесс пытается выделить больше памяти, чем не используется в данный момент (строка «Mem:» free). Я обнаружил, что это утверждение последовательно эмпирически неверно, что означает, что выделение большего объема памяти, чем "не используется", часто приводит к ошибкам.

Исследуя это, я нашел строку «MemAvailable:» в /proc/meminfo и это объяснение:

Subject: provide estimated available memory in /proc/meminfo

Many load balancing and workload placing programs check /proc/meminfo
to estimate how much free memory is available. They generally do this
by adding up "free" and "cached", which was fine ten years ago, but
is pretty much guaranteed to be wrong today.

It is wrong because Cached includes memory that is not freeable as
page cache, for example shared memory segments, tmpfs, and ramfs,
and it does not include reclaimable slab memory, which can take up
a large fraction of system memory on mostly idle systems with lots
of files.

Currently, the amount of memory that is available for a new workload,
without pushing the system into swap, can be estimated from MemFree,
Active(file), Inactive(file), and SReclaimable, as well as the "low"
watermarks from /proc/zoneinfo.

Моя проблема в том, что система, доступная для запуска моих программ, имеет ядро 3.2.0, которое, по-видимому, не предоставляет "MemAvailable".

Мой вопрос: Как я могу (приблизительно) самостоятельно вычислить объем доступной физической памяти, используя ту информацию о памяти, которая мне доступна?

MemTotal:       16536344 kB
MemFree:         8615224 kB
Buffers:          241896 kB
Cached:          1341944 kB
SwapCached:       100232 kB
Active:          5320768 kB
Inactive:        2021312 kB
Active(anon):    4298508 kB
Inactive(anon):  1483164 kB
Active(file):    1022260 kB
Inactive(file):   538148 kB
Unevictable:          32 kB
Mlocked:              32 kB
SwapTotal:       9918460 kB
SwapFree:        7730432 kB
Dirty:                56 kB
Writeback:             0 kB
AnonPages:       5720696 kB
Mapped:           103628 kB
Shmem:             23432 kB
Slab:             432516 kB
SReclaimable:     356780 kB
SUnreclaim:        75736 kB
KernelStack:        7320 kB
PageTables:        69764 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    18186632 kB
Committed_AS:   12325296 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      120924 kB
VmallocChunk:   34351227352 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      103240 kB
DirectMap2M:    16738304 kB

PS: я понимаю, что фактические вычисления подробно описаны в патче к ядру, с которым я связан, но мне трудно связать это с выводом, который мне доступен.

1 ответ1

1

Вот скрипт Perl, который оценивает MemAvailable для версий ядра старше 3.14:

https://github.com/famzah/linux-memavailable-procfs

Он копирует те же вычисления, что и в ядре, но использует только информацию, доступную для пространства пользователя в ядрах до 3.14.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .