Итак, у меня есть система с ядром linux 4.14.73, в которой я использую значения из / proc / meminfo в программе, которая показывает системные характеристики, включая используемую память и зарезервированную память. Все было хорошо, пока я не увидел что-то действительно странное: общая выделенная память меньше используемой (или в / proc / meminfo термины COMMITTED_AS <MEMTOTAL - MEMAVAILABLE). Вот результат работы / proc / meminfo:
# cat /proc/meminfo
MemTotal: 32911616 kB
MemFree: 32322628 kB
MemAvailable: 32360768 kB
Buffers: 4604 kB
Cached: 304088 kB
SwapCached: 0 kB
Active: 83876 kB
Inactive: 263204 kB
Active(anon): 46680 kB
Inactive(anon): 152 kB
Active(file): 37196 kB
Inactive(file): 263052 kB
Unevictable: 83788 kB
Mlocked: 83788 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 122204 kB
Mapped: 22348 kB
Shmem: 1328 kB
Slab: 52696 kB
SReclaimable: 28548 kB
SUnreclaim: 24148 kB
KernelStack: 2896 kB
PageTables: 2348 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 32911616 kB
Committed_AS: 366544 kB
VmallocTotal: 34359738367
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 47004 kB
DirectMap2M: 4050944 kB
DirectMap1G: 29360128 kB
Это дает мне ~ 538 МБ используемой памяти, но только ~ 358 МБ выделенной памяти! Как это возможно, что общая выделенная память в системе меньше используемой памяти ?? Или может кто-то указать, если я здесь что-то не так делаю?
Plz, любые указатели на то, что здесь происходит, будут очень признательны !!
В Linux Committed_AS - это оценка фиксации пользовательского пространства. Если вы добавите ядро, Cached, Slab, KernelStack и PageTables, это составит большую часть «недостающих» нескольких сотен МБ.
Программы не используют все свои ресурсы. Таким образом, ядро играет в хитроумные игры с избыточной загрузкой и надеется, что не обанкротится, если все заполнят свои реальными данными.
Во многих системах, в которых большая часть памяти выделена в пользовательском пространстве, Committed_AS может относительно безопасно обращаться к MemTotal. Несмотря на то, что оно намного превышает это значение, оно приводит к отказу от страниц и снижению производительности в целом. На всякий случай, моя цель планирования мощности - Committed_AS ниже MemTotal.
Но эта система значительно ниже этого порога, при использовании памяти около 2%. (Очень недоиспользуется. Никакой проблемы емкости здесь нет.) Выделенное пространство пользователя едва превышает размер ядра. Таким образом, неверное предположение, что Committed_AS - это все распределения пользователя + ядра, больше не соответствует данным.