メモリの問題を体系的にデバッグしたいと思います。
私のシステム設定は次のとおりです。 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
システムに予約されているメモリブロックを一覧表示できます。