Support zero-copy send in fio_sec_osd to allow testing it
Prelimilary results: - CPU usage drops significantly. For example, in T1Q8 128K write test against stub_uring_osd with 10G network and Athlon X4 860k CPU it drops from 100% to 30% - Latency becomes slightly worse. In T1Q1 4K write test in the same environment latency increases from 56 to 63 us. - Small write throughput also becomes slightly worse. In T1Q128 4K write test against stub iops decreases from 138k to ~110k (unstable, fluctuates 100k..120k). Note that this is without io_uring, of course.
This commit is contained in:
@@ -4,6 +4,8 @@
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include "rw_blocking.h"
|
||||
|
||||
@@ -123,3 +125,41 @@ int writev_blocking(int fd, iovec *iov, int iovcnt)
|
||||
}
|
||||
return done;
|
||||
}
|
||||
|
||||
int sendv_blocking(int fd, iovec *iov, int iovcnt, int flags)
|
||||
{
|
||||
struct msghdr msg = { 0 };
|
||||
int v = 0;
|
||||
int done = 0;
|
||||
while (v < iovcnt)
|
||||
{
|
||||
msg.msg_iov = iov+v;
|
||||
msg.msg_iovlen = iovcnt-v;
|
||||
ssize_t r = sendmsg(fd, &msg, flags);
|
||||
if (r < 0)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EPIPE)
|
||||
{
|
||||
perror("sendmsg");
|
||||
exit(1);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
done += r;
|
||||
while (v < iovcnt)
|
||||
{
|
||||
if (iov[v].iov_len > r)
|
||||
{
|
||||
iov[v].iov_len -= r;
|
||||
iov[v].iov_base += r;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
r -= iov[v].iov_len;
|
||||
v++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return done;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user