Re: [PATCH] tcp: splice as many packets as possible at once
From: David Miller <davem@davemloft.net>
Date: 2009-01-08 21:55:28
Also in:
lkml
From: Ben Mansell <redacted> Date: Thu, 08 Jan 2009 21:50:44 +0000
quoted
From fafe76713523c8e9767805cfdc7b73323d7bf180 Mon Sep 17 00:00:00 2001 From: Willy Tarreau <w@1wt.eu> Date: Thu, 8 Jan 2009 17:10:13 +0100 Subject: [PATCH] tcp: splice as many packets as possible at once Currently, in non-blocking mode, tcp_splice_read() returns after splicing one segment regardless of the len argument. This results in low performance and very high overhead due to syscall rate when splicing from interfaces which do not support LRO. The fix simply consists in not breaking out of the loop after the first read. That way, we can read up to the size requested by the caller and still return when there is no data left. Performance has significantly improved with this fix, with the number of calls to splice() divided by about 20, and CPU usage dropped from 100% to 75%.I get similar results with my testing here. Benchmarking an application with this patch shows that more than one packet is being splice()d in at once, as a result I see a doubling in throughput. Tested-by: Ben Mansell <redacted>
I'm not applying this until someone explains to me why we should remove this test from the splice receive but keep it in the tcp_recvmsg() code where it has been essentially forever.