すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Linux:TCMUのコピー操作の最適化

最終更新日:Feb 12, 2025

ターゲットコアモジュール (TCM) は、カーネル内インターネットスモールコンピュータシステムインターフェイス (iSCSI) ターゲットであるLinux-IOターゲット (LIO) の別名です。 ユーザ空間におけるTCM (TCMU) は、LIOのユーザ空間実装である。 TCMUにより、ユーザ空間プログラムは、便利な方法で様々なユーザ空間バックエンド実装と協調することができる。 TCMUフレームワークとLIOループバック (tcm_loop) モジュールを使用することで、ユーザースペースiSCSIターゲットを簡単に実装できます。 このトピックでは、Alibaba Cloud Linux 3が提供するTCMUのコピー操作の最適化について説明します。

制限事項

  • オペレーティングシステム: Alibaba Cloud Linux 3

  • カーネルバージョン: 5.10.134-14以降

すべてのTCMUプロセスは、読み取り /書き込み操作における再コピー操作を含み、これは、高スループットシナリオにおけるパフォーマンスに大きく影響する。 Alibaba Cloud Linux 3は、TCMUに対して以下の最適化を提供します。

  • バイパスデータ領域: この最適化は、TCMUインターフェースのユーザ空間アプリケーションがユーザ空間データバッファとカーネル散乱収集リスト (SGL) ページとの間でデータをコピーすることを可能にするioctlインターフェースを提供する。

  • zero copy: この最適化はioctlインターフェイスを提供し、TCMUインターフェイスのユーザースペースアプリケーションがtcmu-runnerによる直接アクセスのためにカーネルSGLページをユーザースペースにマッピングできるようにします。

シナリオ

tcmu-runnerは、シナリオに基づいて最適化を選択できます。

バイパスデータ領域

この最適化は、バックストアが独自のデータバッファを管理するシナリオに適しています。

  1. readinquiryコマンドなどのDMA_FROM_DEVICEコマンドでは、データをユーザー空間バッファからデータ領域にコピーし、データ領域からSGLページにコピーする必要があります。 bypass data areaを有効にすると、データはユーザースペースバッファーからSGLページに直接コピーされます。

  2. writewritesameコマンドなどのDMA_TO_DEVICEコマンドでは、SGLページからデータ領域にデータをコピーし、データ領域からユーザー空間バッファにデータをコピーする必要があります。 bypass data areaを有効にすると、データはSGLページからuserspace bufferに直接コピーされます。

ゼロコピー

この最適化は、バックストアが独自のデータバッファを管理せず、TCMUのデータ領域を使用して読み取り /書き込み操作を実行するシナリオに適しています。 この最適化を有効にするときは、次の項目に注意してください。

  • ゼロコピーは、コピー操作と比較して、I/Oコマンドのサイズが256 KB以上の場合、パフォーマンスが大幅に向上します。 この最適化を有効にするかどうかは、ビジネスI/Oモデルに基づいて決定する必要があります。

  • I/Oコマンドがtcmu-runnerフリーズしてタイムアウトすると、対応するメモリマッピングが解除され、コマンドへのその後のアクセスがSIGBUSをトリガーします。 このシナリオの影響を評価する必要があります。

  • ゼロコピー最適化は、I/Oコマンドサイズと各SGLページオフセットが4KB整列されている場合にのみ使用されます。

    説明

    4KBアライメントは、開始オフセットと長さが4KBの倍数であることを意味します。

デバイス設定インターフェイス

バイパスデータ領域ゼロコピーの最適化は、異なるタイプの読み取り /書き込みコマンドに対して異なる設定を提供します。 バイパスデータ領域とゼロコピー最適化を有効にした場合、ゼロコピー最適化が優先されます。 バイパスデータ領域最適化は、ゼロコピー最適化が使用できない場合にのみ使用されます。

バイパスデータ領域

  • read_bypass_data_area: デフォルトでは、このインターフェイスは読み取りコマンド (DMA_FROM_DEVICEコマンド) に対してfalseに設定されています。 このインターフェイスをtrueに設定して、バイパスデータ領域の最適化を有効にします。

  • write_bypass_data_area: デフォルトでは、このインターフェイスは書き込みコマンド (DMA_TO_DEVICEコマンド) に対してfalseに設定されています。 このインターフェイスをtrueに設定して、バイパスデータ領域の最適化を有効にします。

設定属性の照会

構成属性が格納されるパスは、デバイスによって異なります。 この例では、user_0/testblkパスが使用されます。

sudo cat /sys/kernel/config/target/core/user_0/testblk/attrib/read_bypass_data_area
sudo cat /sys/kernel/config/target/core/user_0/testblk/attrib/write_bypass_data_area

設定属性の変更

sudo bash -c "echo 1 > /sys/kernel/config/target/core/user_0/testblk/attrib/read_bypass_data_area"
sudo bash -c "echo 1 > /sys/kernel/config/target/core/user_0/testblk/attrib/write_bypass_data_area"

ゼロコピー

  • read_zc_size: デフォルトでは、このインターフェイスは読み取りコマンド (DMA_FROM_DEVICEコマンド) に対して0 KBに設定されています。 このインターフェイスをゼロ以外の値に設定し、コマンドサイズがその値を超え、アライメント要件を満たしている場合、ゼロコピー最適化が有効になります。

  • write_zc_size: デフォルトでは、このインターフェイスは書き込みコマンド (DMA_TO_DEVICEコマンド) に対して0 KBに設定されています。 このインターフェイスをゼロ以外の値に設定し、コマンドサイズがその値を超え、アライメント要件を満たしている場合、ゼロコピー最適化が有効になります。

設定属性の照会

構成属性が格納されるパスは、デバイスによって異なります。 この例では、user_0/testblkパスが使用されます。

sudo cat /sys/kernel/config/target/core/user_0/testblk/attrib/read_zc_size
sudo cat /sys/kernel/config/target/core/user_0/testblk/attrib/write_zc_size

設定属性の変更

sudo bash -c "echo 256 > /sys/kernel/config/target/core/user_0/testblk/attrib/read_zc_size"
sudo bash -c "echo 256 > /sys/kernel/config/target/core/user_0/testblk/attrib/write_zc_size"

ユーザープログラミングインターフェイス

/usr/include/linux/target_core_user.hファイルの定義を参照してください。

struct tcmu_data_xfer {
  __u16 cmd_id;
  __u16 __pad1;
  __u32 iov_cnt;
  struct iovec __user *iovec;
};

struct tcmu_cmd_zerocopy {
  struct iovec __user *iov;
  __u32 iov_cnt;
  __u16 cmd_id;
};

#define TCMU_IOCTL_CMD_COPY_TO_SGL    _IOW('T', 0xe0, struct tcmu_data_xfer)
#define TCMU_IOCTL_CMD_COPY_FROM_SGL  _IOR('T', 0xe1, struct tcmu_data_xfer)
#define TCMU_IOCTL_CMD_ZEROCOPY       _IOW('T', 0xe2, struct tcmu_cmd_zerocopy)