Using sendfile for reducing CPU utilization

Jeremy Allison jra at samba.org
Fri Jul 19 10:22:01 GMT 2002


On Sat, Jul 20, 2002 at 03:57:27AM +0930, Richard Sharpe wrote:
> Hi,
> 
> I did some testing a couple of days ago with sendfile under FreeBSD and 
> Samba, and observed that in pulling 500MB of data from files on a server I 
> could achieve about 45MB/s over GigE (I have a problem in my switch, I 
> think) but that CPU utilization was at 100% without sendfile and 50% with 
> sendfile.
> 
> This is a big improvement, but there are potential problems. These 
> problems are due to fact that once you start sending, if anything changes, 
> you cannot stop and say oops, I screwed up. If you promised to send 64kB, 
> you have to send that or drop the connection.
> 
> The problem is exacerbated by the fact that the Linux sendfile call does 
> not seem to allow you to specify the header on the call, so you are forced 
> to send the header from userspace and the data from the kernel, and you 
> therefor introduce a window during which things can go wrong. For example, 
> the file can be truncated or deleted, and I don't think SMB allows you to 
> send zeros for parts of the file that are not there.
> 
> The way Samba does this normally is that it assembles the data in 
> userspace and then sends the response. If a problem occurs, it can send an 
> error response and does not need to drop the connection.
> 
> However, FreeBSD's sendfile implementation allows you to specify the 
> header to be sent, and I believe that it also locks the vnode prior to 
> trying anything so you are protected against the file changing under you. 
> The only other thing that it should do is to pin all the pages before 
> trying to send anything. Thus, if any error occurs, it can return to the 
> user saying, sorry, I could not do this, you send an error message.
> 
> A useful extension for memory constrained situations might be that the 
> sendfile call should also take a timeout field that says, if you cannot 
> start sending before this time expires (ie, you cannot assemble all the 
> data before this time) please don't send anything and let me deal with it 
> the slow way.
>  
> So, I think I can get the benefits of sendfile and recvfile, which is, a 
> very large reduction in CPU (caused by copying the data to and from 
> userland) for clients that do lots of reading and writing), and thus 
> support more clients.
> 
> I will send more info as implementation proceeds.

Richard - can you get this patch to me asap ? If so we can add it
with an --enable-sendfile option to allow people to experiment with
it for 2.2.6.

Thanks,

	Jeremy.




More information about the samba-technical mailing list