Re: Compile-time vs. run-time checks
On Feb 23, 2004, at 1:43 PM, Greg Stein wrote: On Mon, Feb 23, 2004 at 01:33:31PM -0600, Scott Lamb wrote: I'm putting together a patch to use SO_(RCV|SND)TIMEO for apr_socket_timeout where available; I expect I'll find it has better performance on some platforms, as it would no longer require using non-blocking IO and preceding every read() and write() with a select(). (I intend to try benchmarking Apache on Darwin, where the system call overhead seems to be quite high.) It seems I was way off...I've got my somewhat tested but unpolished patch attached, but unless someone else runs benchmarks and sees a speedup, I see no real reason to apply. I couldn't see a statistically significant difference between them. In transferring either big or small files with httpd-2.0 HEAD and ab over loopback on Darwin (keepalive on). Which I'd think would be the ideal situation for seeing an improvement... I'm surprised. System calls seem to be an order of magnitude slower on Darwin than they were on Linux for roughly comparable hardware, so I'd expected to see the extra overhead being significant in some way. But I guess it was just such a small piece of the whole that it didn't matter anyway. Or something. On some older versions of platforms (Linux 2.2), these #defines exist but do not work - it's not possible to set them. Can I assume that if APR is built with a kernel in which it does work (Linux 2.4), it will be run with one as well? Or should I include a runtime check for this option? Icky. I don't think it is really possible to make that assumption. Thankfully, I also believe this is reasonably solved with a global variable (i.e. race conditions around coming up with the same flag don't apply :-), and the value certainly won't change over the process' lifetime). I would recommend a dynamic solution for now. We may be able to make that compile-time for certain platforms, where we know all versions handle the flag properly [when present]. Thanks for the suggestion. Maybe I'll apply it to the next patch. :/ Cheers, -g Scott apr-timeout.patch Description: Binary data
Re: Compile-time vs. run-time checks
On Mon, 23 Feb 2004, Scott Lamb wrote: significant difference between them. In transferring either big or small files with httpd-2.0 HEAD and ab over loopback on Darwin (keepalive on). Which I'd think would be the ideal situation for seeing an improvement... Neither ab nor loopback make for a particularly good test of this sort of thing. I suggest you use flood instead of ab and use two machines instead of the loopback adapter. --Cliff
apr_socket_timeout speed (was Re: Compile-time vs. run-time checks)
On Feb 23, 2004, at 11:11 PM, Cliff Woolley wrote: On Mon, 23 Feb 2004, Scott Lamb wrote: significant difference between them. In transferring either big or small files with httpd-2.0 HEAD and ab over loopback on Darwin (keepalive on). Which I'd think would be the ideal situation for seeing an improvement... Neither ab nor loopback make for a particularly good test of this sort of thing. I suggest you use flood instead of ab and use two machines instead of the loopback adapter. I'll play with it a while. Flood was giving me trouble (couldn't find docs on what the numbers it spat out meant, and the analysis awk script got divide-by-zero errors), so I tried siege for a bit. Had disappointing results, then realized I wasn't anywhere close to saturating the server's CPU or the network. The roughly equal-speed Linux 2.6 client machine is groaning...and it's spending 60% time in softirq, according to top. I recently replaced the network card with some cheap thing; maybe the drivers are just that awful. If so, I'll need to replace it before getting decent benchmarks; it might be a while. --Cliff Thanks for the ideas. Scott
Re: Compile-time vs. run-time checks
On Mon, Feb 23, 2004 at 01:33:31PM -0600, Scott Lamb wrote: I'm putting together a patch to use SO_(RCV|SND)TIMEO for apr_socket_timeout where available; I expect I'll find it has better performance on some platforms, as it would no longer require using non-blocking IO and preceding every read() and write() with a select(). (I intend to try benchmarking Apache on Darwin, where the system call overhead seems to be quite high.) On some older versions of platforms (Linux 2.2), these #defines exist but do not work - it's not possible to set them. Can I assume that if APR is built with a kernel in which it does work (Linux 2.4), it will be run with one as well? Or should I include a runtime check for this option? Icky. I don't think it is really possible to make that assumption. Thankfully, I also believe this is reasonably solved with a global variable (i.e. race conditions around coming up with the same flag don't apply :-), and the value certainly won't change over the process' lifetime). I would recommend a dynamic solution for now. We may be able to make that compile-time for certain platforms, where we know all versions handle the flag properly [when present]. Cheers, -g -- Greg Stein, http://www.lyra.org/