物理メモリマップを学ぶ

物理メモリマップを学ぶ

メモリの問題を体系的にデバッグしたいと思います。

私のシステム設定は次のとおりです。 2つのCPU(それぞれマルチコアを含む)を持つ(物理)サーバーがあります。各CPUには、対応するメモリコントローラに接続された1TiBのRAM(16個のメモリモジュール、それぞれ64GiB)があります。したがって、システムには合計2TiB RAMがあります。現在、私はこのサーバーのオペレーティングシステムとしてUbuntu 20.04を使用しています。

ルートとして実行すると、lsmem --output-all次の結果が表示されます。

RANGE                                  SIZE  STATE REMOVABLE    BLOCK NODE  ZONES
0x0000000000000000-0x00000000ffffffff    4G online       yes      0-1    0   None
0x0000000100000000-0x000000fcffffffff 1008G online       yes    2-505    0 Normal
0x0000010000000000-0x000001007fffffff    2G online       yes      512    0   None
0x0000010080000000-0x000001ffffffffff 1022G online       yes 513-1023    1 Normal
0x0000020000000000-0x000002007fffffff    2G online       yes     1024    1   None

Memory block size:         2G
Total online memory:       2T
Total offline memory:      0B

ご覧のとおり、カーネルはメモリを2GiBチャンクに「分割」しますが、これはRAM容量のあるシステムで予想される現象です。ところで、1019個のブロックだけがリストされているのがおかしいです(1024個のブロックでなければなりません)。ノード0(10GiBメモリ)の5つのブロックが欠けているようです。 (メモリが2TiBの別のサーバーがありますが、このサーバーではこの動作は発生しません。)

その10GiBで何が起こったのか知りたいです。このメモリは一部のデバイスで使用されますが、実行中にlsmem --output-all実際にcat /proc/iomem欠落しているメモリブロックは一覧表示されません。まるで10GiBが存在しないのと同じです。

私の質問は次のとおりです。lsmem --output-allブロック(表示されているように)から物理メモリ(RAMモジュールなど)へのマッピングを見つける方法はありますか?影響を受けたRAMモジュールを変更し、そのモジュールに物理的な問題があるかどうかを確認できるため、これは非常に役立ちます。

私はすでに試しました。詳しく見ると、/sys/devices/system/edac/mcメモリコントローラとメモリ階層が見つかりましたが、メモリがどのブロックにマップされているかはわかりませんでした。

答え1

メモリ全体の一部はシステム自体のために予約されています。したがって、Linuxで利用可能なメモリは残りのメモリです。この5つのブロックはシステム予約メモリでなければなりません。

dmidecode --type memory取り付けられている物理メモリの量を一覧表示できます。

sudo grep '^[^ ]' /proc/iomemシステムに予約されているメモリブロックを一覧表示できます。

源泉

関連情報