PR
スポンサーリンク

[Nutanix]Linuxのベストプラクティスを整理~その1

スポンサーリンク
Linux
Nutanix logo
記事内に広告が含まれています。
スポンサーリンク
スポンサーリンク

はじめに

参考に掲載させていただいているドキュメントで、主にAHVでLinux OSを利用したVMを使用する場合のベストプラクティスが載っています。今回は、管理人の勉強を兼ねて整理したものを紹介します。

ボリュームの関係で2つの記事に分けております。

“This best practice guide provides the recommended settings for Nutanix AHV clusters and Linux operating systems, including Oracle Linux and Red Hat Enterprise Linux. It covers vDisk (LUN) configuration and settings, Logical Volume Manager (LVM) configuration, file system settings for ext4 and XFS, and kernel parameters. Most of the recommendations in this guide also apply to other hypervisor environments on Nutanix”

概要

主にストレージに関する設定について述べられています。

  • ストレージコンテナの設定
  • カーネルパラメータの設定
  • Native vDiskもしくはVolume Groupの利用判断基準
  • Volume Groupを利用する場合のiSCSIパラメータ設定
  • LVMの作成方法(ストライピングを含む)
  • 主要なファイルシステムのマウントオプション
  • デバイスの最適化設定

※青字がこの記事の対象。

お断り

本記事の説明には、Microsoft Copilotを使用しております。

Nutanixの分散ストレージ

  • 最低3ノード構成、replication factorは最低でも2を使用。ノード障害時のデータ損失を防止するため。
  • 圧縮は有効。
  • 重複排除は無効化。
  • イレイジャーコーディング(EC-X)は無効化。

余談となりますが、重複排除を有効化するシチュエーションをNutanixのドキュメントでみたことがありません。

カーネル

vm.overcommit_memory=1
【説明】
vm.overcommit_memory は、Linuxカーネルの仮想メモリ管理に関する設定パラメータです。
このパラメータは、メモリのオーバーコミットをどのように扱うかを決定します。
オーバーコミットとは、システムが実際に利用可能な物理メモリよりも多くのメモリをプロセスに割り当てることを指します。
vm.overcommit_memory の設定値は以下の通りです
• 0: デフォルト設定。カーネルはメモリの割り当て要求が現在のメモリ量(物理メモリ + スワップ)に収まるかどうかをチェックし、大きな要求のみを拒否します。つまり、ある程度のオーバーコミットを許可します。
• 1: カーネルはメモリのオーバーコミットを制御しません。これにより、メモリ集中型タスクのパフォーマンスが向上しますが、メモリがオーバーロードする可能性が高まります。
• 2: カーネルは、利用可能なスワップ領域の合計と vm.overcommit_ratio で指定される物理RAMの割合以上のメモリ要求を拒否します。これにより、メモリのオーバーコミットのリスクが軽減されますが、物理メモリよりも大きいスワップ領域があるシステムのみに推奨されます。

この設定により、システムのメモリ管理の挙動を調整し、パフォーマンスと堅牢性のバランスを取ることができます。
たとえば、以下のように設定できます:
bash
sudo sysctl -w vm.overcommit_memory=1
※一時的に適用する場合
vm.dirty_background_ratio=5
【説明】
vm.dirty_background_ratio は、Linuxカーネルの仮想メモリ管理に関する設定パラメータの一つで、バックグラウンドでのディスク書き込みのスケジュールを制御します。
このパラメータは、システムの総メモリの何パーセントが「dirty」状態、つまりディスクへの書き込みが未完了のデータとして扱われるかを指定します。
vm.dirty_background_ratioの設定値は、次のように解釈されます:
• 値が大きいほど、多くのメモリがディスクへの書き込みを待つことができます。この場合、ディスクへの書き込みが行われる頻度が減るため、システムのパフォーマンスが向上する可能性がありますが、突然の電源断やシステム障害時にデータが失われるリスクが高まります。
• 値が小さいほど、ディスクへの書き込みが頻繁に行われます。これにより、データの安全性が向上しますが、ディスクI/O操作が増えるため、システムのパフォーマンスが低下する可能性があります。
このパラメータを調整することで、データの安全性とシステムのパフォーマンスのバランスを取ることができます。具体的な値は、システムの用途やハードウェア構成によって異なるため、最適な値を見つけるためにテストが必要です。

たとえば、以下のように設定できます:
bash
sudo sysctl -w vm.dirty_background_ratio=10
※一時的に適用する場合
これは、バックグラウンドのディスク書き込みが総メモリの10%に達した時点で実行されることを意味します。
vm.dirty_ratio=15
【説明】
vm.dirty_ratio は、Linuxカーネルの仮想メモリ管理に関する設定パラメータで、システムの総メモリの何パーセントが「dirty」状態、つまりディスクへの書き込みが未完了のデータとして扱われるかを指定します。
このパラメータは、バックグラウンドとフォアグラウンドでのディスク書き込みのスケジュールを制御します。
具体的な意味としては以下の通りです:
• vm.dirty_ratio は、システムの総メモリの何パーセントが「dirty」状態であるかを設定します。この値を超えた場合、カーネルはすべての書き込み操作を強制的にディスクにフラッシュします。
設定値が大きい場合、メモリに未書き込みのデータが多く残るため、ディスクへの書き込み頻度が減りますが、突然の電源断やシステム障害時のデータ損失リスクが高まります。
設定値が小さい場合、ディスクへの書き込みが頻繁に行われるため、データの安全性が向上しますが、ディスクI/O操作が増え、システムのパフォーマンスが低下する可能性があります。

以下は例です:
bash
sudo sysctl -w vm.dirty_ratio=15
※一時的に適用する場合
この設定により、システムの総メモリの15%が未書き込みのデータ状態に達した時点で、カーネルはすべての書き込み操作をディスクにフラッシュします。
vm.dirty_expire_centisecs=500
【説明】
vm.dirty_expire_centisecs は、Linuxカーネルの仮想メモリ管理に関連する設定パラメータで、「dirty」状態のデータがどのくらいの時間メモリに保持されるかを決定します。
このパラメータは、ディスクへの書き込みが完了していないデータがメモリ内にとどまる最大期間を指定します。
設定値は、100分の1秒(センチ秒)単位で指定されます。
たとえば、設定値が3000の場合、これは30秒を意味します。
具体的な意味は以下の通りです:
• 値が大きい: データはより長い時間メモリにとどまります。これにより、ディスクI/O操作が減少し、システムパフォーマンスが向上する可能性がありますが、データが長時間ディスクに書き込まれないため、データ損失のリスクが高まります。
• 値が小さい: データはすぐにディスクに書き込まれます。これにより、データの安全性が向上しますが、頻繁なディスクI/O操作によってシステムパフォーマンスが低下する可能性があります。

以下の例では、データがメモリ内に保持される最大期間を60秒に設定します:
bash
sudo sysctl -w vm.dirty_expire_centisecs=6000
※一時的に適用する場合
これにより、ディスクへの書き込みが未完了のデータは60秒間メモリ内に保持され、その後ディスクにフラッシュされます。
vm.dirty_writeback_centisecs=100
【説明】
vm.dirty_writeback_centisecs は、Linuxカーネルの仮想メモリ管理に関する設定パラメータで、バックグラウンドでのディスク書き込みの頻度を制御します。
このパラメータは、ディスクへのバックグラウンド書き込みプロセスが実行される間隔を100分の1秒(センチ秒)単位で指定します。
具体的な意味は以下の通りです:
• 値が小さい: より頻繁にバックグラウンド書き込みプロセスが実行されるため、データがより迅速にディスクにフラッシュされますが、ディスクI/O操作が増え、システムのパフォーマンスが低下する可能性があります。
• 値が大きい: バックグラウンド書き込みプロセスの間隔が長くなるため、ディスクI/O操作が減り、システムのパフォーマンスが向上する可能性がありますが、データが長時間メモリにとどまり、突然の電源断やシステム障害時のデータ損失リスクが高まります。

以下の例では、バックグラウンド書き込みプロセスの間隔を5秒に設定します:
bash
sudo sysctl -w vm.dirty_writeback_centisecs=500
※一時的に適用する場合
この設定により、バックグラウンド書き込みプロセスが5秒ごとに実行されます。
vm.swappiness=0
【説明】
vm.swappiness は、Linuxカーネルの仮想メモリ管理に関連するパラメータで、システムが物理メモリをスワップ領域にどの程度積極的に移動させるかを制御します。
スワップは、RAM(物理メモリ)が不足したときに使用されるディスク領域です。
具体的には、vm.swappiness の値は以下のように解釈されます:
• 値が大きい (デフォルトは60): カーネルはメモリページをディスクのスワップ領域により積極的に移動させます。これにより、物理メモリの使用が少なくなり、他のプロセスに多くのメモリが割り当てられる可能性がありますが、ディスクI/O操作が増えるため、パフォーマンスが低下する場合があります。
• 値が小さい: カーネルはスワップをあまり積極的に使用しません。これにより、物理メモリが優先的に使用されるため、システムのパフォーマンスが向上しますが、物理メモリが枯渇するリスクが高まります。

たとえば、以下のコマンドでスワップネスの値を設定することができます:
bash
sudo sysctl -w vm.swappiness=30
※一時的に適用する場合
この設定により、カーネルは物理メモリをより積極的に使用し、スワップの利用を減らします。

永続的に設定を反映させるには次のフローが必要となります。

  • sysctl.confに既に紹介したパラメータを追加して保存
bash
sudo vi /etc/sysctl.conf
  • 設定を再読み込みします。
sudo sysctl -p
  • 確認コマンド
sysctl vm.overcommit_memory
sysctl vm.dirty_background_ratio
sysctl vm.dirty_ratio
sysctl vm.dirty_expire_centisecs
sysctl vm.dirty_writeback_centisecs
sysctl vm.swappiness

ジャンボフレーム

  • CVMのNICはMTU1500以上をサポートしていません。
  • ゲストVMのNICではJumbo Framesがサポートされています。使用する場合には、Open Virtual Switch、サーバのNIC、ToRスイッチのMTUサイズを調整する必要があります。

ディスクの種類

  1. Native vDisk(VMを作成する時にディスクを追加すると思いますが、それのこと)
  2. Volume Group(Nutanix独自の技術。複数のCVMによるI/Oを可能にする)

※推奨設定などではなく、あくまでも種類を述べています。

ボリュームグループの種類

①デフォルト・ボリュームグループ

  • Nutanix内のvDiskの負荷分散を行わない。
  • VG内の全てのvDiskが単一のCVMによって管理。全てのI/OはこのCVMを経由。

②ロードバランシング付きボリュームグループ

  • クラスタ内の全てのCVMにvDiskの所有権を分散。
  • ネットワークの帯域幅が大幅に増加、I/O遅延が大きくなる可能性あり。

※推奨設定などではなく、あくまでも種類を述べています。

ボリュームグループ内のvDisk数

  • 最小値 = ノード数。vDiskを各ノードへ分散することを踏まえると理にかなってます。
  • 処理の重いワークロードについては、ノード数×4~8が推奨。
  • boot用のディスクとしてならば最低1個。
  • データベースのデータファイル、制御ファイル、redoログファイルなら最低8個。
  • データベースのアーカイブログファイルならば最低4個。
  • データベースのRMANバックアップファイルならば最低4個。

ディスク数を増やすことによるパフォーマンスの変化については、こちらを参照してください。

Nutanix Support & Insights

ボリュームグループ使用時のiSCSIの設定

/etc/iscsi/iscsid.confの該当項目を修正してください。

iscsid.confファイルで定義されている項目について整理した記事はこちらとなります。こちらで設定項目を押さえてから確認していただくのがよいでしょう。

[Nutanix]/etc/iscsi/iscsid.confの設定値を整理~その1
はじめにLinuxやVolume Groupのベストプラクティスで/etc/iscsi/iscsid.confのパラメータのデフォルト値を修正することが推奨されています。しかし、このファイルの構成がどのようになっていて、デフォルト値でどのよ...
[Nutanix]/etc/iscsi/iscsid.confの設定値を整理~その2
はじめにLinuxやVolume Groupのベストプラクティスで/etc/iscsi/iscsid.confのパラメータのデフォルト値を修正することが推奨されています。しかし、このファイルの構成がどのようになっていて、デフォルト値でどのよ...
node.session.timeo.replacement_timeout = 120

セッションの再接続にかかるタイムアウトの時間を秒単位で指定します。この例では120秒間です。

node.conn[0].timeo.noop_out_interval = 5

NOOP(No Operation)コマンドを送信する間隔を秒単位で指定します。この例では5秒ごとです。

node.conn[0].timeo.noop_out_timeout = 10

NOOPコマンドのタイムアウト時間を秒単位で指定します。この例では10秒間です。

node.session.cmds_max = 2048

セッションごとに許可される最大コマンド数を指定します。この例では2048コマンドです。

node.session.queue_depth = 1024

単一のセッションでキューに入れることができる最大I/O操作の数を指定します。この例では1024です。

node.session.iscsi.ImmediateData = Yes

即時データの転送を有効にするかどうかを指定します。この例では有効(Yes)になっています。即時データは、コマンドとともにデータがすぐに送信されることを意味します。

node.session.iscsi.FirstBurstLength = 1048576

最初のバースト転送の最大データサイズをバイト単位で指定します。この例では1048576バイト(1MB)です。

node.session.iscsi.MaxBurstLength = 16776192

単一のバースト転送の最大データサイズをバイト単位で指定します。この例では16776192バイト(約16MB)です。

node.conn[0].iscsi.MaxRecvDataSegmentLength = 1048576

受信データセグメントの最大長さをバイト単位で指定します。この例では1048576バイト(1MB)です。

discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 1048576

ディスカバリー中にターゲットから受信するデータセグメントの最大長さをバイト単位で指定します。この例では1048576バイト(1MB)です。

続き

[Nutanix]Linuxのベストプラクティスを整理~その2
はじめに参考に掲載させていただいているドキュメントで、主にAHVでLinux OSを利用したVMを使用する場合のベストプラクティスが載っています。今回は、管理人の勉強を兼ねて整理したものを紹介します。ボリュームの関係で2つの記事に分けており...

参考

Nutanix Support & Insights

 

 

 

コメント

タイトルとURLをコピーしました