KVMのデフォルトだと、並列パケット処理できなくてUDPで大量のアクセスが来た場合、
1つのCPUが100%に張り付いて処理できなくなる。
<driver name='vhost' queues='N'/> この部分追加
<interface type='network'> <source network='default'/> <model type='virtio'/> <driver name='vhost' queues='N'/> </interface>
xml修正後は、VMの停止・起動が必要
virsh shutdown [vm] virsh start [vm]
VM内で、NICのマルチキューサポートを有効化
ethtool -L eth0 combined M
※KVM側で、ちゃんと対応した後で無いとエラーなります。
# ethtool -L eth0 combined 2 Cannot set device channel parameters: Invalid argument
動作検証はiperf3とhtopコマンドで見ると分かりやすい
ethtool -L eth0 combined 2とした場合、下記のようになっているはず。
# ethtool -l eth0 Channel parameters for ens3: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 2 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2
# ls /sys/class/net/eth0/queues/ rx-0 rx-1 tx-0 tx-1
# iperf3 -s
# iperf3 -c 10.10.102.10 -P 4 -t 100 -b 1G -u
こんな感じでsoft割り込み(si)がバラけてくれる
# top top - 13:26:49 up 2:07, 2 users, load average: 0.47, 0.33, 0.26 Tasks: 124 total, 2 running, 122 sleeping, 0 stopped, 0 zombie %Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 0.0 us, 1.4 sy, 0.0 ni, 82.7 id, 0.0 wa, 0.0 hi, 15.9 si, 0.0 st %Cpu2 : 3.4 us, 19.0 sy, 0.0 ni, 15.6 id, 0.0 wa, 0.0 hi, 62.0 si, 0.0 st %Cpu3 : 2.2 us, 12.9 sy, 0.0 ni, 62.9 id, 0.0 wa, 0.0 hi, 21.9 si, 0.0 st
# cat /proc/interrupts | grep virtio0-input 27: 14371000 19775189 0 0 PCI-MSI-edge virtio0-input.0 29: 9 0 293 41440575 PCI-MSI-edge virtio0-input.1 31: 7669896 3004 8222898 858360 PCI-MSI-edge virtio0-input.2 33: 3929884 0 22509786 0 PCI-MSI-edge virtio0-input.3