Slide 1

Slide 1 text

俺の仮想マシンルーターが こんなに遅いはずはない 2020/06/06 KernelVM Online part 1 Toshifumi NISHINAGA (@tnishinaga) 2020/6/6 1

Slide 2

Slide 2 text

今⽇のコード https://github.com/tnishinaga/kernelvm-online1-router-config 2020/6/6 2

Slide 3

Slide 3 text

Special Thanks 2020/6/6 3

Slide 4

Slide 4 text

リモートワーク時代到来 • PPPoE接続IPv4回線がとても遅くなった • ⼣⽅など下り1Mbpsを切ることもある • DS-Lite(IPv4 over IPv6)もそんな速くない • どの時間も上り下り70Mbpsで頭打ち • IPv6は数百Mbpsでる • EdgeRouter Liteの性能限界っぽい • 測定中 ksoftirqがCPUを100%使⽤ 2020/6/6 5

Slide 5

Slide 5 text

インターネットを速くするために • DS-Liteが満⾜に動く性能のルーターを作ろう 2020/6/6 6

Slide 6

Slide 6 text

ルーター新調 • LIVA Z-4と拡張パーツを購⼊ • CPU: Celeron N3350 @ 1.1GHz, 2 core • Mem: SO-DIMM DDR3L 8GB* • SSD: M.2 2242 SATA 128GB* • NIC: Gigabit Ethernet(RTL8111H) x 2 • お値段 約3万円 *は換装パーツ 2020/6/6 7

Slide 7

Slide 7 text

セットアップ • LIVA Zにdebianをインストール • KVM上にルーターを構築 • UTMも収納したかった • Gigabit程度なら速度低下もないはず 2020/6/6 8

Slide 8

Slide 8 text

セットアップ • LIVA Zにdebianをインストール • KVM上にルーターを構築 • UTMも収納したかった • Gigabit程度なら速度低下もないはず •↑本当に? 2020/6/6 9

Slide 9

Slide 9 text

今⽇の発表内容 • VMでルーターを作っても速度低下がないのかを知るため、ホ ストマシンとVMでルーティング時のスループット差を検証し たので共有する • 道中、VMだけで起こる謎現象に遭遇したので解決策を募集 • 資料にのみ記載。解決⽅法ご存じの⽅はTwitter等で教えて下さい。 2020/6/6 10

Slide 10

Slide 10 text

物理マシンのスループット 調査 2020/6/6 11

Slide 11

Slide 11 text

物理マシンのスループット調査 • 以下を⽐較して調査するため • 物理マシン上に直接⼊れたLinux • VM上に⼊れたVyOS(Linux base) 2020/6/6 12

Slide 12

Slide 12 text

物理マシンのスループットを調査する • NICのスループット調査 • ブリッジ時のスループット調査 • パケットフォワード時のスループット調査 • ipip6トンネル時のスループット調査 2020/6/6 13

Slide 13

Slide 13 text

計測条件 • LIVA-Z • debian buster x86_64 • iperf version 2.0.12 • iptablesの設定は全削除 • PC(MacBookPro 2018) • Mac OSX Catalina 10.15.5 • iperf version 2.0.13 • Tuneware Almighty dock C2 gigabit ethernet • PC(ThinkPad x230) • VyOS 1.3 • iperf version 2.0.12 2020/6/6 14

Slide 14

Slide 14 text

NICのスループット計測 • ⽬的 • 各NIC単体のスループットを測る • 確認⼿順 1. LIVA Z上にiperf serverを建てる 2. 各NICの下にGigabit NICを持ったPCを接続する 3. iperfで60秒間のスループットを測る 2020/6/6 15

Slide 15

Slide 15 text

LIVA Z NICのスループット計測 enp1s0 enp3s0 PC PC 2020/6/6 16 iperf server 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 192.168.2.1 2001:db8:dead:cafe::1 192.168.2.2 2001:db8:dead:cafe::2 ※ IPv4は/24, IPv6は/64

Slide 16

Slide 16 text

LIVA Z NICのスループット計測 enp1s0 enp3s0 PC PC 2020/6/6 17 iperf server 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 192.168.2.1 2001:db8:dead:cafe::1 192.168.2.2 2001:db8:dead:cafe::2 ※ IPv4は/24, IPv6は/64

Slide 17

Slide 17 text

NICスループット計測結果 2020/6/6 18 0 100 200 300 400 500 600 700 800 900 1000 enp1s0 enp3s0 IPv4(Mbps) IPv6(Mbps)

Slide 18

Slide 18 text

ブリッジ時のスループット計測 • ⽬的 • (ソフトウェア)ブリッジ性能を計測する • 確認⼿順 1. LIVA ZのLinuxで各NICをbridgeする 2. 各NICの下にGigabit NICを持ったPCを接続する 3. ⽚⽅のPでiperf server,もう⽚⽅でiperf clientを起動する 4. 60秒間のスループットを計測する 2020/6/6 19

Slide 19

Slide 19 text

LIVA Z ブリッジ時のスループット計測 enp1s0 enp3s0 PC PC 2020/6/6 20 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 ※ IPv4は/24, IPv6は/64 br0 192.168.1.3 2001:db8:dead:beaf::3

Slide 20

Slide 20 text

LIVA Z ブリッジ時のスループット計測 enp1s0 enp3s0 PC PC 2020/6/6 21 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 ※ IPv4は/24, IPv6は/64 br0 192.168.1.3 2001:db8:dead:beaf::3

Slide 21

Slide 21 text

ブリッジ時のスループット計測結果 2020/6/6 22 0 100 200 300 400 500 600 700 800 900 1000 IPv4 IPv6 Mbps br0 enp1s0

Slide 22

Slide 22 text

パケットフォワードのスループット計測 • ⽬的 • パケットフォワードの性能を計測する • 確認⼿順 1. LIVA ZのLinuxで各NICのIPv4/IPv6 forwardingを有効にする 2. LIVA ZのLinuxでip routingの設定を⾏う 1. sudo /sbin/sysctl -w net.ipv4.ip_forward=1 2. sudo /sbin/sysctl -w net.ipv6.conf.all.forwarding=1 3. 各NICの下にGigabit NICを持ったPCを接続する 4. 各PCに静的ルーティング設定する 1. Mac: sudo route add -net 192.168.2.0/24 192.168.1.1 2. Mac: sudo route add -inet6 2001:db8:dead:cafe::/64 2001:db8:dead:beaf::1 3. VyOS: set protocols static route 192.168.1.0/24 next-hop 192.168.2.1 4. VyOS: set protocols static route6 2001:db8:dead:beaf::/64 next-hop 2001:db8:dead:cafe::1 5. ⽚⽅のPCでiperf server,もう⽚⽅でiperf clientを起動する 6. 60秒間のスループットを計測する 2020/6/6 23

Slide 23

Slide 23 text

LIVA Z パケットフォワードのスループット計測 enp1s0 enp3s0 PC PC 2020/6/6 24 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 192.168.2.1 2001:db8:dead:cafe::1 192.168.2.2 2001:db8:dead:cafe::2 ※ IPv4は/24, IPv6は/64

Slide 24

Slide 24 text

LIVA Z パケットフォワードのスループット計測 enp1s0 enp3s0 PC PC 2020/6/6 25 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 192.168.2.1 2001:db8:dead:cafe::1 192.168.2.2 2001:db8:dead:cafe::2 ※ IPv4は/24, IPv6は/64

Slide 25

Slide 25 text

パケットフォワードのスループット 2020/6/6 26 0 100 200 300 400 500 600 700 800 900 1000 IPv4 IPv6 Mbps forward br0 enp1s0

Slide 26

Slide 26 text

ipip6 tunnel利⽤時のスループット調査 • ⽬的 • ipip6 tunnel利⽤時のスループットを計測する • (DS-Lite利⽤時の最⼤スループットの確認⽤) • 確認⼿順 1. 対向VyOSでipip6トンネルを設定する 2. LIVA Zのlinuxでipip6トンネルを設定する 3. 対向VyOSでiperf server,PCでiperf clientを起動する 4. 60秒間のスループットを計測する 2020/6/6 27

Slide 27

Slide 27 text

LIVA Z ipip6 tunnel利⽤時のスループット調査 enp1s0 enp3s0 PC VyOS (ipip6 remote) 2020/6/6 28 2001:db8:dead:beaf::2 192.168.1.2 ※ IPv4は/24, IPv6は/64 ipip6 local 192.168.2.1 2001:db8:dead:beaf::1 192.168.1.1

Slide 28

Slide 28 text

LIVA Z ipip6 tunnel利⽤時のスループット調査 enp1s0 enp3s0 PC VyOS (ipip6 remote) 2020/6/6 29 2001:db8:dead:beaf::2 192.168.1.2 ※ IPv4は/24, IPv6は/64 ipip6 local 192.168.2.1 2001:db8:dead:beaf::1 192.168.1.1

Slide 29

Slide 29 text

ipip6 tunnel利⽤時のスループット調査 2020/6/6 30 0 100 200 300 400 500 600 700 800 900 1000 IPv4 IPv6 Mbps ipip6 forward br0 enp1s0

Slide 30

Slide 30 text

物理マシンスループット調査まとめ • 各ポート概ね1Gbpsの速度が でている • bridge, forward等してもさほ どスループット差はない • ipip6トンネルも900Mbps以上 出ている 2020/6/6 31 0 100 200 300 400 500 600 700 800 900 1000 IPv4 IPv6 Mbps ipip6 forward br0 enp1s0

Slide 31

Slide 31 text

仮想マシンのスループット 調査 2020/6/6 32

Slide 32

Slide 32 text

VM性能調査 • VMの性能限界を調査する • VMまでのスループット調査 • ブリッジ時のスループット調査 • パケットフォワード時のスループット調査 • ipip6 tunnel利⽤時のスループット調査 2020/6/6 33

Slide 33

Slide 33 text

VMまでのスループット調査 • ⽬的 • VMまでのスループットを測る • 物理NICとの差を調べる • 確認⼿順 1. LIVA Zのenp1s0をbr0に所属させる 2. LIVA Z上にkvmでVyOSのVMを建てる 1. NICはbr0に接続 3. 各NICの下にGigabit NICを持ったPCを接続する 4. iperfで60秒間のスループットを測る 2020/6/6 34

Slide 34

Slide 34 text

なぜブリッジを使うか • スループットはmacvtapのほうが良くなる • 代わりに様々な問題を引いた • 引いた問題については後述 2020/6/6 35

Slide 35

Slide 35 text

LIVA Z VMまでのスループット調査 enp1s0 PC 2020/6/6 37 VyOS iperf server 192.168.1.1 192.168.1.2 vnet0 eth0 br0 ※ IPv4は/24, IPv6は/64

Slide 36

Slide 36 text

LIVA Z VMまでのスループット調査 enp1s0 PC 2020/6/6 38 VyOS iperf server 192.168.1.1 192.168.1.2 ※ IPv4は/24, IPv6は/64 vnet0 eth0 br0

Slide 37

Slide 37 text

VMまでのスループット調査結果 2020/6/6 39 0 100 200 300 400 500 600 700 800 900 1000 IPv4(Mbps) Mbps host nic vm nic

Slide 38

Slide 38 text

VMでのbridgeスループット調査 • ⽬的 • VM上でのbridgeスループットを調べる • 確認⼿順 1. LIVA Z上にkvmでVyOSのVMを建てる 1. NICはbridgeに接続 2. trustGuestRxFiltersをyesにする 2. VyOSでbridgeをつくる 3. 各NICの下にGigabit NICを持ったPCを接続する 4. iperfで60秒間のスループットを測る 2020/6/6 40

Slide 39

Slide 39 text

LIVA Z VyOS VMでのbridgeスループット調査 enp1s0 enp3s0 vnet0 vnet1 PC PC eth0 eth1 2020/6/6 41 br2 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 192.168.1.3 br0 br1 2001:db8:dead:beaf::3

Slide 40

Slide 40 text

LIVA Z VyOS VMでのbridgeスループット調査 enp1s0 enp3s0 vnet0 vnet1 PC PC eth0 eth1 2020/6/6 42 br2 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 192.168.1.3 br0 br1 2001:db8:dead:beaf::3

Slide 41

Slide 41 text

VMでのbridgeスループット調査 2020/6/6 43 0 100 200 300 400 500 600 700 800 900 1000 IPv4(Mbps) IPv6(Mbps) Mbps host bridge vm bridge

Slide 42

Slide 42 text

VMでのパケットフォワード調査 • ⽬的 • VM上でのパケットフォワードのスループットを調べる • 確認⼿順 1. LIVA Z上にkvmでVyOSのVMを建てる 1. NICはbridge接続 2. VyOSでeth0とeth1にパケットフォワード設定する 3. 各PCに静的ルーティング設定する 1. Mac: sudo route add -net 192.168.2.0/24 192.168.1.1 2. Mac: sudo route add -inet6 2001:db8:dead:cafe::/64 2001:db8:dead:beaf::1 3. VyOS: set protocols static route 192.168.1.0/24 next-hop 192.168.2.1 4. VyOS: set protocols static route6 2001:db8:dead:beaf::/64 next-hop 2001:db8:dead:cafe::1 4. 各NICの下にGigabit NICを持ったPCを接続する 5. iperfで60秒間のスループットを測る 2020/6/6 44

Slide 43

Slide 43 text

LIVA Z VyOS VMでのパケットフォワード調査 enp1s0 enp3s0 vnet0 vnet1 PC PC eth0 eth1 2020/6/6 45 192.168.1.1 192.168.1.2 2001:db8:dead:beaf::2 192.168.2.2 br0 br1 2001:db8:dead:cafe::2 2001:db8:dead:beaf::1 192.168.2.1 2001:db8:dead:cafe::1

Slide 44

Slide 44 text

LIVA Z VyOS VMでのパケットフォワード調査 enp1s0 enp3s0 vnet0 vnet1 PC PC eth0 eth1 2020/6/6 46 192.168.1.1 192.168.1.2 2001:db8:dead:beaf::2 192.168.2.2 br0 br1 2001:db8:dead:cafe::2 2001:db8:dead:beaf::1 192.168.2.1 2001:db8:dead:cafe::1

Slide 45

Slide 45 text

VMでのパケットフォワード調査結果 2020/6/6 47 0 100 200 300 400 500 600 700 800 900 1000 host forward vm forward Mbps IPv4

Slide 46

Slide 46 text

ipip6 tunnel利⽤時のスループット調査 • ⽬的 • VMでのipip6 tunnel利⽤時のブリッジ性能を計測する • (DS-Lite利⽤時の最⼤スループットの確認⽤) • 確認⼿順 1. 対向VyOSでipip6トンネルを設定する 2. VMのVyOSでipip6トンネルを設定する 3. 対向VyOSでiperf server,PCでiperf clientを起動する 4. 60秒間のスループットを計測する 2020/6/6 48

Slide 47

Slide 47 text

LIVA Z VyOS VMでのパケットフォワード調査 enp1s0 enp3s0 vnet0 vnet1 PC VyOS eth0 eth1 2020/6/6 49 192.168.1.1 192.168.1.2 192.168.2.1 br0 br1 2001:db8:dead:beaf::2 2001:db8:dead:beaf::1

Slide 48

Slide 48 text

LIVA Z VyOS VMでのパケットフォワード調査 enp1s0 enp3s0 vnet0 vnet1 PC VyOS eth0 eth1 2020/6/6 50 192.168.1.1 192.168.1.2 192.168.2.1 br0 br1 2001:db8:dead:beaf::2 2001:db8:dead:beaf::1

Slide 49

Slide 49 text

ipip6 tunnel利⽤時のスループット調査 2020/6/6 51 0 100 200 300 400 500 600 700 800 900 1000 host ipip6 vm ipip6 Mbps IPv4 ipip6

Slide 50

Slide 50 text

仮想マシンスループット調査結果まとめ 2020/6/6 52 0 100 200 300 400 500 600 700 800 900 1000 IPv4(Mbps) IPv6(Mbps) Mbps vm nic vm bridge vm forward vm ipip6

Slide 51

Slide 51 text

今回の結論 • ルーターを仮想マシンで作るのは難しい • 物理マシンに直接インストールして作ろう 2020/6/6 53

Slide 52

Slide 52 text

謎現象。解決⽅法募集中。 2020/6/6 54

Slide 53

Slide 53 text

謎現象 • macvtapで接続すると様々な謎現象が起こる • IPv6の疎通だけが取れない • ⽚側からはVMに疎通が取れるが、もう⽚側からは取れない • ⽚側だけarpがhostマシン側で落とされてる様⼦ • IPv6通信が途中で途切れる • bridgeでもIPv6はうまく動かないことがある • VMでbridgeを作ると、途中まで確⽴していたneighborがFAILDになる 2020/6/6 55

Slide 54

Slide 54 text

LIVA Z IPv6の疎通が取れなくなる enp1s0 PC 2020/6/6 56 VyOS iperf server 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 ※ IPv4は/24, IPv6は/64 vnet0 eth0

Slide 55

Slide 55 text

LIVA Z VyOS PC1からはVMに疎通が取れるが、 PC2からはVMに疎通が取れない enp1s0 enp3s0 vnet0 vnet1 PC1 PC2 eth0 .100 eth1 .200 2020/6/6 57 vlan 100 vlan 200 br0 192.168.1.1 2001:db8:dead:beaf::1 192.168.1.2 2001:db8:dead:beaf::2 192.168.1.3 2001:db8:dead:beaf::3

Slide 56

Slide 56 text

LIVA Z VyOS IPv6通信が途中で疎通が取れなくなる enp1s0 enp3s0 vnet0 vnet1 PC VyOS eth0 eth1 2020/6/6 58 192.168.1.1 192.168.1.2 2001:db8:dead:beaf::1 2001:db8:dead:beaf::2 192.168.2.1

Slide 57

Slide 57 text

発表後検証 2020/6/6 59

Slide 58

Slide 58 text

VMまでの双⽅向スループット調査 • ⽬的 • VMまでのスループットを測る • 物理NICとの差を調べる • 確認⼿順 1. LIVA Zのenp1s0をbr0に所属させる 2. LIVA Z上にkvmでVyOSのVMを建てる 1. NICはbr0に接続 3. NICの下にGigabit NICを持ったPCを接続する 4. iperfで60秒間のスループットを双⽅向に測る 2020/6/6 60

Slide 59

Slide 59 text

LIVA Z VMまでの双⽅向スループット調査 enp1s0 PC 2020/6/6 61 VyOS iperf server 192.168.1.1 192.168.1.2 vnet0 eth0 br0 ※ IPv4は/24, IPv6は/64 2001:db8:dead:beaf::2 2001:db8:dead:beaf::1

Slide 60

Slide 60 text

LIVA Z VMまでの双⽅向スループット調査 enp1s0 PC 2020/6/6 62 VyOS iperf server 192.168.1.1 192.168.1.2 ※ IPv4は/24, IPv6は/64 vnet0 eth0 br0 2001:db8:dead:beaf::2 2001:db8:dead:beaf::1

Slide 61

Slide 61 text

VMまでのスループット調査結果 2020/6/6 63 0 100 200 300 400 500 600 700 800 900 1000 IPv4 IPv6 Mbps 双⽅向スループット thinkpad -> VM VyOS VM VyOS -> thinkpad