VyOS向け低レイテンシーチューニングTips

すっかり冬模様になりましたね。
雪遊びの準備が全然できてないので、早く仕事を落ち着かせたい今日この頃です。

2015年はKauliが買収されたり、ご自慢のVOYAGEオフィスから締め出されたり、その後転職といろいろありました。
来年は落ち着いた一年になることを心から願っています。

さて久々に糞エントリーを書くのとadvent calendarということもあり、ふわっとゆるい内容でいきたいと思います。

VyOS向けとありますが、VyOS自体DebianなのでLinux全般で使えるTipsです。
低遅延になって何がうれしいかというと、VoIPで音声通話がよりリアルタイムになったり、ネットゲームで有利になったり、VyOSで超高速取引をしてる個人投資家が有利になるとかいい事尽くめです(?)

本来の目的は10Gbps 64byteのショートパケットで、ワイヤレートをだすLVSを作る予定だったんですが、VOYAGEの経営陣に取り潰されたネタです。

チューニングすべき箇所はキューやバッファですが、それぞれネットワークスタックやデバイスコンポーネントの一部として構成されています。
それらのデフォルトの設定はスループット向上や、CPU負荷低減などシステムや回線の利用効率向上に一役かっています。
しかし逆に何をしてもいいから1ナノセックでも早くパケットを処理し送り出したい、そんな要求も世の中にはあります。
今回はそんな人むけです。
なおソケットなどユーザランドは考慮しません。
あくまでルータとしてNICとカーネルまでです。

リングバッファを少なくする

リングバッファはCPUがオンデマンドで処理できない時のために、バッファ領域としてごく小さいメモリ空間として存在しています。
理想はないほうがいいし、あったとしてもメモリ空間なのでレイテンシを気にする場合は効率的に使う必要があります。
リングバッファサイズを小さくすることでヘッドポインタとテールポインタを追跡する処理やガベージコレクトのロスを減らすことができます。
レイテンシを目的とするなら最小値に設定しましょう。

RSSのキューイング先(CPUコア)を固定する

CPUのキャッシュが効率的に使えます。
ntupleとFlow Directorによって、通信条件を指定してRSSのキューイング先を指定できます。

NICのInterrupt Coalescingを無効にする

過大なCPU割り込みを軽減するために、NICはパケットを受信してもすぐ割り込みを発生させません。
特定のパケット数がたまるまで待つ設定がデフォルトでされています。
オフにすればオンデマンドで割り込みが発生し遅延しません。
ただしバーストトラフィックには注意してください。
バースト分がCPUに直撃します。

EISTとC-STATEをオフにする

CPUクロックの変化がレイテンシに悪影響を与えるため、EISTと各C-STATEをすべて無効にします。

・PCIe Link State Power Managementをオフにする

CPU同様にPCI Expressも全力で稼動させます。

NICオフロードについては未調査のため今回はスルーします。
では皆様よいお年を!
(このやっつけ感)

VyOS Users Meeting Japan #2で話をしてきました

VyOSをビルドしたという自分のふとしたツイートから @higebu さんと知り合い、軽いノリで次回のユーザ会をやるときは話すとうっかり言ってしまったので約束を守るために話をしてきました。
ちなみに髭生やしてると思い込んでいたので、ご本人をみたときは軽くショックを受けました。

当日はおまけ資料の動画ファイルを職場のPCに忘れて午前中取りにいった割には使い物にならなかったり、ついでに新宿でエージェント業を遂行していたら、どこにいても聞こえるくらいでかいドラム鳴らしてる迷惑集団がいたりしてナヨナヨでした。
彼ら最終的には公園に落ち着いたようですが、休日を公園で過ごしてる人たちにはさぞ迷惑だったでしょうね。

そんなテンションで話しをさせていただいたVyOSユーザ会ですが、開催を知らされてから当日まで一週間もなく、内容も英語とのことで薄いスライドの内容の割にはかなり時間をくってしまいました。
(前日にレビューしてくれた秋津メンのみんなありがとうございました)

さてせっかくなので、自分がVyOSに限らず各種ソフトウェアルータや、SDNについて抱いている感想をカス零細弱小広告配信会社的な観点で軽くまとめます。

Vyattaを使い始めたきっかけは、入社して二日目に崩壊した箱出しで使っていたCentOS5のiptablesです。
初日で環境も揃い、二日目になりがんばるぞいってなったところで向かいの席から悲鳴があがり、そこからすべてが始まりました。

私物のRTX1200を試しに投入してみたところ見事に瞬殺w、今まで経験のない現象だけどRTXよりまだましなiptablesでがんばったほうがいいとなり、ならLinuxのチューニングが丸ごと使えるしNW機器として使える細かい手設定が不要なVyattaを選びました。
あとはひたすらパケットドロップ&破棄→チューニングで対処を繰り返して現在にいたるという感じです。

さて自社では大活躍しているVyOSをはじめとするソフトルータ(各種SDNも)ですが、自分の環境だとイマイチ使いどころが分からないとか使ってみたいけどーみたいな発言を見かけます。
まずは使ってみることをお勧めします。
なんとなく使ってるうちに自然とここで使えるなとか発想が出てくるはずです。

以下のような安価で低消費電力の2Port NICのマザーにVyOSを入れて家のルータとして使うのはどうでしょうか。
家庭用ルータをぶっちぎる性能と機能に足して、RTXより低価格で同等かそれ以上の性能を発揮するでしょう。

GA-J1900N-D3V

今後はIntelのDPDK等、高価なネットワーク機器の変わりに、安価なサーバやOpenFlowスイッチとコントローラを利用したパケットプロセッシングが主流になっていくとおもっています。
今のうちに自分自身の既成概念をぶち壊しておきましょう。

たとえば今ですが、数千万の小銭しか出資してないくせにあーだこーだ口出しして足引っ張ってくるVCのクラウドおじさん達がBGPルータを買ってくれないので、Lagopus(DPDK)とRouteFlowとか、最新カーネルでBulk dequeueのパッチが当たったので実はVyOSのquaggaで安価になんとかなるんじゃないかなと目論んでいます。(やるかは別として)

なおスライドでちょっと紹介した自作サーバについては、今年の初めに自作サーバ同窓会で詳細を発表しています。
スライドはこのへん動画はこのへんにひっそりと公開されていますので、興味のある方は悪の道に染まってみてください。

次回もなにかネタをこしらえて話をさせていただけたらとおもいます。
参加された皆様お疲れ様でした!

安価(?)でプチキャリアグレードNATルータを作ってみた

寒い日が続きますが、皆さん体調など崩していないでしょうか?
自分はサバゲで叫びすぎて喉を痛めてその後いっきに冷え込んだため、そのまま喉をやられてしまいました。
内部ネットワークを10Gでリプレースというでかい作業に着手した直後に同僚が不摂生という不可抗力で倒れ、一人で糞暑い中連日DCに通って朝から晩まで作業して、やっとこさ落ち着いたらこのざまです。

さて、自社でも大変重宝しているCore i7 870のVyattaですが、そのトラフィックもとうとうピーク時で大量のショートパケットをさばきつつ out/400Mbps inout/280Kpps 前後をNATで処理するようなところまできてしまいました。
今となっては貧弱なハードウェアでここまでできてしまったのは、正直想定外です。
CPUはチューニングのためにハイパースレッドをオフにして、各コア綺麗に分散している状態でピーク時で45%くらいなのでそろそろキャパシティに不安がでてきました。

natter1 natter3 natter2

そこで内部ネットワークの10G化にあわせて、新しいNATルータを設置することにしました。
自分の中での要件は以下のとおりでした。

・通常だと一個しか置けないデフォゲーNATルータを複数置いてスケールさせたい
・安定性と冗長性は絶対ゆずらない
・アクティブスタンバイ構成をやめてアクティブアクティブにして効率化したい
・Vyattaの負荷を考慮してデフォゲーと内部ルーティング用を分離して、全サーバにスタティックルートを書いている運用を捨てたい
・フェイルオーバーは2,3秒くらいでしてほしい

という夢の様な要件から、以下の方法を導き出しました。

・NAT/IP Masquaredeは従来通りVyattaでがんばる、ここはCPUパワーでコスパを出すしかない
・デフォゲーは信頼性向上と直近でセグメント間の通信をワイヤレートでする必要があるため、思い切ってディストリビューションスイッチとしてL3スイッチを導入する
・デフォゲーを受けたL3スイッチからは、OSPFのECMPでNATルータの負荷分散をする、冗長性はルーティングプロトコルで担保する

このように、L3スイッチが得意とする超高速ルーティングと、CPUバウンドでなんとかなるIP Masuquaredeの処理をVyOSでするという分担構造になりました。

説明用に軽く図をかいてみました。

natter4

これならば高信頼かつワイヤレートでVLAN間が通信できるし、NATルータはL3スイッチのECMP上限数まで増やせるし、内部と外部用でゲートウェイわけなくてもいいし、一石億鳥やー!ってことでプロジェクトは動き始めました。

L3スイッチとVyattaでのOSPF ECMP NAT串刺しルーティング構成の検証はVirtual Box上で、Arista NetworksのvEOSを対向として行いました。
vEOSは多少の機能制限があるものの、ほぼ完璧にL3スイッチの動作をするのでこちらで検証を行いました。

もちろん外部と正常に通信できるのは当たり前ですが、ルーティング的に問題ないことはわかっていたので、ECMPの分散に偏りがでないかを重点的に調べました。
一昔前のL3スイッチではECMPの負荷分散がIPを元にハッシュ化していたため、しばしば偏りECMPの意味がないといった状況が多発していたようです(?)
現在ではパケット単位が標準のようです。

ディストリビューションスイッチはアライドテレシスのx8100を導入しました。
要件に対して事前の検証やアドバイス、導入支援まで迅速に数多くしていただきました。

今回はこの程度の概要しか気合が足りなくて書きませんが、リクエストがあればもうちょっと深く掘り下げて書いて見ようと思います。

このドサクサにまぎれてVyattaからVyOSに移行しました。
詳細は過去のエントリーにあります。

あとサーバルームの連続稼働は一日6時間くらいまでが健全だと思いました。

VyOSのigbを最新にしてみた

ネットワークのリプレースにあたりVyattaのリポジトリが長時間が落ちっぱなしだったり、コミュニティもgdgdなようなので、思い切ってVyOSに乗り換えることにしました。

以前からのVyattaの使い方の通り、カーネルを最新にするために非公式版なんぞないと思い込み、build-isoから作る作業をしていました。
ついでなのでigbも最新版を入れようと思い、とりあえずビルドをしてみましたが…。

vyos1

それさぁ、早くいってよぉ〜

しかしこれだけではlinux-headers相当のパッケージを含まないため、igbのコンパイルをすることができませんでした。
四苦八苦していろいろ模索した結果公式に、linux-vyatta-kbuild_*.deb という kernel-headers 相当のパッケージを見つけました。

http://dev.packages.vyos.net/vyos/pool/main/l/linux-3.13/

しかしこれだけではigbのmakeに必要がなものが揃っていないので、以下にまとめて手順を記載します。

# Debianのsqueezeリポジトリを追加
configure

set system package repository squeeze components main
set system package repository squeeze distribution squeeze
set system package repository squeeze password ""
set system package repository squeeze username ""
set system package repository squeeze url http://http.us.debian.org/debian

commit
save

exit

# makeに必要なパッケージをインストール
sudo apt-get update
sudo apt-get install make gcc build-essential

# カーネルヘッダをインストール
sudo wget http://dev.packages.vyos.net/vyos/pool/main/l/linux-3.13/linux-vyatta-kbuild_3.13.11-1+vyos1+helium5_amd64.deb
sudo dpkg -i linux-vyatta-kbuild_3.13.11-1+vyos1+helium5_amd64.deb

cd /usr/src

sudo ln -s /usr/src/linux-image/debian/build/build-amd64-none-amd64-vyos linux

# igbのインストール
sudo wget http://downloads.sourceforge.net/project/e1000/igb%20stable/5.2.9.4/igb-5.2.9.4.tar.gz
sudo tar -zxvf igb-5.2.9.4.tar.gz
cd igb-5.2.9.4/src/
sudo make
sudo make install

以上で最新カーネル、最新ドライバの最強のVyOSが出来上がりです。