GNU/Linux >> Linux の 問題 >  >> Linux

カーネルはどれくらいの RAM を使用しますか?

カーネルは少し間違った名前です。 Linux カーネルは、いくつかのプロセス/スレッド + モジュール (lsmod ) したがって、全体像を把握するには、単一のコンポーネントだけでなく、ボール全体を見る必要があります。

ちなみに私のショーは slabtop :

 Active / Total Size (% used)       : 173428.30K / 204497.61K (84.8%)

slabtop の man ページ これも言いました:

<ブロック引用>

slabtop 統計ヘッダーは、使用されているスラブのバイト数を追跡​​しており、物理メモリの測定ではありません。 /proc/meminfo ファイルの「Slab」フィールドは、使用済みのスラブ物理メモリに関する情報を追跡しています。

キャッシュの削除

質問の下のコメントで @derobert が提案したようにキャッシュを削除すると、次のことが行われます:

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$

 Active / Total Size (% used)       : 61858.78K / 90524.77K (68.3%)

3 を送信すると、次のことが行われます:ページキャッシュ、dentry、および inode を解放します。これについては、次のタイトルの U&L Q&A で詳しく説明します:メモリ キャッシュとバッファをダンプする方法またはツールはありますか?".したがって、ページキャッシュ、dentry、および inode に関する情報を維持するだけで、110MB のスペースが使用されていました。

追加情報

  • 興味があれば、slabtop について説明しているこのブログ記事を見つけました もう少し詳しく。タイトルは「今日の Linux コマンド:slabtop」です。
  • スラブ キャッシュについては、ウィキペディアで「スラブの割り当て」というタイトルで詳しく説明されています。

カーネルが使用している RAM の量は?

この写真は私には少しわかりにくいですが、私たちが知っていると「思う」ことは次のとおりです.

スラブ

この手法を使用して、Slab の使用状況のスナップショットを取得できます。基本的に、この情報を /proc/meminfo から引き出すことができます .

$ grep Slab /proc/meminfo
Slab:             100728 kB

モジュール

また、これらの値を /proc/modules から取得することで、カーネル モジュールのサイズ値を取得できます (ディスク上のサイズなのか、RAM 内のサイズなのかは不明です)。 :

$ awk '{print $1 " " $2 }' /proc/modules | head -5
cpufreq_powersave 1154
tcp_lp 2111
aesni_intel 12131
cryptd 7111
aes_x86_64 7758

スラブ情報

SLAB に関する詳細の多くは、この proc 構造 /proc/slabinfo でアクセスできます。 :

$ less /proc/slabinfo | head -5
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
nf_conntrack_ffff8801f2b30000      0      0    320   25    2 : tunables    0    0    0 : slabdata      0      0      0
fuse_request         100    125    632   25    4 : tunables    0    0    0 : slabdata      5      5      0
fuse_inode            21     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0

メッセージ

システムが起動すると、Linux カーネルがロードされた直後にそのメモリ使用量を報告する行があります。

$ dmesg |grep Memory:
[    0.000000] Memory: 7970012k/9371648k available (4557k kernel code, 1192276k absent, 209360k reserved, 7251k data, 948k init)

参考文献

  • 記憶はどこへ行く? 2.6 カーネルでのメモリ使用量

これはどうですか:

Active / Total Size (% used)       : 4709.24K / 5062.03K

通常のカーネルでヘッドレスで実行されている、新しく起動した非常に小さなマシンです。 したがって、多くは必要ありません。

derobert が示唆しているように、カーネルは利用可能なメモリをキャッシュに利用します。これは slabtop で見られるものの多くです。 .これは、ファイル キャッシュに加えて、使用されなくなったユーザー空間プロセスからの共有可能なメモリに関係しています。カーネルは、同じものが再び必要になるか、何かが積極的に RAM を必要とし、その場合は忘れられるまで、そこに残します。たとえば、棚から本を取り出して、テーブルの上で読むために開いたままにします。読み終わったら、もう一度見る必要がある場合に備えて、開いたままにしておくことができます。


Solaris を実行するこの 512 GB RAM サーバーでは、カーネルは 25 GB を使用します:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                    3210102             25078    5%
Anon                     15266226            119267   23%
Exec and libs               41457               323    0%
Page cache                3539331             27651    5%
Free (cachelist)         13799571            107809   21%
Free (freelist)          30093164            235102   46%

Total                    65949851            515233
Physical                 65927406            515057

その小さい方は、RAM の半分以上がカーネルによって使用されています:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                    2149699             16794   52%
Anon                       517016              4039   13%
Exec and libs               15420               120    0%
Page cache                  21840               170    1%
Free (cachelist)             8768                68    0%
Free (freelist)           1404862             10975   34%

Total                     4117605             32168
Physical                  4096002             32000

心配する必要はありません。未使用の RAM は無駄な RAM です。


Linux
  1. basenameコマンドの使用方法は?

  2. Linux – Dmesgの仮想カーネルメモリレイアウトは何を意味しますか?

  3. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  1. Linux カーネルは __init 呼び出しの順序をどのように決定しますか?

  2. ターミナルでHZを確認するには?

  3. Linux カーネルをコンパイルするには、どのくらいのサイズが必要ですか?

  1. SSH は通常、どのくらいのデータを使用しますか?

  2. 使用中の Linux ディストリビューションを特定するにはどうすればよいですか?

  3. 使用中の RAM スロットの数を確認するにはどうすればよいですか?