山ブログ

山間部

KVM上のインスタンスでNICが100Base-Tだった話

KVM上のインスタンスのNICが100Base-Tだった。ファストイーサネット!!!

$ ethtool eth0
Settings for eth0:
        ...
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full


どこかに設定があるのかなーと思って探したが見つからない。twitterで呟いた所、神が現れて道を指し示して下さった。



とりあえずvirsh editしてinterfaceの設定にドライバの指定を追加して、rebootした。

...
<interface type='bridge'>
  <mac address='aa:aa:aa:aa:aa:aa'/>
  <model type='e1000'/>
  <source bridge='br100'/>
  ...
</interface>
...

再びethtoolで見てみるが、変更されていない。どうやらvirsh rebootではドライバの変更は行われず、virsh shutdownしてからvirsh startしないと反映されないようだった。とにかく、これでNICが1000BaseTで動作するようになった。
原因は、KVMのデフォルトのドライバであるRealtek 8139がFast EthernetのNICで、特に指定しないとこれが使われてしまうからという事らしい (このへん)。ひどい凡ミスっぽい…。
iperfで見てみるとちゃんと1000BaseTで動作している事が確認できる。virtioでも大丈夫だった。

# rtl8139
$ iperf -c xxx.xxx.xxx.xxx -p 12345 -t 30
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec   969 MBytes   271 Mbits/sec

# e1000
$ iperf -c xxx.xxx.xxx.xxx -p 12345 -t 30
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec  2.96 GBytes   847 Mbits/sec

# virtio
$ iperf -c xxx.xxx.xxx.xxx -p 12345 -t 30
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec  3.28 GBytes   940 Mbits/sec

ちなみにOpenStackの場合は、nova.confに以下のように書いておくとデフォルトでvirtioが使われる。

libvirt_use_virtio_for_bridges = true

iperfを使ったKVMのNICドライバのパフォーマンス比較はここにも情報がある。virtio速い。