hi all,
QEMU libiscsi driver has a design it comes to iscsi_tcp_service when POLLIN event comes in. it looks pretty good at most time but when the iops rise the POLLIN event storm triggers vmexit very frequently. I looked down to the source code of libiscsi, to my surprise, the iscsi_tcp_service doesn't read all pdu available in the socket, while the iscsi_tcp_service writes all pdus in the outqueue.
In short, the vm's performance is limited to 29K (4k randread, 128 depth) or so while iscsi-perf shows the target is capable to do 100K iops (running in the vm or in the host). When I do some hacks on the libiscsi driver to read as much as possible in POLLIN event callback. the performance rises to 80K, but still isn't perfect.
PS qemu driver shows lack of queue handling as linux aio driver do, any suggestion or comments on it?
PS2 it seems qemu's dataplane driver does nothing on network block driver, doesn't it?
PS3 why use send instead of writev for pdu bh sending, additional syscalls compared to writev (16% cpu cost for sendto in my case)