PR
スポンサーリンク

[Nutanix]/etc/iscsi/iscsid.confの設定値を整理~その2

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

はじめに

LinuxやVolume Groupのベストプラクティスで/etc/iscsi/iscsid.confのパラメータのデフォルト値を修正することが推奨されています。

しかし、このファイルの構成がどのようになっていて、デフォルト値でどのような設定が定義されているのか理解できていなかったため、この機会に整理しました。

前回の記事

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

お断り

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

使用したマシン

AHVを使用しました。

Kernel: Linux 5.10.194-5.20230302.0.991650.el8.x86_64

version:el8.nutanix.20230302.101026

ファイルの構成

次の通りです。

  1. iscsid daemon config
  2. NIC/HBA and driver settings
  3. Startup settings
  4. CHAP Settings
  5. Timeouts
  6. Retry
  7. session and device queue depth
  8. MISC SYSTEM PERFORMANCE SETTINGS
  9. iSCSI settings
  10. Workarounds

※青字がこの記事の対象

Retry

この設定は、iscsidデーモンが初期ログイン試行時にログインを再試行する回数を指定するものです。

node.session.initial_login_retry_max
このオプションは、node.conn[0].timeo.login_timeoutが有効な場合に、iSCSIイニシエーターがログイン試行に失敗した際、どの程度まで再試行を行うかを決定します。
iscsidは、ログインの再試行回数を指定された値に基づいて行います。
ただし、ネットワークやターゲットによる速やかなエラー応答など、node.conn[0].timeo.login_timeout以前にログインが失敗した場合、この設定値を超えて再試行することもあります。

・タイムアウト計算
最大再試行時間の計算式: 再試行回数(node.session.initial_login_retry_max)とログインタイムアウト(node.conn[0].timeo.login_timeout)の積を用いて、初期ログインに費やす最大時間を計算します。
デフォルト設定:
node.session.initial_login_retry_max = 8
node.conn[0].timeo.login_timeout = 15秒
最大時間: $$15秒 \times 8 = 120秒$$

・有効な値
任意の整数値を指定可能です。ただし、次のような影響があります:

値が高い場合:
再試行回数が増えるため、iSCSIサービスの起動時間が遅延する可能性があります。
値が低い場合:
ネットワークが準備できていない場合や起動中に途切れが生じた場合、セッションがログインに失敗するリスクが高まります。

・推奨設定
通常はデフォルト値(8)が適切ですが、環境に応じて調整可能です。

高負荷のネットワーク環境:
再試行回数を増やす(例:10や12)ことでログイン成功率を高めることができます。
ログイン遅延を最小化したい場合:
再試行回数を減らす(例:5)ことで起動時間を短縮します。ただし、ログイン失敗のリスクに注意してください。

session and device queue depth

この設定は、iSCSIセッションおよびデバイスに関連するコマンドのキュー数やキューの深さを制御するものです。

node.session.cmds_max
iSCSIセッションがキューに保持できるコマンドの最大数を設定します。
値は 2から2048までの範囲で、2の累乗(例: 2, 4, 8, 16, 128)である必要があります。
デフォルト値: 128
用途:
コマンドの最大キュー数を増やすと、iSCSIターゲットが処理できる要求の数を拡張でき、パフォーマンスが向上する場合があります。
一方、必要以上に大きな値を設定するとリソースの消費が増える可能性があります。
node.session.queue_depth
個々のiSCSIデバイス(論理ユニット/LUN)におけるI/Oキューの深さを制御します。
値は 1から1024の範囲で設定可能です。
デフォルト値: 32
用途:
キュー深度を大きくすると、一度に送信できるI/O要求の数が増え、高いスループットが得られることがあります。
ただし、ストレージデバイスやコントローラーの制約により、過剰なキュー深度はパフォーマンスを低下させる可能性があります。

MISC SYSTEM PERFORMANCE SETTINGS

この設定は、iSCSIセッションで使用されるスレッドの優先度(スレッド・スケジューリングの優先度)を調整するためのものです。

node.session.xmit_thread_priority
1. スレッドの役割
・ソフトウェアiSCSI(iscsi_tcp)およびiSER(ib_iser):
各セッションごとにスレッドが作成され、そのスレッドがデータの送信やハードウェアへのキューイングを担当します。

・cxgb3i:
ホストごとにスレッドが作成されます。
注意点として、cxgb3iを使用する場合、すべてのセッションで同じ優先度を設定する必要があります。異なる値を設定すると動作が未定義となります。

2. node.session.xmit_thread_priority の設定
・目的:
スレッド優先度を調整することで、iSCSIデータ送信に関するスレッドの動作を最適化します。

・優先度の調整:
 値の範囲: -20 ~ 20

・低い値(デフォルト: -20):
スレッドの優先度が高くなります(Linuxのスケジューラーにおいて、低い値がより高い優先度として扱われます)。
結果として、高いスループットと低いレイテンシーが期待されます。

・高い値(例: 0 や 20):
優先度が下がり、スレッドによるCPU使用が制限されます。
この設定は、CPUリソースが枯渇している場合や、他のプロセスの優先度を確保したい場合に有効です。

3. 設定の影響
・低優先度(-20など):
データ転送の性能(スループット・レイテンシー)が向上します。
ただし、CPUを多く消費する可能性があり、他のプロセスに影響を与える場合があります。

・高優先度(0や20):
スレッドのCPU使用が抑えられますが、I/O性能が低下することがあります。
iSCSIやSCSIスレッドがCPUのリソースを過剰に占有している場合に役立ちます。

4. 推奨設定
デフォルトの-20は、ほとんどの環境で最適化されています。
CPU使用率が高すぎる場合は、値を少しずつ上げて(例: -10 や 0)、システム全体のバランスを調整してください。

iSCSI settings

node.session.iscsi.InitialR2T
役割: データ送信のR2T(Ready to Transfer)フロー制御を有効または無効にします。
Yes: イニシエーターはR2Tコマンドを受信後にのみデータを送信できます(フロー制御有効)。
No(デフォルト): イニシエーターは「FirstBurstLength」で指定されたデータをR2Tなしで直接送信できます。
node.session.iscsi.ImmediateData
役割: iSCSIコマンドPDU(Protocol Data Unit)と共に未承諾データを送信するかどうかを制御します。
Yes(デフォルト): イニシエーターは未承諾データを送信します。
No: イニシエーターは未承諾データを送信しません。
node.session.iscsi.FirstBurstLength
役割: イニシエーターがR2Tなしで送信できるデータバイト数の最大値を指定します。
デフォルト値: 262144バイト
範囲: 512 ~ 2²⁴-1(約16MB)
node.session.iscsi.MaxBurstLength
役割: イニシエーターとターゲット間で交渉される最大SCSIペイロードのサイズを指定します。
デフォルト値: 16776192バイト(約16MB)
範囲: 512 ~ 2²⁴-1(約16MB)
node.conn[0].iscsi.MaxRecvDataSegmentLength
役割: イニシエーターがターゲットから1つのiSCSI PDUで受信できる最大バイト数を指定します。
デフォルト値: 262144バイト(256KB)
範囲: 512 ~ 2²⁴-1
node.conn[0].iscsi.MaxXmitDataSegmentLength
役割: イニシエーターがターゲットに1つのiSCSI PDUで送信できる最大データバイト数を指定します。
デフォルト値: 0(ターゲットのMaxRecvDataSegmentLengthを使用)
範囲: 512 ~ 2²⁴-1
discovery.sendtargets.iscsi.MaxRecvDataSegmentLength
役割: ディスカバリーセッションでターゲットから受信できるデータバイト数の最大値を指定します。
デフォルト値: 32768バイト(32KB)
範囲: 512 ~ 2²⁴-1
node.conn[0].iscsi.HeaderDigest
役割: iSCSIヘッダーのCRC32Cチェックサム(ヘッダーダイジェスト)機能を制御します。
CRC32C: チェックサム検証を有効にします。
None(デフォルト): チェックサム検証を無効にします。
node.session.nr_sessions
役割: 各iSCSIノードで作成されるセッションの数を指定します。
デフォルト値: 1
用途: マルチパス環境では複数セッションを構成できます。
node.session.reopen_max
役割: セッションの回復時に再接続を試みる最大回数を設定します。
デフォルト値: 0(無制限)
例: 値を150に設定した場合、セッションは約5分間(2秒間隔で最大150回)再接続を試みます。

Workarounds

この設定は、iSCSIセッションでの特定の動作やエラーハンドリング、スキャンプロセスの挙動を制御するためのオプションについて説明しています。

node.session.iscsi.FastAbort
このオプションは、iSCSIイニシエーター(クライアント側)がタスク管理機能(例えばABORT TASKまたはLOGICAL UNIT RESET)を送信した後の挙動を制御します。
動作モード:
 Yes(デフォルト):
  イニシエーターがタスク管理機能を送信した後、ターゲットがR2T(Ready to Transfer)などのプロトコルデータユニット(PDU)に応答しないようにします。
  主にIET(iSCSI Enterprise Target)などがこの動作を好みます。

有効化方法:
 bash
 node.session.iscsi.FastAbort = Yes

 No:
  タスク管理機能送信後もターゲットがPDU(R2Tなど)に応答を継続します。
  EqualLogicなどのターゲットがこの動作を好みます。

有効化方法:
 bash
 node.session.iscsi.FastAbort = No
node.session.scan
LUN(Logical Unit Number)の自動スキャン動作を制御します。
この設定は、不要なLUNをシステムに追加しないようにするために役立ちます。
動作モード:
 auto(デフォルト):
 自動スキャンが有効になります。以下の場合にスキャンが実行されます:
  ・セッションの起動時
  ・ログイン時
  ・AEN(Asynchronous Event Notification)/AER(Asynchronous Event Reporting)受信時(デバイスが対応している場合)

 マニュアルモード:
  自動スキャンを無効化し、明示的にリクエストされたスキャンのみを実行します。
 以下の設定を使用して自動スキャンを無効化:
  bash
  node.session.scan = manual
補足: このオプションはscsi_modのスキャンパラメーターとは独立して動作します。

関連記事

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

コメント

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