web-dev-qa-db-ja.com

/ proc / meminfoのMemTotalが変更されるのはなぜですか?

/proc/meminfoファイルの値、つまりMemTotal:番号を監視します。 RAMモジュールが破損すると、おおよそメモリモジュールのサイズによって変化します。これは明らかです。

カーネルのドキュメントからフィールドの定義を知っています:

MemTotal: Total usable ram (i.e. physical ram minus a few reserved
          bits and the kernel binary code)

dmesgには、カーネルデータも一覧表示されます。メモリモジュールのハードウェア障害を省略した場合、他にどのような特定のアクションによってMemTotal番号が変更されますか?

これは、物理システムと仮想システムの両方で発生します。私は何百もの物理システム、何千もの仮想システムを監視しています。変更はかなりまれですが、実際に発生します。

4
Matej Kovac

カーネルやモジュールにバグがあることに不安を感じていたので、さらに掘り下げてみたところ、MemTotalは定期的に、下向き、または上向きに変化する可能性があることがわかりました。これは定数ではなく、この値はさまざまな状況下で、多くの場所でカーネルコードによって確実に変更されます。

例えば。 virtio_balloon kmod can decreaseMemTotal and increase it backagain。そしてもちろん、 mm/memory_hotplug.c[add|remove]_memoryをエクスポートしており、どちらも多くのドライバーで使用されています。

2
Matej Kovac

それは決して変わらないはずです。これは、RAM内のいくつかの障害のある場所を示している可能性があります。 Memtest86 + を使用してRAMを診断できます。

それ以外の場合、仮想マシンのゲストを分析する場合にのみ、その数が変化する可能性があります。おそらく、ゲストが実行されているVMゲストが実行されているホストは、ゲストに割り当てられたRAMを調整しています。

編集#1

MemTotalの変更につながる可能性のあるカーネルモジュールによるメモリのリークの可能性について説明しているこのフォーラムの投稿を掘り下げました。

抜粋: Re:システムメモリの量をどのように決定しますか?

2008年7月30日、BillMcGonigleは次のように書いています。

2008年7月30日10:03、ThomasCharronは次のように書いています。

MemTotalは変更できます。 MemTotalは、カーネルバイナリ自体がメモリ内で使用しているメモリを表示しませんが、モジュールがメモリリークを起こし、MemTotalからも削除される場合があります。この出来事の詳細は覚えていませんが、パウロが今何について話しているかは知っています。 MemTotalをマシンに存在する物理メモリとして定義した場合、これはバグにすぎません。カーネルが利用できる合計メモリと見なすと、正しく機能していますよね?

はい、そして「バグ」はその数が減少したときです、それは何かが漏れていることを意味します、別名、「悪いカーネル」。少なくとも潜在的に「悪い」(潜在的にバグのある)カーネルモジュール。

3
slm

MemTotalは変更できます。 MemTotalは、カーネルバイナリ自体がメモリ内で使用しているメモリを表示しませんが、モジュールがメモリリークを起こし、MemTotalからも削除される場合があります。この出来事の詳細は覚えていませんが、パウロが今何について話しているかは知っています。 MemTotalをマシンに存在する物理メモリとして定義した場合、これはバグにすぎません。カーネルが利用できる合計メモリと見なすと、正しく機能していますよね?

0
khan