virtio-net ドライバで状態を保持している lastUsedIndexRead_ の型が int ではなく uint16_t であるべきだった。
virtio 内部では used->idx は uint16_t で保持されているので、idx が 16bit を超えると 0 に戻る。このタイミングで異常な受信をしているのが原因。
これにより 20 並列 30000 リクエストくらいはさばけるようになった。
残る問題は
- QEMU 起動直後にアクセスがあると死ぬ
- send の ring が足りていなくてボトルネックになっている