Determinar a memória livre de forma confiável

4

As distribuições do Linux tendem (mas não são não necessárias ) para incluir free de procps , que permite uma boa exibição concisa do consumo de memória:

# free -m
              total        used        free      shared  buff/cache   available
Mem:           7688        5027         180         827        2479        1589
Swap:          8189        2082        6106

Para aproximar isso no BSD, eu tentei vários itens diferentes, mas todos eles me deram respostas diferentes (presumivelmente porque eles têm contextos diferentes?). Por exemplo:

# sysctl -a |grep Memory
Virtual Memory:             (Total: 1077397132K, Active 3458308K)
Real Memory:                (Total: 1171952K Active 975744K)
Shared Virtual Memory:      (Total: 56264K Active: 38652K)
Shared Real Memory: (Total: 22184K Active: 19700K)
Free Memory Pages:  1664588K

# sysctl hw |awk '/mem:/ { printf "%s %.0fM\n", $1, $2/1024^2 }'
hw.physmem: 32756M
hw.usermem: 29102M
hw.realmem: 33792M

# grep memory /var/run/dmesg.boot
usable memory = 34346901504 (32755 MB)
avail memory  = 33139134464 (31603 MB)

# top |grep -Em2 '^(Mem|Swap):'
Mem: 980M Active, 25G Inact, 3654M Wired, 948M Cache, 3285M Buf, 678M Free
Swap: 9216M Total, 363M Used, 8853M Free, 3% Inuse

Eu não sou a primeira pessoa a ter essa pergunta; Há quase sete anos, era postado na lista de perguntas do FreeBSD e em um perl O script foi proposto , oferecendo freebsd-memory.pl (a saída foi reduzida para caber aqui) :

# perl freebsd-memory.pl
SYSTEM MEMORY INFORMATION:
mem_wire:       3831771136 (  3654MB) [ 11%] Wired: disabled for paging out
mem_active:  +  1028284416 (   980MB) [  3%] Active: recently referenced
mem_inactive:+ 26741092352 ( 25502MB) [ 80%] Inactive: recently not referenced
mem_cache:   +   993902592 (   947MB) [  2%] Cached: almost avail. for allocation
mem_free:    +   710340608 (   677MB) [  2%] Free: fully available for allocation
mem_gap_vm:  +      995328 (     0MB) [  0%] Memory gap: UNKNOWN
-------------- ----------- ---------- ------
mem_all:     = 33306386432 ( 31763MB) [100%] Total real memory managed
mem_gap_sys: +  1040515072 (   992MB)        Memory gap: Kernel?!
-------------- ----------- ----------
mem_phys:    = 34346901504 ( 32755MB)        Total real memory available
mem_gap_hw:  +    12836864 (    12MB)        Memory gap: Segment Mappings?!
-------------- ----------- ----------
mem_hw:      = 34359738368 ( 32768MB)        Total real memory installed

SYSTEM MEMORY SUMMARY:
mem_used:       5914402816 (  5640MB) [ 17%] Logically used memory
mem_avail:   + 28445335552 ( 27127MB) [ 82%] Logically available memory
-------------- ----------- ---------- ------
mem_total:   = 34359738368 ( 32768MB) [100%] Logically total memory

Atualização de resposta do forquare - outro método:

# vmstat -h
 procs      memory      page                    disks     faults         cpu
 r b w     avm    fre   flt  re  pi  po    fr  sr da0 da1   in   sy   cs us sy id
 0 2 0   3372M  1627M    39  32   0   0     8  23   0   0   23   25   38 19  9 71

# swapinfo -h
Device          1K-blocks     Used    Avail Capacity
/dev/da0s1b       9437184     363M     8.6G     4%

Eu executei todos os sete comandos BSD acima (sysctl de duas maneiras, /var/run/dmesg.boot, top, freebsd-memory.pl, vmstat, swapinfo) em uma única linha de comando, então a saída deve ser bem consistente, mas vejo muitos valores conflitantes.

Qual destes é "mais preciso?" Eu quero um pequeno script (sem compilação!) que pode ser executado em praticamente qualquer sistema (ou então apenas BSD) que concisamente exibir meu consumo de memória a maneira como o procps free faz.

Estou usando top |grep -Em2 '^(Mem|Swap):' no momento.

Nota 1: Freecolor é quase exatamente o que eu quero, mas requer compilação e tem dependência que eu não quero lidar com (eu não sou o mantenedor desses sistemas), mas pode ajudar os visitantes a olhar para essa questão.

Nota 2: O comando procps (Linux) top não funciona bem com pipes. Você pode torná-lo mais rápido com top -d.1 -n1 , mas pode fazer com que seu cursor desapareça.

    
por Adam Katz 08.03.2017 / 02:48

1 resposta

0

Para figuras gratuitas / ativas simples, sempre usei vmstat :

~ # vmstat
procs  memory       page                    disks     faults         cpu
r b w  avm   fre   flt  re  pi  po    fr   sr da0 cd0   in    sy    cs us sy id
1 0 2 841M   89M    23   0   0   0    29    9   0   0    4   110    93  0  0 100

Da página do manual:

Information about the usage of virtual and real memory. Virtual pages (reported in units of 1024 bytes) are considered active if they belong to processes which are running or have run in the last 20 seconds.

         avm     active virtual pages
         fre     size of the free list

Para informações sobre o uso de swap:

~ # swapinfo -h
Device          1K-blocks     Used    Avail Capacity
/dev/da0p2        2097152      25M     2.0G     1%
    
por 08.03.2017 / 07:44