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

Сравните это

# free -m
             общее количество использованных свободных общих буферов в кеше
Память:         72363      68035       4328          0        522      66294
-/+ буферы / кэш: 1218 71145
Своп:        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 кБ
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 12586784 кБ
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 74100516 КБ
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 4429580 КБ
UCD-SNMP-MIB::memTotalFree.0 = INTEGER: 17016364 кБ
UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000 кБ
UCD-SNMP-MIB::memBuffer.0 = INTEGER: 534804 кБ
UCD-SNMP-MIB::memCached.0 = INTEGER: 44238560 кБ
UCD-SNMP-MIB::memSwapError.0 = INTEGER: noError(0)
UCD-SNMP-MIB::memSwapErrorMsg.0 = STRING:

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

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

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


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

# cat /proc/meminfo
MemTotal:     74100516 кБ MemFree:       4422092 кБ Буферы: 542168 кБ Кэшированные:       44239460 КБ Свопинговые: 4 КБ Активные: 16455504 КБ Неактивные: 28707308 КБ SwapTotal: 12586888 КБ SwapFree:     1267: 067БиСф: 0: 068: 0 0 0 0 0 0 0 0 0 0 5 5 5 5 5 5 0 5 5 0 5 5 5 5 0 5 5 5 5 0 5 5 0 5 5 5 0 5 5 5 5 0 0 0 5 5 0 0 5 8 8 КБ. AnonPages:      381088 кБ Сопоставлено: 252132 кБ Плита:         23961488 кБ 264124 КБ VmallocChunk: 34359474191 КБ HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
HugePages_Surp:      0 Огромный размер страницы: 2048 КБ DirectMap4k:      7936 КБ DirectMap2M:  75481088 КБ

1 ответ

Из справочной страницы для 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 + buffers/cache, сообщаемое free,

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


Более новые ядра фактически обеспечивают лучший показатель для этого. Опять из free(1) страница руководства:

имеется в наличии

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

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

Другие вопросы по тегам