Hi,
Can some one help me with this?
I have a TCP socket created inside the kernel and the service using that
socket is sending and receiving data in a single thread fashion
(Request/response one by one in a stream). Everything works well except
the last part of the application response PDU transfer. A full
application PDU is little bit over 32KB. The last packet of the response
send by other system (I have no control over this system to change
anything) is not a full sized TCP segment. Due to Nagle algorithm, the
other system will not send a segment less than MSS unless it receives
an ACK from my side (The last packets has a push flag, due to some
reason the other side is not honoring the push flag). But my side is
doing a delayed ACK! There is around 40ms delay from my side TCP stack
to send the delayed ACK. The other side is waiting unnecessarily here
for 40ms affecting the data transfer throughput very badly. All the
packets expect the last one is transferred less than 2ms while the last
one takes around 40ms. The end result is that I can 8MB/s for writes and
700KB/s for reads.
The design of the application is such a way that it can not do
concurrent requests/responses. Since it works this way, I like to
disable the delayed ACK. Reading few articles about this, I am using the
following socket API in kernel to disable the delayed ACK.
int arg=1
s=sock_setsockopt(socket, IPPROTO_TCP, TCP_QUICKACK, (char *)&arg,
sizeof(arg));
The call goes through successfully, but i can still see the 40ms delay
in the network traces. Pretty much, the quickack is not getting enabled
at all.
Thanks in advance,
Aboo
--
To unsubscribe from this list: send the line "unsubscribe linux-net" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html