Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

8.3. Kernel Same-page Merging(KSM)

KVM ハイパーバイザーが使用する Kernel same-page Merging(KSM)により、KVM ゲストが同じメモリーページを共有できます。この共有ページは通常、一般的なライブラリーや他の同一データです。KSM により、メモリーの重複を回避して、同一または同様のゲストオペレーティングシステムのゲスト密度が高まります。
共有メモリーの概念は、最新のオペレーティングシステムでは一般的です。たとえば、プログラムが最初に起動すると、親プログラムとすべてのメモリーを共有します。子または親プログラムがこのメモリーを変更しようとすると、カーネルは新しいメモリーリージョンを割り当て、元のコンテンツをコピーして、プログラムがこの新しいリージョンを変更できるようにします。これは、書き込み時のコピーとして知られています。
KSM は、この概念を逆に使用する Linux 機能です。KSM により、カーネルは実行中の 2 つ以上のプログラムを調べ、そのメモリーを比較することができます。メモリー領域またはページが同じであれば、KSM は、1 ページに同じ複数のメモリーページを減らします。このページには、書き込み時にコピーのマークが付けられます。ページのコンテンツがゲスト仮想マシンによって変更されると、そのゲストに新しいページが作成されます。
これは、KVM を使用した仮想化に役に立ちます。ゲスト仮想マシンが起動すると、ホスト qemu-kvm プロセスからメモリーのみが継承されます。ゲストの実行後、ゲストが同じオペレーティングシステムまたはアプリケーションを実行する場合は、ゲストオペレーティングシステムイメージのコンテンツを共有できます。KSM により、KVM は同一のゲストメモリー領域を共有するよう要求できます。
KSM により、メモリー速度と使用率が強化されます。KSM では、共通プロセスデータはキャッシュまたはメインメモリーに保存されます。これにより、KVM ゲストのキャッシュミスが軽減され、一部のアプリケーションやオペレーティングシステムのパフォーマンスが向上します。2 つ目は、メモリーを共有すると、ゲストの全体的なメモリー使用量が減り、これにより、大量のリソースの使用が可能になります。
注記
Red Hat Enterprise Linux 7 では、KSM が NUMA を認識しています。これにより、ページコアレッシング中に NUMA ローカリティーが考慮されるので、リモートノードに移動されたページに関連するパフォーマンスが低下するのを防ぐことができます。Red Hat は、KSM を使用している場合には、ノード間のメモリーマージを回避することを推奨します。KSM を使用している場合は、NUMA ノード間のページをマージしないように、/sys/kernel/mm/ksm/merge_across_nodes tunable を 0 に変更します。これは、virsh node-memory-tune --shm-merge-across-nodes 0 コマンドで実行できます。カーネルメモリーアカウンティングの統計は、最終的には複数のノード間のマージの後に相互に矛盾する可能性があります。そのため、KSM デーモンが大量のメモリーをマージすると、numad が混同する可能性があります。システムに大量の空きメモリーがある場合は、KSM デーモンをオフにして無効にすることで、パフォーマンスが向上する可能性があります。9章NUMAに関する詳しい情報は「」を参照してください。
重要
KSM を考慮していなくても、コミットされた RAM に十分なスワップサイズであることを確認します。KSM は、同一または同様のゲストの RAM 使用率を減らします。swap 領域が十分でない KSM を持つオーバーコミットを行うゲストは可能ですが、ゲスト仮想マシンのメモリー使用によりページが共有されなくなる可能性があるため、推奨されません。
Red Hat Enterprise Linux は、KSM を制御するには、以下の 2 つの方法を使用します。
これらのサービスはいずれも標準のサービス管理ツールで制御されます。
注記
Red Hat Enterprise Linux 6.7 では、KSM はデフォルトで無効になっています。

8.3.1. KSM サービス

  • Theksm サービスは qemu-kvm パッケージに含まれます。
  • ksm サービスが起動しない場合には、KSM(Kernel same-page merging)が 2000 ページのみを共有します。このデフォルト値により、制限されたメモリー保存の利点が得られます。
  • ksm サービスが起動すると、KSM は、ホストシステムのメインメモリーまで共有されます。ksm サービスを起動して、KSM がより多くのメモリーを共有するようにします。
# systemctl start ksm
Starting ksm:                                              [  OK  ]
Theksm サービスをデフォルトの起動シーケンスに追加できます。systemctl コマンドを使用して、ksm サービスを永続化します。
# systemctl enable ksm

8.3.2. KSM チューニングサービス

Theksmtuned サービスは、ループおよび調整により、kernel same-page merging(KSM) 設定を調整しますまた、ゲスト仮想マシンが作成または破棄されると、ksmtuned サービスは libvirt により通知されます。Theksmtuned サービスにはオプションがありません。
# systemctl start ksmtuned
Starting ksmtuned:                                         [  OK  ]
Theksmtuned サービスは、retune パラメーターを使用してチューニング機能を手動で実行するように指示するものです
/etc/ksmtuned.conf ファイルは、ksmtuned サービスの設定ファイルです。以下のファイル出力は defaultksmtuned.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 - is the 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_NPAGES_MAX - is the upper limit for the `npages` value.
# KSM_NPAGES_MAX=1250

# KSM_THRES_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
/etc/ksmtuned.conf ファイル内で、ksmd デーモンが非アクティブになる前に 、npages はスキャンするページ分を設定します。この値は、/sys/kernel/mm/ksm/pages_to_scan ファイルでも設定されます。
KSM_THRES_CONST の値は、アクティブ化するしきい値として使用される使用可能なメモリーの量を表しますksmd は、以下のいずれかが発生した場合はアクティベートされます。
  • KSM_THRES_CONST に設定されたしきい値を下回る空きメモリードロップの量。
  • コミットされたメモリー容量およびしきい値 KSM_THRES_CONST は、メモリーの合計量を超えます。

8.3.3. KSM 変数と監視

Kernel same-page merging(KSM)は、監視データを /sys/kernel/mm/ksm/ ディレクトリーに保存します。このディレクトリーのファイルはカーネルにより更新され、KSM の使用と統計の正確な記録です。
以下の一覧にある変数は、上記のように /etc/ksmtuned.conf ファイルの設定可能な変数でもあります。

/sys/kernel/mm/ksm/ にあるファイル:

full_scans
実行された完全スキャン数
merge_across_nodes
異なる NUMA ノードからページをマージできるかどうかを指定します。
pages_shared
共有されたページの合計数
pages_sharing
現在共有されているページ数
pages_to_scan
スキャンされなかったページ数
pages_unshared
共有されなくなったページ数
pages_volatile
揮発性のページ数
run
KSM プロセスが実行しているかどうか
sleep_millisecs
スリープ状態(ミリ秒単位)。
これらの変数は、virsh node-memory-tune コマンドを使用して手動で調整できます。たとえば、以下は、共有メモリーサービスがスリープ状態になる前にスキャンするページ数を指定します。
# virsh node-memory-tune --shm-pages-to-scan number
DEBUG=1 行が /etc/ksmtuned.conf ファイルに追加されると、KSM チューニングアクティビティーは /var/log /ksmtuned ログファイルに保存されます。ログファイルの場所は、LOGFILE パラメーターで変更できます。ログファイルの場所の変更は推奨されず、SELinux 設定の特別な設定が必要になる場合があります。

8.3.4. KSM の非アクティブ化

Kernel same-page merging(KSM)にはパフォーマンスのオーバーヘッドがあり、特定の環境やホストシステムでは大きすぎる可能性があります。KSM には、ゲスト全体で情報を漏えいするのに使用可能な、サイドチャネルも導入される可能性があります。これが懸念される場合は、KSM をゲストごとに無効にすることができます。
KSM を、ksmtuned サービスおよびksm サービスを停止すると 、非アクティブにすることができます。ただし、この操作は再起動後に維持されません。KSM を無効にするには、root としてターミナルで以下を実行します。
# systemctl stop ksmtuned
Stopping ksmtuned:                                         [  OK  ]
# systemctl stop ksm
Stopping ksm:                                              [  OK  ]
ksmtuned を停止して 、ksm は KSM を非アクティブにしますが、このアクションは再起動後に維持されません。systemctl コマンドを使用して、KSM を永続的に無効にします。
# systemctl disable ksm
# systemctl disable ksmtuned
KSM を無効にした場合は、KSM を無効にする前に共有されていたメモリーページは共有されます。システムの PageKSM をすべて削除するには、以下のコマンドを使用します。
# echo 2 >/sys/kernel/mm/ksm/run
これが実行されると、khugepaged デーモンは、KVM ゲストの物理メモリーに透過的なヒュージページを再構築できます。# echo 0 >/sys/kernel/mm/ksm/run を使用すると、KSM が停止しますが、以前に作成した KSM ページをすべて共有しません(これは # systemctl stop ksmtuned コマンドと同じです)。