NetACC はユーザーモードライブラリです。互換性のあるソケットインターフェイスを介して eRDMA により TCP アプリケーションを高速化します。コードの変更は不要です。
NetACC はパブリックプレビューです。
ユースケース
NetACC は、ネットワークオーバーヘッドが大きいシナリオに適しています。
秒間パケット数 (PPS) が高いワークロード、特に小さなパケットのトラフィック。NetACC は CPU オーバーヘッドを削減し、スループットを向上させます。たとえば、Redis がリクエストを処理する場合などです。
レイテンシーの影響を受けやすいワークロード:eRDMA は TCP よりも低レイテンシーを実現し、ネットワーク応答を高速化します。
有効期間の短い接続が頻繁に発生する場合:NetACC は接続確立を高速化し、接続確立時間を短縮してパフォーマンスを向上させます。
NetACC のインストール
インストール方法
eRDMA ドライバーを使用して NetACC をインストールする
NetACC は eRDMA ドライバーとともに自動的にインストールされます。「eRDMA の使用」トピックの「eRDMA を有効にする」をご参照ください。
NetACC を個別にインストールする
NetACC の特定バージョンをインストールする場合や、Elastic Compute Service (ECS) インスタンスで一時的に使用する場合は、次のコマンドを実行します:
sudo curl -fsSL https://netacc-release.oss-cn-hangzhou.aliyuncs.com/release/netacc_download_install.sh | sudo sh
設定ファイルと最適化パラメータ
インストール後、
/etc/netacc.conf設定ファイルが自動的に生成されます。ワークロードに応じて、次のパラメータを調整できます:NACC_SOR_MSG_SIZE:バッファサイズ。NACC_RDMA_MR_MIN_INC_SIZE:RDMA により登録される最初のメモリリージョン (MR) のサイズ。NACC_RDMA_MR_MAX_INC_SIZE:RDMA により登録される MR の最大サイズ。NACC_SOR_CONN_PER_QP:キューペア (QP) あたりの接続数。NACC_SOR_IO_THREADS:NetACC スレッド数。
次の例は、設定ファイルのサンプルを示します:
NetACC の使用
アプリケーションで NetACC を使用するには、netacc_run コマンドを実行するか、LD_PRELOAD 環境変数を設定します。続行する前に、注意事項のセクションをお読みください。
netacc_run コマンドの実行
netacc_run は、アプリケーション起動時に NetACC を読み込みます。アプリケーションコマンドの前に netacc_run を付けて実行し、NetACC を有効にした状態でアプリケーションを起動します。
netacc_run は、-t (I/O スレッド) や -p (QP あたりの接続数) などのパラメータを受け付けます。netacc_run コマンド実行時に指定したパラメータは、設定ファイルの内容を上書きします。
例:
次の例では Redis を使用します。Redis コマンドの前に
netacc_runを付けて実行すると、NetACC が有効になった状態で Redis が起動します。NetACC を有効にして Redis を起動する:
netacc_run redis-serverNetACC を有効にして redis-benchmark を起動する:
netacc_run redis-benchmark
LD_PRELOAD 環境変数の設定
LD_PRELOAD 環境変数は、プログラム起動時に事前ロードする共有ライブラリを指定します。自動的に読み込むには、LD_PRELOAD 変数に NetACC ライブラリを設定します。
NetACC 動的ライブラリの場所を確認します:
ldconfig -p | grep netacc出力例:

LD_PRELOAD環境変数に NetACC 共有ライブラリを設定します:LD_PRELOAD=/lib64/libnetacc-preload.so your_applicationyour_applicationを対象アプリケーションに置き換えます。例 (Redis):
NetACC を有効にして Redis を起動する:
LD_PRELOAD=/lib64/libnetacc-preload.so redis-serverNetACC を有効にして redis-benchmark を起動する:
LD_PRELOAD=/lib64/libnetacc-preload.so redis-benchmark
NetACC のモニタリング
netacc_ss は NetACC のモニタリングツールです。netacc_ss コマンドを実行して、NetACC により高速化された TCP プロセスのデータ転送状況を確認します。サーバーとクライアントの両方で実行できます。
NetACC により高速化された TCP プロセスのデータ転送状況を確認します:
netacc_ss -s all -p <Process ID>プロセス ID を確認するには、ps -ef | grep <Process name> を実行します。
注意事項
eRDMA インターフェイス (ERI) 機能が有効な ENI を介して確立された TCP 接続のみが RDMA 接続に変換されます。その他の接続は TCP のままです。
説明通信の両端のいずれにも ERI が有効な ENI がない場合、NetACC は TCP にフォールバックします。
RDMA ソケットファイル記述子は、カーネル IPC を介して他のプロセスに送信できません。
説明RDMA 接続は、プロセス間で共有できない特定の QP にバインドされます。
NetACC は IPv6 をサポートしていません。競合を防ぐため、
sysctl net.ipv6.conf.all.disable_ipv6=1を実行して IPv6 を無効にしてください。NetACC はホットアップデートをサポートしていません。NetACC を更新する前に、NetACC により高速化されたすべてのプロセスを停止してください。
NetACC は、SO_REUSEPORT、SO_ZEROCOPY、TCP_INQ などの一部の TCP ソケットオプションをサポートしていません。
NetACC は glibc に依存しており、Golang などの非 glibc 環境では実行できません。
NetACC を使用する前に、
ulimit -l unlimitedを実行して、ロック可能なメモリの最大値を無制限に設定してください。説明ulimit -l の値が小さすぎる場合、RDMA は上限を超える MR を登録できず、失敗する可能性があります。
NetACC により高速化されたアプリケーションが TCP ポートでリッスンする場合、NetACC は RDMA データ転送用に RDMA ポート (TCP ポート + 20000) でもリッスンします。
説明RDMA ポートが使用中である場合、または有効な範囲外である場合、接続は失敗します。競合を回避できるよう、ポートを適切に割り当ててください。
fork()呼び出し後に親プロセスが確立したソケット接続は、子プロセスに引き継がれません。説明子プロセスは新しいソケット接続を確立する必要があります。
QP の再利用はデフォルトで無効です。
QP の再利用を有効にするには、NetACC 設定ファイルの
NACC_SOR_CONN_PER_QPパラメータ、またはnetacc_runコマンドの QP あたりの接続数 (-p) を 1 より大きい値に設定します。QP の再利用により、QP 数、管理オーバーヘッド、リソース消費が削減され、高並列シナリオにおける通信効率が向上します。
QP の再利用を有効にすると、複数の RDMA 接続がローカルポート番号を共有する場合があります。これは、ポート番号が個々の接続ではなく QP を識別するためです。
説明アプリケーションで異なるローカルポート番号 (例:異なるサービス) が必要な場合は、ポート競合を回避するために QP の再利用を無効にしてください。
Redis アプリケーションでの NetACC の使用
Redis アプリケーションにおける NetACC のメリット
システムスループットの向上
NetACC は、PPS が高い Redis ワークロードにおいて CPU オーバーヘッドを削減し、スループットを向上させます。
ネットワーク応答の高速化
NetACC は eRDMA の低レイテンシーを活用し、Redis のネットワーク応答を高速化します。
Redis パフォーマンスベンチマークでの NetACC の使用
redis-benchmark は、同時クライアントリクエストをシミュレートしてサーバーパフォーマンスを測定する Redis の組み込みユーティリティです。
テストシナリオ
NetACC を redis-benchmark と併用し、4 スレッドで 100 クライアントをシミュレートして 500 万件の SET リクエストを送信します。
前提条件
2 台の eRDMA 対応 ECS インスタンスを作成します。[Auto-install eRDMA Driver and eRDMA Interface] を選択して、プライマリ ENI で ERI を有効にします。1 台を Redis サーバー、もう 1 台をクライアントとして使用します。
インスタンス構成:
イメージ: Alibaba Cloud Linux 3
インスタンスタイプ: ecs.g8ae.4xlarge
プライマリ ENI のプライベート IP アドレス: 172.17.0.90 (サーバー) および 172.17.0.91 (クライアント)。ベンチマークでは実際の値に置き換えてください。
説明このベンチマークでは、プライマリ ENI で ERI を有効にします。172.17.0.90 は Redis サーバーインスタンスのプライマリ ENI のプライベート IP アドレスです。
セカンダリ ENI で ERI が有効になっている場合は、代わりにプライベート IP アドレスを使用します。「eRDMA の使用」トピックのeRDMA の有効化をご参照ください。
操作手順
両方の ECS インスタンス (Redis サーバーとクライアント) に接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスにログオンする」をご参照ください。
eRDMA ドライバーがインストールされていることを確認します。
インスタンス起動後、
ibv_devinfoを実行して eRDMA ドライバーのステータスを確認します。次の出力は、ドライバーがインストールされていることを示します。

次の出力は、ドライバーがインストール中であることを示します。数分待ってから再試行してください。

両方のインスタンスに Redis をインストールします:
sudo yum install -y redis次の出力は、Redis がインストールされていることを示します。

redis-benchmarkを使用して Redis パフォーマンスをベンチマークします。NetACC を使用してベンチマークを実行する
Redis サーバーインスタンスで、NetACC を有効にして Redis を起動します:
netacc_run redis-server --port 6379 --protected-mode no説明6379 を実際のポートに置き換えます。詳細については、「redis-server コマンドの共通パラメーター」をご参照ください。
この例では
netacc_runを使用します。他の方法については、「NetACC を使用する」をご参照ください。
次の出力は、Redis が正常に起動したことを示します。

Redis クライアントインスタンスで、NetACC を有効にして redis-benchmark を起動します:
netacc_run redis-benchmark -h 172.17.0.90 -p 6379 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t set説明172.17.0.90 を Redis サーバー IP に、6379 を実際のポートに置き換えてください。「redis-benchmark で使用される共通のコマンドパラメーター」をご参照ください。
ベンチマーク結果はネットワーク状況により変動する場合があります。本トピックのデータは参考値です。
サマリーには、約 770,000 リクエスト/秒と表示されています。メトリックの詳細については、「redis-benchmark ベンチマーク結果の一般的なメトリック」をご参照ください。
NetACC を使用せずにベンチマークを実行する
Redis サーバーインスタンスで Redis を起動します:
redis-server --port 6379 --protected-mode no --save ""説明6379 を実際のポートに置き換えてください。詳細については、「redis-server コマンドと併用される共通パラメーター」をご参照ください。
次の出力は、Redis が正常に起動したことを示します。

Redis クライアントインスタンスで redis-benchmark を起動します:
redis-benchmark -h 172.17.0.90 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t set説明172.17.0.90 を Redis サーバー IP に、6379 を実際のポートに置き換えます。詳細については、「redis-benchmark で使用される共通のコマンドパラメーター」をご参照ください。
ベンチマーク結果はネットワーク状況により変動する場合があります。本トピックのデータは参考値です。
サマリーには、約 330,000 リクエスト/秒と表示されます。 メトリックの詳細については、「redis-benchmark ベンチマーク結果の一般的なメトリック」をご参照ください。



