web-dev-qa-db-ja.com

スワップを無効にせずに重要なVMをメモリに保持するにはどうすればよいですか?

VMホスト-> Xenon E5-2440 w/48G mem ...すべてがCentOS6.5(2.6.32-431)を実行します

2Gのメモリを搭載した4つのゲストVMを実行しています。それらのディスクイメージはローカルファイルです。ホストマシンも使用頻度の低いNFSサーバーを実行していますが、それ以外はあまり実行していません。 (swappiness = 0)1日ほど後、バッファキャッシュが40G近くまで増加すると、これらのVMの一部はほぼ完全にディスクにスワップされます。 (表示:grep VmSwap/proc/PID/status)

私が抱えている問題は、これらのVMが定期的に使用されていない可能性がある一方で、準備ができている必要があることです。ただし、実際には、それらは交換されており、応答時間に深刻な問題を引き起こしています。

私は確かに、ゲストVMに適切なサイズのスワップファイルを使用させ、OSにバッファキャッシュとスワップのバランスを決定させることに全力を注いでいますが、これは私のユースケースではホストマシンでは機能していないようです。

ホストマシンでスワップを無効にする以外に、VMの応答性が低下しないようにするオプションはありますか? cgroupsを試してみるか、このユースケースのスワップファイルのプラグを抜いてみますか?

4
user2970347

Libvirtの新しいバージョンでは、ページをメモリにロックできます。-

http://libvirt.org/formatdomain.html#elementsMemoryBacking

注意:これは、Fedora 19をハイパーバイザーとして使用している場合は表示されませんが、EL6の最新のRPM(私が見つけることができます)の変更ログによると。 5libvirtこれが存在します。

  • 2013年7月18日木曜日JiriDenemark-0.10.2-21
    • conf:pmsuspendedドメイン状態のNULL derefを回避します(rhbz#822306)
    • libvirt:ドメインクラッシュイベントタイプを定義します(rhbz#822306)
    • qemu:processWatchdogEventのリファクタリング(rhbz#822306)
    • qemu:qemuProcessShutdownOrReboot()を公開します(rhbz#822306)
    • qemu:ゲストがパニックになったときに「oncrash」イベントを実装します(rhbz#822306)
    • qemu:ゲストがパニックになったときに「oncrash」コアダンプイベントを実装します(rhbz#822306)
    • conf:NATポートXMLノードを解析する際のメモリリークを修正しました(rhbz#851455)
    • security_manager:比較を修正しました(rhbz#984793)
    • qemu:ゲストエージェントを設定せずにlibvirtdがクラッシュするのを防ぎます(rhbz#984821)
    • qemu:qemuAgentGetVCPUs()で返されたJSON配列のdouble freeを修正しました(rhbz#984821)
    • qemu_agent:コマンドに配列を追加するためのサポートを追加しました(rhbz#924400)
    • ドメインのメモリページをロックするためのサポートを追加します(rhbz#947118)
    • qemu:ドメインのメモリページをロックするためのサポートを実装します(rhbz#947118)
    • qemu:-realtime mlock = on | offサポートを確認します(rhbz#947118)
    • qemu:メモリ制限の計算を再利用可能な関数に移動します(rhbz#947118)
    • util:新しいvirCommandSetMax(MemLock | Processes | Files)(rhbz#947118)
    • qemu:memoryBacking/lockdが使用されている場合にRLIMIT_MEMLOCKを設定します(rhbz#947118)
    • サポートされているネットワークディスクバックエンドとしてGlusterプロトコルを追加します(rhbz#849796)
    • qemu:glusterプロトコルベースのネットワークストレージバックエンドのサポートを追加します。 (rhbz#849796)
    • テスト:glusterプロトコルベースのネットワークディスクサポートのテストを追加します(rhbz#849796)
2
Matthew Ife

Cgroupを使用して、cgroupごとにswappinessを設定できます

http://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt

http://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt

A KVM仮想CPUはホスト上の単なるスレッドであるため、他のプロセスと同様に制御できます。

1
dyasny

マシューのソリューションのステップバイステップの説明は次のとおりです。

  1. VMをシャットダウンします
  2. virt-xml $VMNAME --edit --memorybacking locked=on
  3. systemctl restart libvirtd(それが必要かどうかわからない)
  4. VMを起動します

ここで、$VMNAMEはVMの名前です。

以前はVMが完全にスワップアウトされる状況を無事に通過しました。これで、VMのqemuプロセスのスワップ使用量は0になり、応答します。

警告: libvirtドキュメント によると、qemuのすべてのメモリがロックされ、予期せず大きくなる可能性があるため、ホストシステムを保護するためにhard_limitを設定する必要があります(VM制限内にとどまるために必要な場合は殺されます)。

編集:簡略化されたステップ2(virsh edit $VMNAMEであり、<memoryBacking><locked/></memoryBacking>の後に<domain type='kvm'>を追加)

1
Joachim Wagner