前回の検討の続き。結局乗り換えた。 ファミリーシェアプラン(7GB)で, 音声SIM 1枚(MicroSIM)とデータ専用SIM 1枚(NanoSIM).

sim

転出・転入の手続き周りでかかった費用は以下の通り.

  • MNP転出側 (Softbank)
    • 解約手数料: 0円
      • 2年1ヶ月目ちょうどだったので
    • MNP転出手数料: 3000円
  • MNP転入側 (IIJmio)
    • 初期費用: 0円
      • 後述するASUSのキャンペーン
  • その他:
    • 端末購入費用: 28940円
      • ASUS ZenFone 5 A500KL-RD16
      • IIJmio音声通話パックと同時購入でパッケージ費用 3000円がタダになるキャンペーンやってた

月額費用はこんな感じになるはず (予定)

  • 合計: 3520円 (税込)
    • 月額費用: 2560円
      • ファミリーシェアプラン 7GB
    • 音声通話機能付帯料: 700円

“@t.vodafone.ne.jp”なメアドが消滅したので, 何人かとのリンクが消滅したことになる. 数年来連絡とってないひとばっかりなので問題にはならないでしょう, きっと.

今月がちょうど Softbank の2年縛りが切れる月なのでそろそろどうするか考えてみる. “@vodafone.ne.jp”なアドレスに執着が無ければ移るかも.

直近4ヶ月の Softbank 請求金額

1月(計算中) 12月 11月 10月
合計 8232 9214 9344 8847
基本使用料 934 934 934 934
パケット定額料等 5200 5200 5200 5200
通話料 400 340 460 0
オプションサービス料 1685 1250 1250 1250
その他 13 13 13 13
端末台(月月割引き後) 0 1018 1018 1018
消費税 - 459 469 432
通信料 - 2.55GB 5.08GB 3.23GB

オプションサービス料はこんな感じらしい。削ったつもりだったけど、まだいろいろついてんね。

2月 1月 10〜12月
合計 1750 1685 1250
S!ベーシックパック(i) 300 300 300
Wi-FIスポット(割引後) 0 0 0
あんしん保証パック(i) 475 475 475
テザリングオプション(割引後) 500 435 0
iphone基本パック 475 475 475

少なくとも以下のオプションは削れそう。950円のマイナス。

  • iPhone基本パック (475)
  • あんしん保証パック (475)

削ったとして結局のところ1月換算で行くなら, 8232 - 950 + 460 (消費税概算) = 7700ぐらい。 なお、MNP転出手数料は2000円。

みおふぉんに変えてみるプラン

とりあえず端末代は度外視するとして。

  • ファミリーシェアプラン 7GB : 2560円/月 (税抜)
  • SIMカード(一枚目): 音声通話機能付き 700円 (税抜)
  • SIMカード(二枚目): データ専用 0円(税抜き)

初期費用、通話料、ユニバーサルサービス料は含まれてない。音声通話は20円/o.5分(税抜き)とのこと。

  • 初期費用: 3000
    • ここに転出手数料 2000
  • 通話料: ソフトバンク側と同じく400円程度とする
  • ユニバーサルサービス料: 誤差なので含めない

これで合計金額を取ると, 月4000円ぐらい?

2014年のまとめ

  • 犬吠埼に初日の出観に行った。寒かった。
  • C85のデータをまとめて公開した: “続・ららら、(無線的に)素敵なComiket Space”
  • 部署名が一昨年のそれに戻った
  • 某文学系イベントでの無線LANネットワーク構築の準備・面倒見その他をした
  • 会社が神保町から飯田橋に引っ越した
  • ロードバイクかった。2013年に比べるとあんまり乗ってない。
  • 秋山郷ハッカソン行ってきた。成果はない。星空綺麗だった。
  • 夏のコミケで“キャプチャリング802.11”を出した
  • C86のデータをまとめて公開した: 続々・ららら、(無線的に)素敵なComiket Space C86
  • 某ゲーム系イベントで一部無線LAN周りの面倒見をした
  • 亀有から王子に引っ越した。githubで管理しようと思ってたけどうまくできなかった ( 残骸 )
  • 冬コミ落ちて、引越を言い訳に何もしなかった (最終日だけデバイス動かした)
  • リバウンドしてた (一昨年の体重に戻った)

2015年にやりたいこと

  • 夏コミ(C88)に受かりますように
  • C87で取ったデータの分析 & まとめ。手法の再検討とC88でのリトライをしたい。
  • “Linuxのブートプロセスをみる”のPlan 9版を書いてコミケで出したい
  • 9load の EFI対応? とりあえず勉強するところから…
  • OSvでNetVM的なことできないか遊んでみる
  • DPDKで遊びたい
  • オレオレネットワークツールをきちんとまとめよう
  • 集めたデータ分析の方向の掘り下げ方を考えよう
  • 通信速度その他を図りながらの計測デバイスを作ってみる
  • Raspberry Piで玄関先カメラシステム作りたい
  • ネットワーク自動化周りをきちんと自宅に組み込む, 生活で使う
  • 自宅鯖環境の復旧
  • 監視系の作り込みをしよう
  • こんどこそちゃんと背景透過なグレンダさんステッカーを作る
  • 忍耐を要求しないHTML/JavaScriptというよりWebUIの書き方・常道を勉強する
  • 論文読んだらきちんとまとめと所感を書く習慣をつけよう
  • 手元でてきとーに作ったツールをきちんと見直してどこかに放り込んでおく習慣をつけよう
  • 2016年の初日の出は犬吠埼か九十九里のどこかで観たい
  • 電子書籍になれよう
  • やせよう ( -15kg )
  • もっと馬鹿をやろう. Keep it stupid, simple (誤字にあらず)

本記事は、システム系論文紹介 Advent Calendar 2014 12/11 のための記事です

はじめに

本エントリでは、NSDI’14 にて発表のあった “NetVM” について紹介します。

“NetVM: High Performance and Flexible Networking Using Virtualization on Commodity Platforms”

論文の概要

この論文では表題にも登場する”Commodity Platforms”いわゆる普通の(?) x86マシンを使った、高度かつ高速なネットワークサービスを実現するための基盤として、”NetVM” というプラットフォームを提案&実装しています。これまでお高い専用のハードウェアでなければ実用に足る性能が出せなかったファイヤーウォールやルーティング、ロードバランサといったネットワークに必要な諸機能。これらをソフトウェアだけで実現し、いわゆるNFV 的なものの基盤として使える様にするといったことを目的としています。特にこの論文では、ハードウェアアプライアンスに負けない性能(==ワイヤーレート)を目指しつつ、ソフトウェアとしての展開の容易さや機能実現に対する柔軟性といったネットワークサービスインフラにおける利便性を実現することを主眼としています。

ここがひと味違うよNetVM

ここではNetVMを支える技術、として論文中よりNetVMにおける「こだわり」ポイントをいくつか紹介します。

Virtualization: 仮想化前提だよ

NetVMにおける仮想マシン: 1コンポーネント == 1VM

NetVMにおける一つの特徴として、仮想化環境によるネットワークサービスの実現を特に意識している点が上げられます。 いわゆるハコモノを用いる一般的なネットワークでは用途に応じて様々なハコを組み合わせてネットワークを構成します。 これにはたとえばスイッチやルータ、ファイヤーウォールなどといったコンポーネントに設定を投入し、間を LANケーブルで敷設するイメージでしょうか。 ブロードバンドルータなど一つのハコにまとめている場合もありますが、より大規模かつ高速な処理を要求される場合は 専用のアプライアンスを持ってくることが一般的でしょう。

NetVMでは、これらの物理的なハコとしての形を取っ払ってKVM上の仮想マシンを新たな仮想的なハコとしてそこに機能を押し込めています。 これによりソフトウェアの柔軟性(デプロイや変更の自動化、大規模化 etc)といった利点をネットワークの構成に導入しています。

それぞれのVMはハコモノとして、これまで行ってきたのと同じようにパケットの入力とそれに基づく出力の決定(宛先の変更やパケットの書き換えなど)を行います。 もちろん仮想マシンに押し込めたところで物理配線が消える訳ではないのでそれらは依然として存在しますが、このハコモノの間を埋めるLANケーブル (とスイッチング)の役割の一部をNetVMではハイパバイザでも提供します。NetVMではこのホストで動く部分をNetVM Core, NetVM Managerと呼称しています。 ネットワークコンポーネント間の結線にあたるこの部分もソフトウェアとして抱き込むことで、ハコモノを仮想化したのと同様の利点をネットワーキングにも導入しています。

VMという区分によるセキュリティ

一つのハコモノを一つのVMに押し込めて動かすことはセキュリティ面でも利点があります。 NFV的な、一つの物理ハードウェア上に複数のネットワーク、複数のお客さん環境が載っている場合は それぞれの間がまぜこぜにならないことが肝要です。 KVMが既にVMという区分で提供しているアイソレーションの仕組みに乗っかることでNetVMでは 各ネットワークコンポーネントのセキュリティを担保しています。

加えて必要なのは、それぞれのネットワーク間を間違って繋がないことです。 ここはホストOSつまりNetVM CoreやNetVM Managerの領分になりますが、このためにVMのグルーピングができるようになっています。 これにより、あるVM群は特定のユーザのもの、また別のVM群はそっちのユーザのものといった形で内部的に分離する事が可能です。

なおあくまで内部的な区分けにつき、外に出たフレームは対象とはなりません。このため実際にNFVっぽいことの基盤として使うにはその部分でVLANかますなりトンネリングするなりでネットワーク的に区分けすることが必要だったり?また、一つの物理的なハードウェア上での組み合わせを主眼にしているためか外に出ないといけないような場合の想定があまりなされていない感じもあります。

High Performance: パケット処理性能↑

ハードウェアなアプライアンス箱に性能で勝つ、というのを第一目標においているためかチューニングやテクニックの記述に論文のそこそこの部分を割いているためその一部をここでは解説します。

DPDKで User-land Packet Processing

いわゆる「ポーリングモード」+ 「ユーザランドにおけるパケット処理」+「バッチ処理」による高速化は、Intel DPDKのリリースやnetmap、あとちょっとマニアックなところだとrump(はどうなんだろう…?)などの登場によりもはや当たり前のテクニックとなってきました。特に”なんらかのアプリケーション”に特化した通信を行いたい場合は、これまで先人がせっせと築き上げてきたOSのレイヤやらコンテキストスイッチングによるオーバヘッドをぶち抜けるため非常に高速にパケットを処理することが可能です。

これらの仕組みはDPDKでもnetmapでも、基本的には直接ハードウェア(NIC)を触ってる人のみへの恩恵です。一方、NetVMではベースにDPDKを用いることでこれらの技術を利用しつつ、ネットワークサービスのコンポーネントたるVMの中のアプリケーションに対しても同様の利点を提供しています。

システム全体でのパケットバッファ共有

DPDKやnetmapは基本的に、NICとネットワークアプリケーションとで送受信リングとパケットバッファを共有することでコピーコストの削減を行っています。 NetVMでもDPDKを利用しているため、ホストOSとNICとの間でこれはすでになされていますがこの構造をさらに拡張し、VMにたいしても 同様の処理ができるように巨大な共有メモリ領域を用意し、ダミーのvirtual PCIデバイス経由でVMに対してこれを晒しています。 これによりNIC-ホストOS-VMの三者間でのZero Copyを実現しています。 このZero CopyはVM-VM間でも有効であり、ホストOS(NetVM Core)を通してのコンポーネント間のパケットのやりとりにあたっても 同様の恩恵を得ることができます。これは、ホスト-VM間のRx/Txリングがそれぞれ独立である一方で”同じネットワーク”間では パケットバッファが共有されているためです。なお先に述べたネットワーク間のアイソレーション機能(グルーピング)は このパケットバッファの共有範囲を分けることでも実現されています。

CPU特性の活用

バッファ共有によるZero Copyの拡張に加えて、マルチコアシステムを前提として以下の工夫がなされています。

  • Lockless なシステムデザイン
  • NUMA-awareなデザイン

netmapでも同様だったかと思いますが(マルチコアの場合はどうだったっけ…)、共有のパケットバッファの操作にあたりNetVMではロックを用いません。 あるキュー(Rx/Tx)は同時にホスト内またはゲストから操作しないように構成されます(できないのではなくやらない)。 ある一つのキューに対してロックが必要なケースは以下の場合です。

  1. ホストOS側でそれぞれのコアが同じキューを触ることがある場合
  2. ゲストOSとホストOSが同じキューを触ることがある場合

これらを避けるために、NetVMではコア間で触るキューを分けるようになっています。 まずNetVMのホストOS側ではコアごとにNICおよびVMとのキューを分けるようになっています。 これにより1の、同じキューを別々のコア(上で動作するスレッド)が触ることがないようにしています。 次に、ゲストOS(VM)側のスレッドとホストOS側のスレッドが同じキューを操作するシチュエーション(2)ですが、 これも1と同様にあるゲストOS(VM)上のスレッドが動くCPUを限定することで対処しています。 このゲスト上のスレッドも、同様に自分のCPUに割り当てられたキューしか触れないようにすることで実質的に いわゆるキューを挟んだconsumer-producerにおいてRX側では「ホストOSのスレッドとしてキューにpush」と 「VM上のスレッドとしてキューからpop」が一つのCPUで完結することになります(これらは1つのCPU上では同時に実行されないためロックもいらない)。 このあたりの実装にはKVMのvCPU周りの管理機構をいじくって実現したとのこと。

NetVMではNUMAなマルチコアシステムにおけるメモリの距離とキャッシュの扱いについても考慮が入っています。 基本的なデザインとして、NetVMでは自分のコアに距離的に近いメモリ領域以外は触らないように構成されています (遠いメモリにアクセスするとキャッシュは汚れるは遠いわで良くないよというお話はここでは割愛)。 これは上記の「キューごとのコア」という構造をベースに作られます。 まずNetVMではそれぞれのコアごとに触るメモリ領域を分けます (総メモリ量/コア数 == 1つのコアが触るメモリ領域)。 そしてその各々のメモリ領域に「キューごとのコア」が作られ、ゲスト(VM)と共有されます。 先に述べたように、Locklessデザインの制約によりあるキューはそれぞれ対応するCPUからしかアクセスされないため、 あるCPU(とその上で動くホスト/ゲスト上のスレッド)は常に自分から近いメモリ領域のみを触る様になります。 これは全てのホスト-ゲスト間のみならず、ゲスト-ゲスト間でのパケットのやりとりでも有効であり、最終的に NICにパケットを引き渡すまでlocalityを維持したまま通信ができるようになります。

終わりに

ここではNSDI’14より”NetVM”の紹介をしました。こういったNFV的なプラットフォームはネットワークベンダやキャリアなど各社それぞれ様々な構想を出しており、それらの一例として作り方まで踏み込んだものとして面白い論文ですが、なによりもチューニングに結構命かけているあたりがこのNetVMの面白いところです。

今回ボツになった他の候補者達

最後に、今回読もうと思ってた論文の候補たちを並べておきます。

  1. Unikernels: Library Operating Systems for the Cloud (ATC’13)
  2. HACK: Hierarchical ACKs for Efficient Wireless Medium Utilization (ATC’14)
  3. Hyper-Switch: A Scalable Software Virtual Switching Architecture (ATC’13)
  4. Rekindling Network Protocol Innovation with User-Level Stacks (SIGCOMM Computer Communication Review)

Unikernelsは@suma90h さんが既にシステム系論文輪読会でお読みになってた のでパス。HACKは、無線LAN系 & 今年のATCでのBest Paperということもあって気になっているのですが別枠で読むことに。3や4は、NetVMと同じく”えすでーえぬ”とか”えぬえふぶい”といった類いに属しそうなのと、先日のIIJ-II セミナーで”ClickOS and the Art of Network Function Virtualization”のお話があったので関連文献として上げてみました。