技術の普及で手軽にできるようになったNFVの基盤構築

辻広志氏:「OVS-DPDKとOpenStackで作るおうちNFV環境の構築」を発表します。よろしくお願いします。

自己紹介です。オレンジ色の会社で、NFV関係のアーキテクトをやっています。私はプログラマーではないので、今日はちょっとレイヤーが高い話かもしれませんが、ご了承ください。

本日のモチベーションですが、ネットワークの仮想化、高速化のノウハウを広めたいなと思ったのが1つです。前回のイベントで仮想マシンのルーターの話があって、みなさんのウケがけっこうよかったように見えたので、私もしゃべってみようと思いました。あとは「Twitter」を見ていると、自宅ラックの人はけっこう「VMware」を選択しているので、「OSSもいいよ」というのを伝えたいなと思ったのが2つ目のモチベーションです。

NFV(Network Functions Virtualization)とは、通信事業者のアプリケーションをOpenStackとかVMwareとかKubernetesで動かすことを言います。「通信事業者のアプリケーション」と書いているものは、いわゆる普通のサーバーや普通のネットワーク機器とはちょっと違うものです。NFVの前提が非常に難しくて、トランスポートはけっこうUDP(User Datagram Protocol)を扱っていて、パケットは落ちない前提です。こういうちょっと特殊な事情があります。

NFVの基本戦略ですが、「仮想化の心を捨てる」という、ハードウェアオフロードが1つです。もう1つは「CPUで殴る」で、DPDK(Data Plane Development Kit)に代表されるようなマシンパワーで何とかするというものです。

DPDKも軽く説明します。DPDKのそもそもの思想は、最近のCPUはたくさんコアがあるので、特殊なハードウェアを買うよりもいくつかのCPUコアを特殊な用途のために使ったほうが柔軟性が高いし、安いんじゃないかというものです。

DPDKがない場合、カーネルにネットワークを含むI/Oは、アプリケーションが依頼して、カーネルを通して行いますが、DPDKはデバイスドライバーの部分も含めたアプリケーションレイヤーを持ってきます。ネットワーク以外のI/Oはカーネル経由で行いますが、ネットワークI/Oはユーザースペースでやります。

また、CPUを特定のNICなどに固定して使うので、CPUはそのパケットのフォワーディングや編集を専門に行います。topコマンドで見ると、常に100パーセントで動いていて、アクセル全開という感じです。

最近このあたりの技術が普及してきたと個人的に考えています。OpenStackもけっこう古いソフトウェアですが、CPUをアサインするのが柔軟になってきました。OVS-DPDKも特に最近のものではないんですが、ずっと昔から安定してDPDKの実装版が出ているので、使い勝手がいいし、ドキュメントもけっこうあります。あとはDPDK対応のNICが増えているなという気がします。

また、メニーコアなCPUは一般家庭にも普及していると思っているので、作り方を紹介して、最後に軽く性能測定の結果を共有したいなと思っています。

一般家庭で用意できるものでNFV環境を作成する

どうやって作っていくのかというところですが、ここに書いているとおり、一般の家庭でも用意できるもので、今回考えてみました。私もVRのゲームがしたくて、ゲーミングPCを作ったんですが、「AMD Ryzen 5 3600」は12スレッドぐらいあるので、ちょっと買いすぎかもしれません。(NICは)「Intel X710」の10Gbpsのものを買ってきてブスッと刺して用意しました。

NICですが、IntelのNICを使えばある程度は間違いないと思います。今回はX700シリーズを買っていますが、もっと安価で入手性が良いものもあるので、そういったものを選択するのもいいと思いますし、Intel以外もサポートが増えてきているのでそれでもいいです。ただ、けっこういろいろなパソコンに入っているカニさん(※Realtek製NICのこと)は、DPDKに対応していないので、使えません。

CPUのバランスは自分の好みでカスタマイズする

次にプランニングしていきます。ハイパーバイザーとなるサーバーのCPU構成や、PCIデバイスの構成をちょっと見ておきます。

実際にこのあたりが肝になっていて、NFVっぽいポイントなんですが、CPUの割り当てをけっこう頭を使って考えます。ハイパースレッディングを使っている場合、キャッシュがこのコアとこのコアは一緒だよねとかも気にします。ハイパーバイザーが自分の仕事をする用のCPUプール、OVS-DPDKやvSwitchが使う用のCPUプール、ゲスト用のvCPUのプールと、大きく3つぐらいに分けます。

最近のOpenStackは、NFVだと性能を担保するためにゲスト用のvCPUをCPUピニングします。昔はCPUピニングをしたら、全部CPUピニングで使わないといけなかったんですが、最近はCPUピニングをしないものも一緒に載せられるようになってきたので、このあたりが最近は柔軟になってきたかなと思っています。

今回はこういう分け方をしていますが、ワークロードなどは自分の好きなようにカスタマイズしていいと思っています。

設計をもとにOVS-DPDKとOpenStackに反映する

Ubuntu 20.04などを入れて、IOMMUとHugePageの設定だけをして、あとはドキュメンテーションに従ってOVS-DPDKとOpenStackをデプロイしていきます。ドキュメントに従ってと言いましたが、それなりに苦労はするかもしれません。

CPUの割り当てを計画したものを実際に設定に反映します。青文字や黄文字で書いているのが先ほどの囲っていた部分になるんですが、調整した結果をここに反映していきます。

最後です。VMに対しても最近いろいろとできるようになってきました。今回はQEMU/KVMの環境を想定しているんですが、CPUピニングなどやるときは一番下のエミュレータスレッドが曲者でした。今までは無指定で何もしなかったら、VMにCPUピニングしたコアに、エミュレーター用の仕事も割り振られちゃうので、例えばここでCPUをフル回転で使いたいときに、エミュレーターが邪魔になるのが問題になりました。

それを解決するisolateというモードもあるのですが、isolateしちゃうとエミュレーターがそんなにたくさん仕事をするわけではないのに、専属のコアが一つひとつ必要でした。それがshareというかたちで1つのコアにまとめられるようになっていたので、紹介です。

あとはOpenStackのコマンドを叩いてネットワークを作って、イメージを登録して、サーバーをcreateしたらNFVっぽい環境にVMが立ち上がります。

性能測定の結果 iperfの21倍の早さ

実際に家の環境で検証してみました。ゲストVMに4GBぐらいの小さなVMを立てて検証しています。SR-IOV(Single Root I/O Virtualization)など、紹介していないものが途中登場するんですがご了承ください。

赤色の線で示しているところは、必ずパケットが通るところで確認をしています。VLANを切って、さっきの赤いところを通ってVLANで通信をするところです。訳あってホストマシンと通信していますけど、10GbpsぐらいはTCP(Transmission Control Protocol)で測って取れています。

ただUDPにするとパケットロスしまくります。実際に通るのが330kbpsで、170Mbpsぐらいしか出ません。これは「やっぱりNFVダメじゃん」とか「仮想化遅いじゃん」という感じではなくて、iperfを使っているからこうなるという話です。

結局Linuxの限界がゲスト側に来ただけなので、ゲスト側もDPDKを使います。PtgenというDPDKのパケットジェネレーターがあるので、それを使って測定してみました。方向があってちょっとややこしいんですが、Open vSwitch(OVS-DPDK)を使ったものからSR-IOVのポートまでパケットをフォワードすると、だいたい7Mbpsぐらいです。64Byteのフレームで3.6Gbpsぐらい出ます。

逆向きにすると、SR-IOVは64Byteでも10Gbpsぐらい出ていて、パケットロスして7Mbpsぐらいになっています。とはいえ、iperfでやるよりも21倍ぐらい速いです。

パケットロスについて、レートを落として確認をしたんですが、今回のパケットロスの原因までは至りませんでした。

最後にまとめです。一般の家庭で使っているハードウェアでもネットワークの仮想化はけっこうできるよという紹介でした。ちょっと設定するだけで7Mbpsくらい。パケットロス0には至りませんでしたが、できます。やっぱり調査は難しかったので、このあたりはまたネタにしたいなと思います。

ハイパーバイザーは作れたんですが、実はそれに載せる仮想ルーターがあまりないので、今後の課題です。以上です。ありがとうございました。