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

Значения памяти SNMP не совпадают с `свободным`

Сравните это

# free -m
             total       used       free     shared    buffers     cached
Mem:         72363      68035       4328          0        522      66294
-/+ buffers/cache:       1218      71145
Swap:        12291          0      12291

и это:

# snmpwalk -c public -v 2c localhost .1.3.6.1.4.1.2021.4
UCD-SNMP-MIB::memIndex.0 = INTEGER: 0
UCD-SNMP-MIB::memErrorName.0 = STRING: swap
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 12586888 kB
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 12586784 kB
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 74100516 kB
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 4429580 kB
UCD-SNMP-MIB::memTotalFree.0 = INTEGER: 17016364 kB
UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000 kB
UCD-SNMP-MIB::memBuffer.0 = INTEGER: 534804 kB
UCD-SNMP-MIB::memCached.0 = INTEGER: 44238560 kB
UCD-SNMP-MIB::memSwapError.0 = INTEGER: noError(0)
UCD-SNMP-MIB::memSwapErrorMsg.0 = STRING:

Почему free показывает 66294MB для «cache», а snmp показывает около 44238MB для «memCached»? Разве это не должно быть таким же?

Глядя на MIB, я вижу, что «memCached» - это «физическая или виртуальная» память, используемая для кэширования. (Не говорите мне, что он помещает кеш диска в своп) ^^

Цель состоит в том, чтобы узнать реальную свободную физическую память (т.е. здесь 71145, как показано free) через snmp.


Больше информации

# cat /proc/meminfo
MemTotal:     74100516 kB
MemFree:       4422092 kB
Buffers:        542168 kB
Cached:       44239460 kB
SwapCached:          4 kB
Active:       16455504 kB
Inactive:     28707308 kB
SwapTotal:    12586888 kB
SwapFree:     12586784 kB
Dirty:            2536 kB
Writeback:           0 kB
AnonPages:      381088 kB
Mapped:         252132 kB
Slab:         23961488 kB
SReclaimable: 23648768 kB
SUnreclaim:     312720 kB
PageTables:       7812 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
WritebackTmp:        0 kB
CommitLimit:  49637144 kB
Committed_AS:        4 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    264124 kB
VmallocChunk: 34359474191 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
HugePages_Surp:      0
Hugepagesize:     2048 kB
DirectMap4k:      7936 kB
DirectMap2M:  75481088 kB

На странице руководства для free(1):

тайник Память, используемая кешем страниц и блоками (Cached и Slab в / proc / meminfo)

free включает размещение блоков в кеше; UCD-SNMP-MIB - нет. Если вы добавите распределение перекрытий, вы получите:

UCD-SNMP-MIB::memCached.0 + slab = 44238560 + 23961488
                                 = 68200048 KB

что намного ближе к тому, что free сообщил (67885056 КБ).


Что касается получения реальной свободной физической памяти, лучшее, что вы можете сделать с помощью этой MIB, - это получить приблизительную оценку:

totFree = memAvailReal.0 + memBuffer.0 + memCached.0
        = 4429580        + 534804      + 44238560
        = 49202944 KB

что по-прежнему значительно ниже, чем значение свободных + буферов / кеша, о которых сообщает free.

Обратите внимание, что HOST-RESOURCES-MIB ничем не лучше; видеть мой ответ на аналогичный вопрос о переполнении стека.


Новые ядра на самом деле обеспечивают для этого лучшую метрику. Снова из free(1) страница руководства:

доступный

Оценка того, сколько памяти доступно для запуска новых приложений без подкачки. В отличие от данных, предоставляемых кешем или свободными полями, это поле учитывает кеш страницы, а также то, что не все восстанавливаемые блоки памяти будут освобождены из-за использования элементов (MemAvailable в / proc / meminfo, доступно в ядрах 3.14, эмулировано в ядра 2.6.27+, в остальном то же, что и бесплатные)

Это значение будет ниже, чем общее количество свободных + буферов / кеша, и будет лучшим показателем доступной памяти, но я не вижу его в вашем /proc/meminfo и я не нашел MIB, который его использует.