Назад | Перейти на главную страницу

Выделенная / выделенная память в Linux меньше используемой памяти. Как такое возможно?

Итак, у меня есть система с ядром 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 - это все распределения пользователя + ядра, больше не соответствует данным.