カーネル5.10.24を使用して組み込みLinuxシステムを開発しています。システムには96MBのDRAMがあります。
システムの起動時にメモリ使用量を確認したところ、次の情報が得られました。
# dmesg | grep "kernel code"
[ 0.000000] Memory: 85888K/131072K available (7885K kernel code, 692K rwdata, 1284K rodata, 560K init, 336K bss, 45184K reserved, 0K cma-reserved)
# free -m
total used free shared buff/cache available
Mem: 84 56 1 0 26 25
Swap: 0 0 0
#
#
# cat /proc/meminfo
MemTotal: 86448 kB
MemFree: 1992 kB
MemAvailable: 25948 kB
Buffers: 0 kB
Cached: 26896 kB
SwapCached: 0 kB
Active: 9632 kB
Inactive: 39064 kB
Active(anon): 72 kB
Inactive(anon): 21796 kB
Active(file): 9560 kB
Inactive(file): 17268 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 21852 kB
Mapped: 7664 kB
Shmem: 68 kB
KReclaimable: 696 kB
Slab: 8632 kB
SReclaimable: 696 kB
SUnreclaim: 7936 kB
KernelStack: 608 kB
PageTables: 400 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 43224 kB
Committed_AS: 146992 kB
VmallocTotal: 1048372 kB
VmallocUsed: 4156 kB
VmallocChunk: 0 kB
Percpu: 200 kB
出力結果を見ると、free -m
25MBの空きメモリがあることがわかります。
ユーザースペースのメモリ使用量がわかりますが、カーネルスペースがどのくらいのメモリを使用しているのか、どうすればわかりますか?
私はいくつかのブログとSOを読み、カーネルで使用されているメモリをBuffers
見つけSlab
ました。/proc/meminfo
合算してもまだ違いがあります!
それでは、カーネル空間で使用されているメモリをどのように知ることができますか?カーネル空間でメモリ使用量を確認すれば十分Buffers
ですか?Slab
/proc/meminfo
答え1
カーネルメモリ使用量はバッファやスラブに限定されません。また、カーネルコード、カーネルデータ、カーネルスタックなどの他のコンポーネントも含まれます。
次のコンポーネントを使用して、カーネルメモリ使用量を計算できます。
Kernel code (from dmesg output): 7885 KB
rwdata (from dmesg output): 692 KB
rodata (from dmesg output): 1284 KB
init (from dmesg output): 560 KB
bss (from dmesg output): 336 KB
Slab (from /proc/meminfo): 8632 KB
KernelStack (from /proc/meminfo): 608 KB
今一緒に追加してください。
7885 + 692 + 1284 + 560 + 336 + 8632 + 608 = 19997 KB
したがって、カーネルは約19,997KBまたは約19.5MBのメモリを使用します。これは近似であり、カーネルで使用されるすべてのメモリバイトを記述できない場合があります。カーネルがメモリを動的に割り当てて解放すると、メモリ使用量も実行時に変更されます。