Joe Orton wrote:
On Sun, Jul 03, 2005 at 04:27:05PM -0700, Brian Pane wrote:

I just did some performance profiling of httpd-2.1 for the first time in a long while.

One of the odd things I noticed is that apr_file_open() appears to spend half its time
in a call to apr_pollset_create().

The pollset creation can be expensive, especially on platforms where it's implemented using /dev/poll or kqueue. And as far as I can tell. the pollset is only used in the special case of apr_wait_for_io_or_timeout() where the caller wants to wait on a file.


Note that this problem only affects the very small number of platforms without a (working) poll() implementation.


I'm inclined to think that the pollset within an apr_file_t should be created only if needed--e.g., with lazy initialization triggered via an apr_file_get_pollset() function. Such a function wouldn't be thread-safe without some extra synchronization, of course, but that's true of many of the apr_file_* and apr_pollset_* operations already.


apr_wait_for_io_or_timeout could not be used from multiple threads for one file object already since the pollset use is not safe for such use either, so just creating the pollset there would probably work.

The other alternative is just to implement the function using select(), but that then trades off against the FD_SETSIZE limitation.

Possibly "use select if fd < FD_SETSIZE or fallback on creating a pollset" would be the most efficient for the normal case.

joe

It's been quite a while since I profiled httpd but I distinctly recall that select on AIX, specifically the memset to clear out the FD_SET, chewed up CPU. FD_SETSIZE on AIX 5.2 is 64K.

Bill

Reply via email to