Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
第7章 KSM
共有メモリーの概念は、最新のオペレーティングシステムでは一般的です。たとえば、プログラムが最初に起動されると、そのプログラムはすべてのメモリーを親プログラムと共有します。子プログラムまたは親プログラムがこのメモリーを変更しようとすると、カーネルは新しいメモリー領域を割り当て、元のコンテンツをコピーして、プログラムがこの新しい領域を変更できるようにします。これは、コピーオンライトとして知られています。
KSM は、この概念を逆に使用する新しい Linux 機能です。KSM を使用すると、カーネルはすでに実行中の 2 つ以上のプログラムを検証し、それらのメモリーを比較できます。いずれかのメモリー領域またはページが同一である場合、KSM は複数の同一のメモリーページを 1 つのページに減らします。このページは、コピーオンライトとしてマークされます。ページのコンテンツがゲスト仮想マシンによって変更された場合、そのゲスト仮想マシン用に新しいページが作成されます。
これは、KVM を使用した仮想化に役立ちます。ゲスト仮想マシンが起動すると、親
qemu-kvm
プロセスからメモリーのみが継承されます。ゲスト仮想マシンが実行されると、ゲストが同じオペレーティングシステムまたはアプリケーションを実行しているときに、ゲスト仮想マシンのオペレーティングシステムイメージのコンテンツを共有できます。
注記
ページ重複排除テクノロジー (KSM 実装でも使用) は、複数のゲスト間で情報を漏洩するために使用される可能性のあるサイドチャネルを導入する可能性があります。これが懸念される場合は、ゲストごとに KSM を無効にすることができます。
KSM は、メモリーの速度と使用率を強化します。KSM では、共通のプロセスデータがキャッシュまたはメインメモリーに保存されます。これにより、KVM ゲストのキャッシュミスが減少し、一部のアプリケーションとオペレーティングシステムのパフォーマンスが向上します。次に、メモリーを共有すると、ゲストの全体的なメモリー使用量が削減され、リソースの密度と使用率が向上します。
注記
Red Hat Enterprise Linux 6.5 以降、KSM は NUMA に対応しています。これにより、ページのコアレッシング中に NUMA の局所性を考慮できるため、ページがリモートノードに移動されることに関連するパフォーマンスの低下を防ぐことができます。Red Hat は、KSM が使用されている場合に、ノード間のメモリーマージを回避することを推奨します。KSM を使用している場合は、
/sys/kernel/mm/ksm/merge_across_nodes
を 0
に変更して、NUMA ノード間でページがマージされないようにします。カーネルメモリーが計算した統計情報は、ノード間での大量のマージ後にはそれぞれの間で相反する場合があります。そのため、KSM デーモンが大量のメモリーをマージすると、numad が混乱する可能性があります。システムに未使用のメモリーが大量にあると、KSM デーモンをオフにして無効にすることでパフォーマンスが高まる場合があります。NUMA の詳細は、『Red Hat Enterprise Linux パフォーマンスチューニングガイド』 を参照してください。
Red Hat Enterprise Linux は、KSM を制御するために 2 つの異なる方法を使用します。
ksm
サービスは、KSM カーネルスレッドを開始および停止します。ksmtuned
サービスはksm
を制御し、調整し、同じページのマージを動的に管理します。ksmtuned
サービスはksm
を開始し、メモリー共有が必要ない場合はksm
サービスを停止します。ksmtuned
サービスは、retune
新しいゲストが作成または破棄されたときに実行するパラメーター。
これらのサービスは両方とも、標準のサービス管理ツールで制御されます。
KSM サービス
ksm
サービスは qemu-kvm パッケージに含まれています。KSM は、Red Hat Enterprise Linux 6 ではデフォルトでオフになっています。ただし、Red Hat Enterprise Linux 6 を KVM ホスト物理マシンとして使用する場合は、ksm/ksmtuned
サービスによってオンにされる可能性があります。
ksm
サービスが開始されていない場合、KSM は 2000 ページのみを共有します。このデフォルトは低く、メモリー節約の利点は限られています。
ksm
サービスが開始されると、KSM はホスト物理マシンシステムのメインメモリーの最大半分を共有します。ksm
サービスを開始して、KSM がより多くのメモリーを共有できるようにしてください。
# service ksm start Starting ksm: [ OK ]
ksm
サービスは、デフォルトの起動シーケンスに追加できます。chkconfig コマンドを使用して、ksm
サービスを永続化します。
# chkconfig ksm on
KSM チューニングサービス
ksmtuned
サービスにはオプションがありません。ksmtuned
サービスは、ksm
をループして調整します。さらに、ゲスト仮想マシンが作成または破棄されると、ksmtuned
サービスに libvirt から通知されます。
# service ksmtuned start Starting ksmtuned: [ OK ]
ksmtuned
サービスは、retune
パラメーターを使用して調整できます。retune
パラメーターは、チューニング機能を手動で実行するように ksmtuned
に指示します。
ファイル内のパラメーターを変更する前に、明確にする必要のあるいくつかの用語があります。
thres
: アクティベーションキーのしきい値 (kbytes)KSM サイクルは、全thres
プロセス RSZ の合計にシステムメモリーの合計にqemu-kvm
値が追加されるとトリガーされます。このパラメーターは、KSM_THRES_COEF
で定義されたパーセンテージの kbytes と同じです。
/etc/ksmtuned.conf
ファイルは、ksmtuned
サービスの設定ファイルです。以下のファイル出力は、デフォルトの ksmtuned.conf
ファイルです。
# Configuration file for ksmtuned. # How long ksmtuned should sleep between tuning adjustments # KSM_MONITOR_INTERVAL=60 # Millisecond sleep between ksm scans for 16Gb server. # Smaller servers sleep more, bigger sleep less. # KSM_SLEEP_MSEC=10 # KSM_NPAGES_BOOST is added to thenpages
value, whenfree memory
is less thanthres
. # KSM_NPAGES_BOOST=300 # KSM_NPAGES_DECAY Value given is subtracted to thenpages
value, whenfree memory
is greater thanthres
. # KSM_NPAGES_DECAY=-50 # KSM_NPAGES_MIN is the lower limit for thenpages
value. # KSM_NPAGES_MIN=64 # KSM_NAGES_MAX is the upper limit for thenpages
value. # KSM_NPAGES_MAX=1250 # KSM_TRES_COEF - is the RAM percentage to be calculated in parameterthres
. # KSM_THRES_COEF=20 # KSM_THRES_CONST - If this is a low memory system, and thethres
value is less thanKSM_THRES_CONST
, then resetthres
value toKSM_THRES_CONST
value. # KSM_THRES_CONST=2048 # uncomment the following to enable ksmtuned debug information # LOGFILE=/var/log/ksmtuned # DEBUG=1
KSM 変数とモニターリング
KSM は、監視データを /sys/kernel/mm/ksm/
ディレクトリーに保存します。このディレクトリー内のファイルは、カーネルによって更新される、KSM の使用状況と統計の正確な記録です。
以下のリストの変数は、下記のように、
/etc/ksmtuned.conf
ファイルの設定可能な変数でもあります。
/sys/kernel/mm/ksm/
ファイル
- full_scans
- フルスキャンが実行されます。
- pages_shared
- 共有されたページの総数。
- pages_sharing
- 現在共有されているページ。
- pages_to_scan
- スキャンされていないページ。
- pages_unshared
- 共有されなくなったページ。
- pages_volatile
- 揮発性ページの数。
- run
- KSM プロセスが実行されているかどうか。
- sleep_millisecs
- スリープのミリ秒。
DEBUG=1
行が /etc/ksmtuned.conf
ファイルに追加された場合、KSM チューニングアクティビティーは /var/log/ksmtuned
ログファイルに保存されます。ログファイルの場所は、LOGFILE
パラメーターを使用して変更することができます。ログファイルの場所を変更することはお勧めできません。SELinux 設定の特別な設定が必要になる場合があります。
KSM の非アクティブ化
KSM にはパフォーマンスのオーバーヘッドがあり、特定の環境またはホストの物理マシンシステムには大きすぎる可能性があります。
KSM は、
ksmtuned
および ksm
サービスを停止することで非アクティブ化できます。サービスを停止すると KSM が非アクティブになりますが、再起動後も持続しません。
# service ksmtuned stop Stopping ksmtuned: [ OK ] # service ksm stop Stopping ksm: [ OK ]
chkconfig コマンドを使用して KSM を永続的に非アクティブ化します。サービスを無効にするには、以下のコマンドを実行します。
# chkconfig ksm off # chkconfig ksmtuned off
重要
KSM であっても、コミットされた RAM にスワップサイズがあれば十分です。KSM は、同一または類似のゲストの RAM 使用量を削減します。十分な swap 領域のない KSM でゲストをオーバーコミットすると可能かもしれませんが、ゲスト仮想マシンのメモリー使用によりページが共有されない可能性があるためです。