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で呟いた所、神が現れて道を指し示して下さった。
@1vq9 NIC を e1000 とかにしてもダメですか?(確か virtio だと kernel によってはそんな症状が出てたって話を聞いた気がした)
— Hok.H @ Kannyさん (@kani_b) 2013年3月13日
とりあえず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