Да, из-за того, что сокет TCP удерживается на страницах в течение неопределенного времени, вы не можете использовать схему двойной буферизации, упомянутую в примере кода.Кроме того, в моем случае использования страницы поступают из кольцевого буфера, поэтому я не могу подарить страницы ядру и выделить новые страницы.Я могу убедиться, что вижу повреждение данных в полученных данных.
Я прибег к опросу уровня очереди отправки сокета TCP до тех пор, пока он не опустится до 0. Это исправляет повреждение данных, но неоптимально, поскольку истощает очередь отправкидо 0 влияет на пропускную способность.
n = ::vmsplice(mVmsplicePipe.fd.w, &iov, 1, 0);
while (n) {
// splice pipe to socket
m = ::splice(mVmsplicePipe.fd.r, NULL, mFd, NULL, n, 0);
n -= m;
}
while(1) {
int outsize=0;
int result;
usleep(20000);
result = ::ioctl(mFd, SIOCOUTQ, &outsize);
if (result == 0) {
LOG_NOISE("outsize %d", outsize);
} else {
LOG_ERR_PERROR("SIOCOUTQ");
break;
}
//if (outsize <= (bufLen >> 1)) {
if (outsize == 0) {
LOG("outsize %d <= %u", outsize, bufLen>>1);
break;
}
};