[論文] [ビデオ]
UDPDK は、サーバー間の高速ポイントツーポイント通信のためのDPDKに基づく最小限のUDPスタックです。
完全にユーザー空間で実行されるため、面倒なカーネル スタックを経由せずにパケットをすばやく移動できます。
さらに、POSIX に似た API のおかげで、既存のアプリケーションを UDPDK に移植するのは非常に簡単です。 1
UDPDK とは:
UDPDK ではないもの:
1一部の機能はまだサポートされていない可能性があります。
UDPDK を使用するには、マシンに DPDK 対応の NIC が装備されている必要があります。これらは通常、ラップトップやデスクトップ マシンではなく、サーバーにあります。 DPDK が正式にサポートするハードウェアのリストは、ここから入手できます。具体的には、UDDPK は、 igb_uioおよびvfioドライバーを使用してIntel X710-DA2上で開発およびテストされています。他のデバイスは、DPDK がサポートしている限り動作するはずです。
UDPDK には次のものが必要です。
これらはすでにこのリポジトリにサブモジュールとして含まれているため、プルします。
git submodule init
git submodule update
DPDK
DPDK は UDPDK の重要な要素です。 NIC を管理し、イーサネットを実装します。
cd dpdk/usertools
./dpdk-setup.sh
メニューから次の操作を行います。
x86_64-native-linuxapp-gcc
vfio
モジュールをロードする
️ VFIO ドライバーを使用する場合は、システムで IOMMU を有効にする必要があります。
これを有効にするには、/etc/default/grub
を開き、GRUB_CMDLINE_LINUX_DEFAULT
にフラグintel_iommu=on
を追加してから、sudo update-grub
実行して、最後に再起動します。
イニ
inih は、 .ini
設定ファイルを解析するために便宜的に使用されます。
cd inih
meson build
cd build
ninja
UDPDK は静的ライブラリに組み込まれており、最終的には最終アプリケーションとリンクする必要があります。
cd udpdk
make
sudo make install
UDPDK の API は、古き良き BSD ソケットの API によく似ています。
int udpdk_socket(int domain, int type, int protocol);
int udpdk_bind(int s, const struct sockaddr *addr, socklen_t addrlen);
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t *optlen);
ssize_t udpdk_sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t udpdk_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
int udpdk_close(int s);
さらに、DPDK の内部 (構造とプロセス) を適切にセットアップおよび破棄するには、次の方法が必要です。
int udpdk_init(int argc, char *argv[]);
void udpdk_interrupt(int signum);
void udpdk_cleanup(void);
注: select() はまだ実装されていません
apps/
フォルダーには、ping-pong アプリケーションと pkt-gen アプリケーションという 2 つの単純な例が含まれています。
UDPDK は 2 つの別々のプロセスで実行されます。プライマリはアプリケーション ロジック (つまり、syscall が呼び出されるプロセス) を含むプロセスであり、セカンダリ (ポーラー) は継続的に NIC をポーリングしてデータを送受信します。パケットは、ロックのないリング キューを使用して、共有メモリを介してアプリケーションとポーラーの間で交換されます。
スループットと遅延の観点から UDPDK を標準の UDP ソケットと比較します。
環境
2 台の同一のサーバーが 10G インターフェイス上でポイントツーポイント接続されています。彼らの仕様は次のとおりです。
CPU:インテル Xeon E5-2640 @2.4GHz
RAM: 64GB
OS: Ubuntu 18.04
カーネル: 4.15.0
NIC:インテル X710 DA2 10GbE
NIC ドライバー: VFIO (DPDK) または i40e (通常のソケット)
スループット
パケット サイズを変化させて達成される最大スループットを測定します。
後者には、UDP、IP、および MAC ヘッダーが含まれます。
図に示すように、UDDPK は従来のソケットよりも最大18 倍優れています。
UDPDK は 10G 接続を飽和させることに注意してください。残念ながら、私たちが持っていたのはこれだけでした。40G インターフェースがあれば間違いなく輝きます。
レイテンシ
レイテンシーとそのジッターを測定します。
繰り返しますが、UDDPK は標準ソケットよりも一桁優れていることがわかります。
UDPDK | 標準 | |
---|---|---|
平均値 (μs) | 13.92 | 116.57 |
標準 (μs) | 0.74 | 18.49 |
UDPDK のコードは、BSD 3-Clause ライセンスに基づいてリリースされています。
この成果は、ネットワーク機能の仮想化とソフトウェア定義ネットワーキングに関する第 7 回 IEEE 会議である IEEE NFV-SDN 2021 で発表されました。著者は、L. ライ、G. アラ、T. クチノッタ、K. コンデプ、L. ヴァルカレンギです。
ライ、レオナルド 他「DPDK を使用した超低遅延 NFV サービス」 2021 IEEE Conference on Network Function Virtualization and Software Defined Networks (NFV-SDN)。 IEEE、2021 年。
新しい機能を実装したり、既存の機能を拡張したり、単にバグや問題を報告したりすることで、UDDPK に貢献することは誰でも大歓迎です。