Network Accelerator (NetACC) は、低レイテンシや高スループットなどの柔軟なリモートダイレクトメモリアクセス (eRDMA) の利点を活用し、互換性のあるソケットインターフェイスを使用して既存のTCPアプリケーションを高速化するユーザーモードネットワーク高速化ライブラリです。 高い通信パフォーマンス、低レイテンシ、高スループットを必要とするTCPアプリケーションでは、NetACCを使用してeRDMAを適応させ、アプリケーションコードを変更することなくアプリケーションのネットワーク通信を高速化できます。
NetACCはパブリックプレビュー中です。
シナリオ
NetACCは、ネットワークオーバーヘッドの多いシナリオに適しています。
パケット /秒 (PPS) レートが高いシナリオ、特に、多数の小さなパケットが送受信されるシナリオ。 NetACCを使用すると、Redisがリクエストを処理する場合など、特定のシナリオでCPUオーバーヘッドを削減し、システムスループットを向上させることができます。
ネットワークレイテンシに敏感なシナリオ: ネットワーク応答を高速化するために、eRDMAはTCPよりも低いネットワークレイテンシを提供します。
短寿命接続の繰り返し作成: セカンダリ接続を確立するプロセスを高速化して、接続作成時間を短縮し、システムパフォーマンスを向上させることができます。
NetACCのインストール
インストール方法
eRDMAドライバーを使用してNetACCをインストール
eRDMAドライバをインストールすると、NetACCが自動的にインストールされます。 eRDMAドライバーのインストール方法については、「eRDMAの使用」トピックの「ECSインスタンスへのeRDMAドライバーのインストール」をご参照ください。
NetACCの個別インストール
次のコマンドを実行して、特定のバージョンのNetACCを個別にインストールするか、Elastic Compute Service (ECS) インスタンスでNetACCを一時的に使用します。
sudo curl -fsSL https://netacc-release.oss-cn-hangzhou.aliyuncs.com/release/netacc_download_install.sh | sudo sh
設定ファイルと最適化されたパラメーター
NetACCをインストールすると、
/etc/netacc.conf設定ファイルが自動的に生成されます。 NetACCのパフォーマンスを最適化するには、NACC_SOR_MSG_SIZE、NACC_RDMA_MR_MIN_INC_SIZE、NACC_RDMA_MR_MAX_INC_SIZE、NACC_SOR_CONNPER_QP、NACC_SOR_THREADSなどの特定のパラメーターを設定します。 NACC_SOR_MSG_SIZEは、バッファのサイズを指定する。 NACC_RDMA_MR_MIN_INC_SIZEは、RDMAによって登録される第1のメモリ領域 (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を使用する前に、このトピックの考慮事項のセクションに精通している必要があります。
netacc_Runコマンドを実行します。
netacc_runは、アプリケーションの起動時にnetaccを読み込むツールです。 <COMMAND> コマンドの前にnetacc_runを追加して、アプリケーションを起動し、同時にNetACCをロードできます。 <COMMAND> は、アプリケーションを起動するためのコマンドを指定します。
netacc_runは、netaccのパフォーマンスを向上させるための複数のパラメーターを提供します。 たとえば、-tはI/Oスレッドの数を指定し、-pはQPあたりの接続数を指定します。 netacc_runコマンドを実行したときに設定するパラメーターは、設定ファイルのパラメーターを上書きします。
例:
次の例では、Redisアプリケーションが使用されています。 Redisコマンドの前に
netacc_runを追加して、Redisアプリケーションを起動し、同時にNetACCをロードします。次のコマンドを実行してRedisを起動し、NetACCを同時にロードします。
netacc_run redis-server次のコマンドを実行してredis-benchmarkユーティリティを起動し、同時にNetACCをロードします。
netacc_run redis-benchmark
LD_PRELOAD環境変数の設定
LD_PRELOAD環境変数は、プログラムの起動時にプリロードされる共有ライブラリを指定します。 NetACCの読み込みを自動化するには、関連するスクリプトのLD_PRELOAD環境変数の値にNetACCを指定します。
次のコマンドを実行して、NetACCダイナミックライブラリの場所を照会します。
ldconfig -p | grep netacc次のコマンド出力が返されます。

次のコマンドを実行して、
LD_PRELOAD環境変数を設定し、プリロードされた共有ライブラリを指定します。LD_PRELOAD=/lib64/libnetacc-preload.so your_application_applicationを高速化するアプリケーションに置き換えます。例: 次の例では、Redisアプリケーションが使用されています。
次のコマンドを実行してRedisを起動し、NetACCを同時にロードします。
LD_PRELOAD=/lib64/libnetacc-preload.so redis-server次のコマンドを実行してredis-benchmarkユーティリティを起動し、同時にNetACCをロードします。
LD_PRELOAD=/lib64/libnetacc-preload.so redis-benchmark
NetACCの監視
netacc_ssはnetaccのモニタリングツールです。 netacc_ssコマンドを実行し、NetACC-accelerated TCPアプリケーションのプロセスが送受信するデータのステータスを監視します。 NetACCを監視するには、サーバーとクライアントでコマンドを実行します。
次のコマンドを実行して、NetACC-accelerated TCPアプリケーションのプロセスによって送受信されたデータのステータスを照会します。
netacc_ss -s all -p <Process ID>プロセスのIDを照会するには、ps -ef | grep <プロセス名> コマンドを実行します。
考慮事項
NetACCを使用する場合、eRDMAインターフェイス (ERI) 機能が有効になっているelastic network Interface (ENI) を使用して確立されたTCP接続のみがRDMA接続に変換されることに注意してください。 他の接続はTCP接続のままである。
説明両方のネットワーク通信端がERI対応ENIをサポートしていない場合、NetACCはRDMA接続を確立できず、TCPにフォールバックします。
NetACCを使用するときに複数のプロセスが相互に通信する場合、カーネルのプロセス間通信 (IPC) メカニズムを使用してRDMAソケットファイル記述子を他のプロセスに送信することはできません。
説明RDMA接続は、特定のQPに基づいて確立される。 QPは、プロセス間で直接共有することはできない。 その結果、RDMA接続をプロセス間で共有することはできない。
NetACCフレームワークはIPv6をサポートしていません。 NetACCを使用するときにIPv6-relatedの競合やエラーを防ぐには、
sysctl net.ipv6.conf.all.disable_ipv6=1コマンドを実行してIPv6を無効にすることを推奨します。NetACCはホットアップデートをサポートしていません。 NetACCのホットアップデートは予期しないエラーを引き起こす可能性があります。 NetACCを更新する前に、NetACC-acceleratedアプリケーションのプロセスを停止する必要があります。
NetACCは、SO_REUSEPORT、SO_ZEROCOPY、TCP_INQなどの特定のTCPソケットオプションをサポートしていません。
NetACCはGNU Cライブラリ (glibc) に依存しており、Golang環境などの非glibc環境では実行できません。
NetACCを使用する前に、
ulimit -l unlimitedコマンドを実行して、プロセスがロックできる物理メモリの最大量を無制限に設定することを推奨します。説明ulimit-1パラメータの値が過度に小さい場合、MRのサイズがロック可能なメモリの許容最大量を超えるため、RDMAはMRを登録できない可能性があります。
NetACC高速化アプリケーションが通信のためにTCPポートでリッスンする場合、NetACCはRDMAネットワーク環境で効率的なデータ転送を実現するためにRDMAポート (TCPポートと20000) でもリッスンします。
説明RDMAポートが占有されているか、または有効なポート範囲外にある場合、接続を確立できません。 ポートの競合を防ぐためにポートを適切に割り当てます。
NetACCでは、親プロセスが
fork()システムコールを使用して子プロセスを作成した後、子プロセスは親プロセスによってすでに確立されているソケット接続を継承しません。説明これは、通信障害を引き起こす可能性がある。 この場合、子プロセスは新しいソケット接続を確立する必要があります。
デフォルトでは、NetACCでQP再利用機能が無効になっています。
NetACC設定ファイルで
NACC_SOR_CONN_PER_QPパラメーターを設定するか、netacc_runコマンドを実行してQP再利用機能を有効にし、複数の接続でQPを再利用できるようにすることで、QPあたりの接続数 (-p) を1より大きい値に設定できます。QP再利用機能が有効にされると、特に多数の同時接続が存在するシナリオにおいて、QPの数、管理オーバーヘッド、およびリソース消費が低減されて、全体的な通信効率が改善される。
QP再利用機能を有効にすると、複数のRDMA接続がローカルポート番号を共有する場合があります。 RDMAでは、ポート番号はQPを識別するが、接続は識別しない。 複数の接続がQPを共有する場合、接続はローカルポート番号も共有する。
説明異なるサービスを提供したり、異なるポートでリッスンしたりするなど、アプリケーションが異なるローカルポート番号を必要とする場合は、QP再利用機能を無効にします。 QP再利用機能が有効になっている場合、ローカルポート番号に基づいて接続を区別することができず、ポート競合を引き起こす可能性があります。
RedisアプリケーションでNetACCを使用
NetACC for Redisアプリケーションのメリット
改善されたシステムスループット
NetACCは、Redisが1秒間に大量のリクエストを処理するシナリオに適しています。 NetACCはCPUオーバーヘッドを削減し、システムスループットを向上させます。
高速化されたネットワーク応答
NetACCは、eRDMAの低遅延の利点を活用して、Redisアプリケーションへのネットワーク応答を大幅に高速化します。
Redisパフォーマンスベンチマークで使用されるNetACC
Redis-benchmarkは、Redisの組み込みベンチマークユーティリティです。これは、多数のクライアントをシミュレートしてRedisサーバーにリクエストを同時に送信することにより、さまざまなワークロードでのRedisサーバーのパフォーマンスを測定するように設計されています。
テストシナリオ
redis-benchmarkのユーティリティでNetACCを使用して、100のクライアントと4つのスレッドをシミュレートし、5百万のSETリクエストを行います。
準備
ECSコンソールのインスタンス購入ページに2つのeRDMA対応ECSインスタンスを作成します。 eRDMAドライバの自動インストールを選択し、eRDMAインターフェイスを選択して、プライマリENIのERI機能を有効にします。 1つのECSインスタンスをRedisサーバーとして使用し、もう1つのECSインスタンスをRedisクライアントとして使用します。
ECSインスタンスには次の設定があります。
イメージ: Alibaba Cloud Linux 3
インスタンスタイプ: ecs.g8ae.4xlarge
プライマリENIのプライベートIPアドレス: サーバーの場合は172.17.0.90、クライアントの場合は172.17.0.91次のベンチマークで、ビジネス要件に基づいてIPアドレスを実際の値に置き換えます。
説明このトピックでは、ECSインスタンスのプライマリENIがベンチマークを実行するためにERI機能が有効になっています。 172.17.0.90は、Redisサーバーとして機能するECSインスタンスのプライマリENIのプライベートIPアドレスです。
ECSインスタンスのセカンダリENIのERI機能を有効にする場合は、上記のIPアドレスをセカンダリENIのプライベートIPアドレスに置き換えます。 詳細については、「eRDMAの使用」トピックの「ECSインスタンスへのERIのバインド」セクションをご参照ください。
手順
Redisサーバーとして機能するECSインスタンスとRedisクライアントとして機能するECSインスタンスに接続します。
詳細については、「ワークベンチを使用したSSH経由のLinuxインスタンスへのログイン」をご参照ください。
ECSインスタンスにeRDMAドライバーがインストールされているかどうかを確認します。
ECSインスタンスの起動後、
ibv_devinfoコマンドを実行して、eRDMAドライバーがインストールされているかどうかを確認します。次のコマンド出力は、eRDMAドライバがインストールされていることを示します。

次のコマンド出力は、eRDMAドライバがインストールされていることを示します。 eRDMAドライバがインストールされるまで数分待ってから、後でもう一度お試しください。

ECSインスタンスで次のコマンドを実行し、Redisをインストールします。
sudo yum install -y redis次のコマンド出力は、Redisがインストールされていることを示します。

redis-benchmarkユーティリティを使用して、Redisのパフォーマンスをベンチマークします。NetACCを使用したベンチマークの実行
Redisサーバーとして機能するECSインスタンスで次のコマンドを実行し、NetACCを使用してRedisを起動し、Redisを高速化します。
netacc_run redis-server --port 6379 --protected-mode no説明6379を、Redisを起動する実際のポートの番号に置き換えます。 詳細については、このトピックの「redis-serverコマンドとともに使用される共通パラメーター」をご参照ください。
この例では、netaccを使用するために
netacc_runコマンドを実行します。 NetACCを使用する他の方法については、このトピックのNetACCの使用セクションを参照してください。
次のコマンド出力は、Redisが期待どおりに起動されることを示します。

Redisクライアントとして機能するECSインスタンスで次のコマンドを実行し、NetACCを使用してredis-benchmarkを開始し、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が起動されている実際のポートの番号に置き換えます。 詳細については、このトピックの「redis-benchmarkで使用される一般的なコマンドパラメーター」をご参照ください。
ベンチマーク結果は、ネットワーク条件に基づいて変化し得る。 このトピックで提供されるベンチマークデータは参考用です。
前のベンチマーク結果の最後にある [概要] セクションは、1秒あたり約770,000のリクエストを処理できることを示しています。 Redisベンチマーク結果のメトリクスの詳細については、このトピックの「redisの一般的なメトリクス-ベンチマークベンチマーク結果」をご参照ください。
NetACCなしでベンチマークを実行する
Redisサーバーとして機能するECSインスタンスで次のコマンドを実行し、Redisを起動します。
redis-server --port 6379 --protected-mode no --save説明6379を、Redisを起動する実際のポートの番号に置き換えます。 詳細については、このトピックの「redis-serverコマンドとともに使用される共通パラメーター」をご参照ください。
次のコマンド出力は、Redisが期待どおりに起動されることを示します。

Redisクライアントとして機能するECSインスタンスで次のコマンドを実行して、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が起動されている実際のポートの番号に置き換えます。 詳細については、このトピックの「redis-benchmarkで使用される一般的なコマンドパラメーター」をご参照ください。
ベンチマーク結果は、ネットワーク条件に基づいて変化し得る。 このトピックで提供されるベンチマークデータは参考用です。
前のベンチマーク結果の最後にある [概要] セクションは、1秒あたり約330,000のリクエストを処理できることを示しています。 Redisベンチマーク結果のメトリクスの詳細については、このトピックの「redisの一般的なメトリクス-ベンチマークベンチマーク結果」をご参照ください。


