Thanks for the great explanation. I still have 2 questions: 1. From the tomcat documentation I read this useSendFile is default to true and it is defined under nio. Does this support what you wrote about "ARP native" connector? 2. As I mentioned before, I am defining the static context under Engine->Host->Context: <Context docBase="../../work/bundles" path="/bundles" This does not correspond to a specific connector, so I don't understand how it has to do with the useSendFile which is defined on a specific connector. It might be that I don't understand some basic things about the tomcat. Or maybe I am not defining the static retrieve correctly in server.xml. Any thoughts on that?
Thanks, Michal -----Original Message----- From: André Warnier [mailto:a...@ice-sa.com] Sent: ג 28 יוני 2011 14:33 To: Tomcat Users List Subject: Re: fail to download large static files in tomcat Michal Singer wrote: > The useSendfile relates to connectors, the configuration I understand is > needed is in under Engine > Host > Context (<Context > docBase="../../work/bundles" path="/bundles") > > Can you explain how the " useSendfile" relates to static files? > Is the configuration I am using correct? Or is there another way to configure > the use of static files? Hi. Let me explain, in not too technical or precise terms, what the useSendFile means. Normally, to copy a filesystem file to the servlet response filehandle, you would a) open the file, using some read buffer size b) start a loop reading a chunk of the file, and writing that chunk to the response filehandle, and then loop and do it again until you reach the EOF on the input file. c) close the input file And you would do all that using Java I/O code, so that it is portable across OS'es. Modern OS'es have a "sendfile" function, built in the OS itself. Basically, it is a very optimised piece of code, by which an application (like a Java JVM) can tell the OS : here is the path to a file on the filesystem, and here is a "filehandle" to which this file should be copied. The OS sendfile function then arranges everything to do this as efficiently as possible under that particular OS and filesystem, and for Java it is one function call instead of a Java I/O loop. By setting the "useSendFile" attribute to true, you basically allow Tomcat to use the builtin sendfile of the OS to send the servlet response (instead of a Java I/O loop like the above). It only works if the input is a static file on the filesystem, but for such files it is probably at least 50% more efficient than the corresponding Java loop. It is bound to the Connector, because the Connector is the object which "holds" the filehandle to the client TCP socket, where the response must ultimately be sent. Another thing : the sendfile option will probable only work with the "APR native" connector. So check your Tomcat startup messages to verify that this is what you are using. And yet another thing : all this will make it more efficient for the server CPU and disks, to send back a static file. But it has no impact on the available bandwidth of your server-to-client link, or on the client itself. --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org For additional commands, e-mail: users-h...@tomcat.apache.org