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_nodes0 に変更して、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 the npages value, when free memory is less than thres.
# KSM_NPAGES_BOOST=300

# KSM_NPAGES_DECAY Value given is subtracted to the npages value, when free memory is greater than thres.
# KSM_NPAGES_DECAY=-50

# KSM_NPAGES_MIN is the lower limit for the npages value.
# KSM_NPAGES_MIN=64

# KSM_NAGES_MAX is the upper limit for the npages value.
# KSM_NPAGES_MAX=1250

# KSM_TRES_COEF - is the RAM percentage to be calculated in parameter thres.
# KSM_THRES_COEF=20

# KSM_THRES_CONST - If this is a low memory system, and the thres value is less than KSM_THRES_CONST, then reset thres value to KSM_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 でゲストをオーバーコミットすると可能かもしれませんが、ゲスト仮想マシンのメモリー使用によりページが共有されない可能性があるためです。