ターゲットコアモジュール (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は、シナリオに基づいて最適化を選択できます。
バイパスデータ領域
この最適化は、バックストアが独自のデータバッファを管理するシナリオに適しています。
readやinquiryコマンドなどのDMA_FROM_DEVICEコマンドでは、データをユーザー空間バッファからデータ領域にコピーし、データ領域からSGLページにコピーする必要があります。bypass data areaを有効にすると、データはユーザースペースバッファーからSGLページに直接コピーされます。writeやwritesameコマンドなどのDMA_TO_DEVICEコマンドでは、SGLページからデータ領域にデータをコピーし、データ領域からユーザー空間バッファにデータをコピーする必要があります。bypass data areaを有効にすると、データはSGLページからuserspacebufferに直接コピーされます。
ゼロコピー
この最適化は、バックストアが独自のデータバッファを管理せず、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)