web-dev-qa-db-ja.com

BSDの空きメモリを確実に判断する

Linuxディストリビューションは procps からfreeを含める傾向があります(ただし 必須ではありません )。これにより、メモリ消費量を簡潔に表示できます。

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

これをBSDで概算するために、私はいくつかの異なる項目を試しましたが、それらはすべて異なる答えを出します(おそらくそれらは異なるコンテキストを持っているためでしょうか?)。例えば:

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

私はこの質問をする最初の人ではありません。ほぼ7年前、それは 投稿 でFreeBSD-questionsリストにあり、Perlスクリプトは proposed で、 freebsd-memory.pl を提供していました (出力はここに収まるように狭められました)

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

forquare's answerからの更新–さらに別の方法:

_# 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%
_

上記のBSDコマンドの7つすべて(sysctlの2つの方法、/ var/run/dmesg.boot、top、freebsd-memory.pl、vmstat、swapinfo)を単一のコマンドラインで実行したため、出力はかなり一貫しているはずですが、相反する価値観がたくさんあります。

これらのうち「最も正確なもの」はどれですか?ほとんどすべてのシステムで実行できる小さなスクリプト(コンパイルなし!) BSD)procps freeと同じようにメモリ消費量を簡潔に表示します。

現在、top |grep -Em2 '^(Mem|Swap):'を使用しています。

サイドノート1: Freecolor はほぼ正確に私が欲しいものですが、コンパイルが必要であり、処理したくない依存関係があります(私はこれらのシステムのメンテナーではありません)。この質問を見る訪問者を助けるかもしれません。

補足2:procps(Linux)topコマンドはパイプではうまく機能しません。 _top -d.1 -n1_を使用すると高速化できますが、カーソルが消える可能性があります。

12
Adam Katz

シンプルなフリー/アクティブな数値の場合、私は常に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

Manページから:

仮想メモリと実メモリの使用状況に関する情報。仮想ページ(1024バイト単位で報告)は、実行中または過去20秒間に実行されたプロセスに属している場合、アクティブと見なされます。

         avm     active virtual pages
         fre     size of the free list

スワップの使用法については:

~ # swapinfo -h
Device          1K-blocks     Used    Avail Capacity
/dev/da0p2        2097152      25M     2.0G     1%
1
forquare