Os valores de memória SNMP não correspondem a 'livre'

3

Compare isso

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

e isso:

# 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:

Por que o show gratuito 66294MB para "cache" enquanto o snmp mostra 44238MB para "memCached"? Não deveria ser o mesmo?

Olhando para o MIB, vejo que o "memCached" é uma memória "física ou virtual" usada para armazenamento em cache. (Não me diga que coloca cache de disco em swap) ^^

O objetivo é descobrir a real memória física livre (por exemplo, 71145 como mostrado por free ) via snmp.

Mais informações

# 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
    
por Marki 29.10.2014 / 10:13

1 resposta

3

Na página de manual de free(1) :

cache Memory used by the page cache and slabs (Cached and Slab in /proc/meminfo)

free inclui alocação de blocos no cache; UCD-SNMP-MIB não. Se você adicionar a alocação da laje, você terá:

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

que é muito mais próximo do que free relatou (67885056 KB).

Quanto a obter memória física real e gratuita, o melhor que você pode fazer com este MIB é obter uma estimativa aproximada:

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

que ainda é significativamente menor que o valor de free + buffers / cache relatado por free .

Observe que o HOST-RESOURCES-MIB não é melhor; veja minha resposta para uma pergunta semelhante no Stack Overflow.

Os novos kernels realmente fornecem uma métrica melhor para isso. Novamente na% man_de% manpage:

available

Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)

Esse valor será menor que o total de free + buffers / cache e seria um medidor melhor de memória disponível, mas não o vejo no seu free(1) e não encontrei um MIB que o use .

    
por 07.08.2015 / 20:39