概要
この記事は「「俺の仮想マシンルーターがこんなに速いはずはないわ」と思って作った件」の解決編の雑まとめです。
(先に)まとめ
きっかけ
ある日、なんとなく『そういえば PF が遅くてなんだかなーって人はいるんだろうか』と Twitter で「FreeBSD pf slow」と検索したら同じように「なんだかなー」ってツイートがあったのでちょっと読み進めてみました。
ふと「Are you using FreeBSD on EC2 and networking is slow when enabling pf?」というツイートが目に入りました。
『まぁ EC2 も仮想マシンだしちょっと関連ありそうだなぁ』と思いリンクを開いてみたところ『「net.inet.tcp.tso」を0にすると早くなるかもよ?』と FreeBSD のフォーラムに書かれていました。
調べてみた
ところで TSO is 何?
TSO(TCP Segmentation Offload)について - @hana_shin
TSOは、NICが送信パケットをMTU長に分割する仕組みです。
以前は、カーネルで分割していましたが、最近はNICでパケットを分割することができます。
NICでパケットを分割することでカーネルの負荷を低減することができます。
FreeBSD 的に影響はあるの?
Configuration - Advanced Configuration Options - Networking Tab - pfSense1 Documentation2
This option is not desirable for routers and firewalls, but can benefit workstations and appliances. It is disabled by default, and should remain disabled unless the firewall is acting primarily or solely in an appliance/endpoint role.
なら設定を入れてみた
# NIC is slow
net.inet.tcp.tso=0
# e1000e
ifconfig_em0="-lro -tso"
ifconfig_em1="inet 192.168.0.1 netmask 255.255.255.0 -lro -tso"
まず em にオプションを追加してみましたが Ookla のスピードテストで測ったところ以前の結果とあまり変わらず。
ここでふと「あ、そういえば virtio でダウンがすげぇ出てたから virtio で試してみよう!」と思い浮かびました。
# virtio
ifconfig_vtnet0="-lro -tso"
ifconfig_vtnet1="inet 192.168.0.1 netmask 255.255.255.0 -lro -tso"
スピードテストの結果を見て思わず『うわっ、すげぇ出てんじゃん!!!』と叫んでしまいました。
まとめ
( ゚д゚) ポカーン・・・
(つд⊂)ゴシゴシ
(;゚д゚) ・・・
(つд⊂)ゴシゴシゴシ
( Д ) ゚ ゚ …!?
(ちょっとした)考察
仮想化する以前の FreeBSD ルーターには(新しくても2011年に買った)蟹さんの NIC を使っていたせいかこの設定は入れていませんでした。一応ギ蟹だったんですけど TSO なんていう高尚な機能は付いていなかったのかもしれないまま、仮想化した FreeBSD ルーターに設定することなく使わなかったんだろうと思います。
次に検証するときは sysctl を設定せずに ifconfig のオプションだけでも変えられるか試してみたいですねぇ。。。
おまけ
スピードテストを何回やって 100[Mbps] 超えしたことを確認したときに勝利の BGM として脳内で流れたのは「恋せよガオガイガー」でした。4シャア! 借りをまとめて返してやったぞ!!