To test the common scenario as well as a more aggressive case, we use two different servers with different software architectures and design goals. To represent widely-deployed general-purpose servers, we use the multi-process Apache server (1), version 1.3.27. To test high-performance servers, we use the event-driven Flash Web Server (13), a research system with aggressive optimizations. Where appropriate, we test two versions of Flash - one using the standard select() system call for event delivery, as well as one that uses the more scalable kevent() event-delivery mechanism coupled with the zero-copy sendfile() system call.
The Apache server utilizes blocking system calls and relies on the operating system's scheduling policy to provide parallelism, while Flash uses event delivery mechanism to multiplex all client connections. Flash consists of a single main process using non-blocking sockets, and a small set of helper processes performing disk-related operations. To increase performance, it aggressively caches open files, memory-mapped data, and application-level metadata. In contrast, Apache dedicates one process per connection, and performs very little caching in order to reduce resource consumption.
In our experiments, both servers are configured for maximum performance. In Flash, the file cache size is set to 80% of the physical memory, with remaining parameters automatically adjusted. We also aggressively configure Apache - periodic process shutdown is disabled, reverse lookups are disabled, the maximum number of processes is raised to 2048, and access logging is disabled in both servers.