仮想化でプリセールスしてるSEの一日

VMware から Azure まで、インフラや仮想化の最新情報をベンダー色をできるだけ抑えて綴っていきます

Software-Defind xx と対応ハードウェア - 仮想スイッチの負荷

f:id:ogawad:20190203195708p:plain:right

「仮想スイッチの負荷」編: (1)
「VXLAN オーバーヘッド」編: (1) (2)


最近、「software-defined something.. (SDx)」というお題で、講演の機会をよくいただくのですが、SDx の正確な定義って何でしょう。。。
もう 9 年くらい経つ「サーバー仮想化」も software-defined Compute のような気がしますし、ストレージについてはユニファイド系の多くが Xeon プロセッサを積んだ x86 サーバーで動いているわけで、言ってしまえばそれも software-defined Storage なのではないかな、と思ったり。。。


さすがに最近は「software-defined になるとハードウェアは何でも良い」と言う人は減っていますが、ネタに困っていることもあり、SDx を意識したハードウェアや設計ネタについて数回紹介したいと思います(なるべくニュートラルに)。


物理スイッチと仮想スイッチ

最近のネットワークスイッチは、Broadcom Trident などのスイッチプロセッサと Linux/BSD ベースの OS(ファームウェア)で作られています。
しかも、x86 プロセッサにおける Intel Xeon のように、スイッチ用プロセッサは Broadcom Trident が寡占的です。このため、下図のようなスイッチのハードウェア部分は基本的に共通であり、各社は OS で独自性を出しています*1



つまり、Hyper-VVMware といったハイパーバイザーに含まれる「仮想スイッチ」はもちろん、「物理スイッチ」も一種の "software-defined" なわけですが、同じ SDx である物理スイッチと仮想スイッチだと、効率が良いのは前者です。

理由は単純。スイッチプロセッサには、スイッチング処理の命令セットがたくさん用意されており、多くのスイッチングをハードウェア処理できるためです。
ソフトウェアプログラムの場合であれば数十〜数百コードになるスイッチ処理が、特殊な命令セットを持つ専用プロセッサによって一瞬で処理できます
(できるだけソフトウェア処理させないよう、ASIC を更に搭載したものもあります)


仮想スイッチの処理で CPU が振り切る!?

これに対し、仮想スイッチはスイッチ処理のほぼすべてを CPU で処理します。
CPU には仮想スイッチの処理を高速化する命令セットはありませんし、特別な ASIC も搭載されていません。

ここで、昨今流行りの 10Gbps NIC*2 を考えてみましょう。10G や 20G のトラフィックを仮想スイッチに流した場合、その処理で CPU がどれくらい奪われてしまうか想像できますでしょうか?


次のスライドは若干古いですが、ネットから入手できる資料の抜粋です。




13:00 更新)ハイパーバイザーやデバイスドライバの出来によって負荷は異なります。
また、後者の富士通さんのグラフは元々 VMQ の効果測定の結果です。VMQ を有効にして処理コアを増やした途端、そのコアの使用率が 0 → 80% に跳ね上がったところに着目いただければと思います。
こちらのベンチマークもおすすめです: http://it.anandtech.com/show/2956/10gbit-ethernet-killing-another-bottleneck-


帯域やスピードばかり気にしがちになりますが、同じ 1 秒間において、
10Gbps は 1Gbps の 10 倍の仕事をこなしている ことを思い出してください。


どうやって設計する?

NFV などは特にですが、この問題を回避したいのであれば
「仮想スイッチにはできる限りスイッチング処理させない」ことです。
CPU が振り切っているので、基本的にはハードウェアによる対応になります。

  • 仮想スイッチへ流れるトラフィックを減らす技術を用いる
    • NIC Partitioning
    • SR-IOV、VEB、VEPA
  • 仮想スイッチの処理を肩代わりする技術を用いる
    • Virtual RSS、VMQ(これは個人的にお勧めしません)
  • 設計でカバー
    • 仮想スイッチに tagged VLAN は流さない
    • 仮想スイッチで QoS は行わない
  • 力技


この辺りはまだ「software-defined に対する現実問題」なのかなと思います。
もちろん、仮想スイッチの方が柔軟でプログラマブルです。
各社の仮想スイッチの仕様がある程度統一化されて、x86 プロセッサに仮想スイッチ関連の命令セットが搭載される日を心待ちにしています。。。


次回 は、最近話題の VXLAN の CPU 負荷について触れてみようと思います。

*1:Trident チップを複数載せたり、処理を高速化するために ASIC を追加するものもあります

*2:LAG を用いる場合は 20Gbps