OKWS
OKWS
mise his own process pi , and will not have access to state 4.1 okld
belonging to other users uj . The problem with this ap-
proach is that it does not scale well. A Web server would The root process in the OKWS system is okld—the
either need to fork a new process pi for each incoming launcher daemon. This process normally runs as supe-
HTTP request or would have a large pool of mostly idle ruser but can be run as a non-privileged user for testing
processes, one for each currently active user (of which or in other cases when the Web server need not bind to
there might be tens of thousands). a privileged TCP port. When okld starts up, it reads the
configuration file /etc/okws config to determine the
OKWS does not implement the strict isolation strategy
locations of the OKWS helper processes, the anonymous
but instead associates a single process with each individ-
user ID range, which directories to use as jail directo-
ual service, shown in Figure 2(e). As a result OKWS
ries, and which services to launch. Next, okld launches
achieves the same isolation properties as Flash but with a
the logging daemon (oklogd) and the demultiplexing dae-
process pool whose size is independent of the number of
mon (okd), and chroots into its runtime jail directory. It
concurrent HTTP connections.
then launches all site-specific Web services. The steps
for launching a single service are:
2. Runs the source file through OKWS’s preprocessor, 5.2 Asynchronous Database Proxies
which outputs C++ code.
OKWS provides Web developers with a generic li-
3. Compiles this C++ code into an executable, and in- brary for translating between asynchronous RPC and
stalls it in OKWS’s service jail. any given blocking client library, in a manner similar to
Flash’s helper processes [23], and “manual calling au-
4. Adds the new service to /etc/okws config. tomatic” in [1]. OKWS users can thus simply imple-
5. Restarts OKWS to launch. ment database proxies: asynchronous RPC front-ends
to standard databases, such as MySQL [21] or Berkeley
The resulting Web service is a single-threaded, event- DB [29]. Our libraries provide the illusion of a standard
driven process. asynchronous RPC dispatch routine. Internally, these
The OKWS core libraries handle the mundane me- proxies are multi-threaded and can block; the library han-
chanics of a service’s life cycle and its connections to dles synchronization and scheduling.
OKWS helper processes. At the initialization stage, Database proxies employ a small and static number of
a Web service establishes persistent connections to all worker threads and do not expand their thread pool. The
needed databases. The connections last the lifetime of intent here is simply to overlap requests to the underlying
the service and are automatically reopened in the case of data source so that it might overlap its disk accesses and
void my_srvc_t::process ()
The application is Internet dating, and the site features a
{
str color = param["color"]; typical suite of services, including local matching, global
/*o matching, messaging, profile maintenance, site statistics,
print (resp) <<EOF; and picture browsing. Almost a million users have estab-
<html>
<head>
lished accounts on the site, and at peak times, thousands
<title>${param["title"]}</title> of users maintain active sessions. Our current implemen-
</head> tation uses 34 Web services and 12 database proxies.
EOF
include (resp, "/body.html",
We have found the system to be usable, stable and
{ COLOR => ${color}}); well-performing. In the absence of database bottle-
o*/ necks or latency from serving advertisements, OKWS
output (resp); feels very responsive to the end user. Even those
}
pages that require iterative computations—like match
Figure 3: Fragment of a Web service programmed in OKWS. computations—load instantaneously.
The remote client supplies the title and color of the page via Our Web cluster currently consists of four load bal-
standard CGI-style parameter passing. The runtime templating anced OKWS Web server machines, two read-only cache
system substitutes the user’s choice of color for the token COLOR servers, and two read-write database servers, all with dual
in the template /body.html. The variable my svc t::resp
Pentium 4 processors. We use multiple OKWS machines
represents a buffer that collects the body of the HTTP re-
only for redundancy; one machine can handle peak loads
sponse and then is flushed to the client via output(). With
the FilterCGI flag set, OKWS filters all dangerous metachar- (about 200 requests per second) at about 7% CPU uti-
acters from the param associative array. lization, even as it gzips most responses. A previous in-
carnation of this Web site required six ModPerl/Apache
servers [20] to accommodate less traffic. It ultimately
benefit from disk arm scheduling. was abandoned due to insufficient software tools and pro-
Database proxies ought to run on the database ma- hibitive hardware and hosting expenses [30].
chines themselves. Such a configuration allows the site
administrator to “lock down” a socket-based database
server, so that only local processes can execute arbitrary 5.4 Separating Static From Dynamic
database commands. All other machines in the cluster—
such as the Web server machines—only see the struc- OKWS relies on other machines running standard Web
tured, and thus restricted, RPC interface exposed by the servers to distribute static content. This means that all
database proxy. pages generated by OKWS should have only absolute
Finally, database proxies employ a simple mechanism links to external static content (such as images and style
for authenticating Web services. After a Web service sheets), and OKWS has no reason to support keep-alive
connects to a database proxy, it supplies a 20-byte au- connections [11]. The servers that host static content for
thentication token in a login message. The database OKWS, however, can enable HTTP keep-alive as usual.
proxy then grants the Web service permission to access We note that serving static and dynamic content from
a set of RPCs based on the supplied authentication token. different machines is already a common technique for
To facilitate development of OKWS database prox- performance reasons; administrators choose different
ies, we wrapped MySQL’s standard C library in an in- hardware and software configurations for the two types
terface more suitable for use with SFS’s libraries. We of workloads. Moreover, static content service does not
model our MySQL interface after the popular Perl DBI require access to sensitive site data and can therefore hap-
interface [24] and likewise transparently support both pen outside of a firewalled cluster, or perhaps at a differ-
parsed and prepared SQL styles. Figure 4 shows a simple ent hosting facility altogether. Indeed, some sites push
database proxy built with this library. static content out to external distribution networks such
as Akamai [2].
5.3 Real-World Experience In our commercial deployment, we host a cluster of
OKWS and database machines at a local colocation facil-
The author and two other programmers built a commer- ity; we require hands-on hardware access and a network
cial Web site using the OKWS system in six months [22]. configured for our application. We serve static content
We were assisted by two designers who knew little C++ from leased, dedicated servers at a remote facility where
but made effective use of the HTML templating system. bandwidth is significantly cheaper.
struct user_xdr_t {
systems alone can guarantee. For instance, on PHP
string name<30>;
int age; systems, a particular service might only have SELECT
}; permissions to a database’s USERS table. But with
control of the PHP server, an attacker could still issue
// can only occur at initialization time
q = mysql->prepare (
commands like SELECT * FROM USERS. With OKWS,
"SELECT age,name FROM tab WHERE id=?"); if the RPC protocol restricts access to row-wise queries
and the keyspace of the table is sparse, the attacker has
id = 1; // get ID from client significantly more difficulty “mining” the database.1
user_xdr_t u;
stmt = q->execute (id); // might block! OKWS’s separation of code and privileges further lim-
stmt->fetch (&u.age, &u.name); its attacks. If a particular service is compromised, it can
reply (u); establish a new connection to a remote RPC database
Figure 4: Example of database proxy code with MySQL wrap-
proxy; however, because the service has no access to
per library. In this case, the Web developer is loading SQL source code, binaries, or ptraces of other services, it
results directly into an RPC XDR structure. knows no authentication tokens aside from its own.
Finally, OKWS database libraries provide runtime
checks to ensure that SQL queries can be prepared only
6 Security Discussion when a proxy starts up, and that all parameters passed to
queries are appropriately escaped. This check insulates
In this section we discuss OKWS’s security benefits and sloppy programmers from the “SQL injection” attacks
shortcomings. mentioned in Section 2.2. We expect future versions of
OKWS to enforce the same invariants at compile time.
6.1 Security Benefits
(4) Process Isolation and Privilege Separation. OKWS
(1) The Local Filesystem. An OKWS service has almost is careful to separate the traditionally “buggy” aspects of
no access to the file system when execution reaches Web servers from the most sensitive areas of the system.
custom code. If compromised, a service has write access In particular, those processes that do the majority of
to its coredump directory and can read from OKWS HTTP parsing (the OKWS services) have the fewest
shared libraries. Otherwise, it cannot access setuid privileges. By the same logic, okld, which runs as
executables, the binaries of other OKWS services, or superuser, does no message parsing; it responds only
core dumps left behind by crashed OKWS processes. It to signals. For the other helper processes, we believe
cannot overwrite HTTP logs or HTML templates. Other the RPC communication channels to be less error-prone
OKWS services such as oklogd and pubd have more than standard HTTP messaging and unlikely to allow
privileges, enabling them to write to and read from the intruders to traverse process boundaries.
file system, respectively. However, as OKWS matures, Process isolation also limits the scope of those DoS
these helpers should not present security risks since they attacks that exploit bugs in site-specific logic. Since
do not run site-specific code. the operating system sets per-process limits on resources
such as file descriptors and memory, DoS vulnerabilities
(2) Other Operating System Privileges. Because should not spread across process boundaries. We could
OKWS runs logically separate processes under different make stronger DoS guarantees by adapting “defensive
user IDs, compromised processes (with the exception programming” techniques [26]. Qie et al. suggest com-
of okld) do not have the ability to kill or ptrace other piling rate-control mechanisms into network services, for
running processes. Similarly, no process save for okld dynamic prevention of DoS attacks. Their system is
can bind to privileged ports. applicable within OKWS’s architecture, which relegates
each service to a single address space. The same cannot
(3) Database Access. As described, all database be said for those systems that spread equivalent function-
access in OKWS is achieved through RPC channels, ality across multiple address spaces.
using independent authentication mechanisms. As a
result, an attacker who gains control of an OKWS web
service can only interact with the database in a manner 6.2 Security Shortcomings
specified by the RPC protocol declaration; he does
not have generic SQL client access. Note that this is The current implementation of OKWS supports only
a stronger restriction than simple database permission C++ for service development. OKWS programmers
<html><head><title>Test Result</title></head>
that better models serving dynamic content in real-world
<body>
<? deployments, which we call the null service benchmark.
$db = mysql_pconnect("okdb.lcs.mit.edu"); For each of the platforms tested, we implemented a null
mysql_select_db("testdb", $db); service, which takes an integer input from a client, makes
$id = $HTTP_GET_VARS["id"];
$qry = "SELECT x,y FROM tab WHERE x=$id";
a database SELECT on the basis of that input, and returns
$result = mysql_query("$qry", $db); the result in a short HTML response (see Figure 5). Test
$myrow = mysql_fetch_row($result); clients make one request per connection: they connect to
print("QRY $id $myrow[0] $myrow[1]\n"); the server, supply a randomly chosen query, receive the
?>
</body>
server’s response, and then disconnect.
</html>
Figure 5: PHP version of the null service 7.2 Experimental Setup
All Web servers tested use a large database table filled
should use the provided “safe” strings classes when gen- with sequential integer keys and their 20-byte SHA-1
erating HTML output, and they should use only auto- hashes [12]. We constrained our client to query only the
generated RPC stubs for network communication; how- first 1,000,000 rows of this table, so that the database
ever, OKWS does not prohibit programmers from us- could store the entire dataset in memory. Our database
ing unsafe programming techniques and can therefore was MySQL version 4.0.16.
be made more susceptible to buffer overruns and stack- All experiments used four FreeBSD 4.8 machines. The
smashing attacks. Future versions of OKWS might make Web server and database machines were uniprocessor
these attacks less likely by supporting higher-level pro- 2.4GHz and 2.6GHz Pentium 4s respectively, each with
gramming languages such as Python or Perl. 1GB of RAM. Our two client machines ran Dual 3.0GHz
Another shortcoming of OKWS is that an adversary Pentium 4s with 2GB of RAM. All machines were con-
who compromises an OKWS service can gain access to nected via fast Ethernet, and there was no network con-
in-memory state belonging to other users. Developers gestion during our experiments. Ping times between the
might protect against this attack by encrypting cache en- clients and the Web server measured around 250 µs, and
tries with a private key stored in an HTTP cookie on the ping times between the Web server and database machine
client’s machine. Encryption cannot protect against an measured about 150 µs.
adversary who can compromise and passively monitor a We implemented our test client using the OKWS li-
Web server. braries and the SFS toolkit. There was no resource strain
Finally, independent aspects of the system might be on the client machines during our tests.
vulnerable due to a common bug in the core libraries.
7.3 OKWS Process Pool Tests
7 Performance Evaluation
We experimentally validated OKWS’s frugal process
In designing OKWS we decided to limit its process pool allocation strategy by showing that the alternative—
to a small and fixed size. In our evaluation, we tested running many processes per service—performs worse.
the hypothesis that this decision has a positive impact We thus configured OKWS to run a single service as a
on performance, examining OKWS’s performance as a variable number of processes, and collected throughput
function of the number of active service processes. We measurements (in requests per second) over the different
also present and test the claim that OKWS can achieve configurations. The test client was configured to simu-
high throughputs relative to other Web servers because late either 500, 1,000 or 2,000 concurrent remote clients
of its smaller process pool and its specialization for dy- in the different runs of the experiment.
namic content. Figure 6 summarizes the results of this experiment as
the number of processes varied between 1 and 450. We
7.1 Testing Methodology attribute the general decline in performance to increased
context-switching, as shown in Figure 7. In the single-
Performance testing on Web servers usually involves the process configuration, the operating system must switch
SPECweb99 benchmark [31], but this benchmark is not between the null service and okd, the demultiplexing dae-
well-suited for dynamic Web servers that disable Keep- mon. In this configuration, higher client concurrency im-
Alive connections and redirect to other machines for plies fewer switches, since both okd and the null service
static content. We therefore devised a simple benchmark have more outstanding requests to service before calling
10000
2500
2300 8000
2200 7000
2100 6000
2000 5000
1900 500 clients 500 clients
1000 clients 4000 1000 clients
1800 2000 clients 2000 clients
3000
1 10 100 1 10 100
number of processes (log scale) number of processes (log scale)
Figure 6: Throughputs achieved in the process pool test Figure 7: Context switching in the process pool test
3500 Haboob
sleep. This effect quickly disappears as the server dis- Flash
3000 Apache+PHP
tributes requests over more processes. As their numbers OKWS
percentile
0.6
context switches about 7500 times a second. We suspect
that Apache starts queuing requests unfairly above 1,000
0.4
concurrent connections, as suggested by the plateau in
Figure 9 and the long tail in Figure 10. Haboob
0.2 Flash
In our configuration, PHP makes frequent calls to the Apache+PHP
sigprocmask system call to serialize database accesses OKWS
among kernel threads within a process. In addition, 0
0.1 1 10 100
Apache makes frequent (and unnecessary) file system ac- latency in seconds (log scale)
cesses, which though serviced from the buffer cache still Figure 10: Client latencies for 1,600 concurrent clients
entail system call overhead. OKWS can achieve faster
performance because of a smaller process pool and fewer
system calls. by 23%. We observed that for this workload, Flash re-
quires even more service processes, and at times over
2,500 were running. When we switched from the single-
7.4.2 Many-Service Workload
service to the many-service configuration, the number of
In attempt to model a more realistic workload, we inves- OKWS service processes increased from 1 to 10. The
tigated Web servers running more services, serving more results from Figure 6 show this change has little im-
data, as experienced by clients over the WAN. We modi- pact on throughput. We can better explain OKWS’s di-
fied our null services to send out an additional 3000 bytes minished performance by arguing that larger HTTP re-
of text with every reply (larger responses would have sat- sponses result in more data shuffling in user mode and
urated the Web server’s access link in some cases). We more pressure on the networking stack in kernel mode.
made 10 uniquely-named copies of the new null service, The same explanation applies for Apache, which experi-
convincing the Web servers that they were serving 10 dis- enced a similar performance degradation.
tinct services. Finally, our clients were modified to pause
an average of 75 ms between establishing a connection 8 Related work
and sending an HTTP request. We ran the experiment
from 200 to 2000 simultaneous clients, and observed a Apache’s [3] many configuration options and modules al-
graph similar in shape to Figure 8. low Web programmers to extend its functionality with
Achieved throughputs are shown in Table 2 and are a variety of different programming languages. How-
compared to the results observed in the single-service ever, neither 1.3.x’s multi-process architecture nor 2.0.x’s
workload. Haboob’s performance degrades most notably, multi-threaded architecture is conducive to process isola-
probably because the many-service workload demands tion. Also, its extensibility and mushrooming code base
more memory allocations. Flash’s throughput decreases make its security properties difficult to reason about.
Haboob Apache Flash OKWS opers to write Web services in C++ and uses some of the
1 Service 490 895 1,590 2,401 same sandboxing schemes we use here to achieve fault
10 Services 225 760 1,232 2,089 isolation. In more commercial settings, Java-based sys-
Change −54.0% −15.1% −22.5% −13.0% tems often favor thin Web servers, pushing more critical
tasks to application servers such as JBoss [15] and IBM
Table 2: Average throughputs in connections per second WebSphere [14]. Such systems limit a Web server’s ac-
cess to underlying databases in much the same way as
OKWS’s database proxies. Most Java systems, however,
Highly-optimized event-based Web servers such as
package all aspects of a system in one address space with
Flash [23] and Zeus [47] have eclipsed Apache in terms
many threads; our model for isolation would not extend
of performance. While Flash in particular has a history of
to such a setting. Furthermore, our experimental results
outstanding performance serving static content, our per-
indicate significant performance advantages of compiled
formance studies here indicate that its architecture is less
C++ code over Java systems.
suitable for dynamic content. In terms of process isola-
Other work has proposed changes to underlying oper-
tion, one could most likely implement a similar separa-
ating systems to make Web servers fast and more secure.
tion of privileges in Flash as we have done with OKWS.
The Exokernel operating system [16] allows its Cheetah
FastCGI [10] is a standard for implementing long-lived
Web server to directly access the TCP/IP stack, in order
CGI-like helper processes. It allows separation of func-
to reduce buffer copies allow for more effective caching.
tionality along process boundaries but neither articulates
The Denali isolation kernel [45] can isolate Web services
a specific security policy nor specifies the mechanics for
by running them on separate virtual machines.
maintaining process isolation in the face of partial server
compromise. Also, FastCGI requires the leader process
to relay messages between the Web service and the re- 9 Summary and Future Work
mote client. OKWS passes file descriptors to avoid the
overhead associated with FastCGI’s relay technique. OKWS is a toolkit for serving dynamic Web content, and
The Haboob server studied here is one of many possi- its architecture fits naturally into a compelling security
ble applications built on SEDA, an architecture for event- model. The system’s separation of processes provides
based network servers. In particular, SEDA uses serial reasonable assurances that vulnerabilities in one aspect
event queues to enforce fairness and graceful degrada- of the system do not metastasize. The performance re-
tion under heavy load. Larger systems such as Ninja [33] sults we have seen are encouraging: OKWS derives sig-
build on SEDA’s infrastructure to create clusters of Web nificant speedups from a small and fixed process pool,
servers with the same appealing properties. lightweight synchronization mechanisms, and avoidance
Other work has used the SFS toolkit to build static of unnecessary system calls. In the future, we plan to
Web Servers and Web proxies [46]. Though the current experiment with high-level language support and better
OKWS architecture is well-suited for SMP machines, the resilience to DoS attacks. Independent of future improve-
adoption of libasync-mp would allow for finer-grained ments, OKWS is stable and practical, and we have used
sharing of a Web workload across many CPUs. it to develop a popular commercial product.
OKWS uses events but the same results are possible
with an appropriate threads library. An expansive body Acknowledgments
of literature argues the merits of one scheme over the
other, and most recently, Capriccio’s authors [34] argue I am indebted to David Mazières for his help through-
that threads can achieve the same performance as events out the project, and to my advisor Frans Kaashoek for
in the context of Web servers, while providing program- help in preparing this paper. Michael Walfish signif-
mers with a more intuitive interface. Other recent work icantly improved this paper’s writing and presentation.
suggests that threads and events can coexist [1]. Such My shepherd Eddie Kohler suggested many important
techniques, if applied to OKWS, would simplify stack improvements, Robert Morris and Russ Cox assisted in
management for Web developers. debugging, and the anonymous reviewers provided in-
In addition to the PHP [25] scripting language investi- sightful comments. I thank the programmers, design-
gated here, many other Web development environments ers and others at OkCupid.com—Patrick Crosby, Jason
are in widespread use. Zope [48], a Python-based plat- Yung, Chris Coyne, Christian Rudder and Sam Yagan—
form, has gained popularity due to its modularity and for adopting and improving OKWS, and Jeremy Stribling
support for remote collaboration. CSE [13] allows devel- and Sarah Friedberg for proofreading. This research was
supported in part by the DARPA Composable High As- [25] PHP: Hypertext processor. http://www.php.net.
surance Trusted Systems program (BAA #01-24), under [26] X. Qie, R. Pang, and L. Peterson. Defensive programming:
Using an annotation toolkit to build DoS-resistant software. In
contract #N66001-01-1-8927. 5th Symposium on Operating Systems Design and
Implementation (OSDI ’02), Boston, MA, October 2002.
USENIX.
Availability [27] J. H. Saltzer and M. D. Schroeder. The protection of information
in computer systems. In Proceedings of the IEEE, volume 63,
OKWS is available under an open source license at 1975.
www.okws.org. [28] SecurityFocus. http://www.securityfocus.com.
[29] Sleepycat Software. http://www.sleepycat.com.
[30] The SparkMatch service. Previously available at
References http://www.thespark.com.
[1] A. Adya, J. Howell, M. Theimer, W. J. Bolosky, and J. R. [31] Standard performance evaluation corporation. the specweb99
Douceur. Cooperative task management without manual stack benchmark. http://www.spec99.org/osg/web99/.
management or, event-driven programming is not the opposite of [32] R. Srinivasan. RPC: Remote procedure call protocol
threaded programming. In Proceedings of the 2002 USENIX, specification version 2. RFC 1831, Network Working Group,
Monterey, CA, June 2002. USENIX. August 1995.
[2] Akamai Technologies, Inc. http://www.akamai.com. [33] J. R. van Berhen, E. A. Brewer, N. Borisova, M. C.
[3] The Apache Software Foundation. http://www.apache.org. an Matt Welsh, J. MacDonald, J. Lau, S. Gribble, and D. Culler.
[4] Apache Tutorial: Introduction to Server Side Includes. Ninja: A framework for network services. In Proceedings of the
http://httpd.apache.org/docs/howto/ssi.html. 2002 USENIX, Monterey, CA, June 2002. USENIX.
[5] Bugtraq ID 4606. SecurityFocus. [34] R. von Behren, J. Condit, F. Zhou, G. C. Necula, and E. Brewer.
http://www.securityfocus.com/bid/4606/info/. Capriccio: scalable threads for internet services. In Proceedings
[6] Bugtraq ID 5993. SecurityFocus. of the 19th ACM Symposium on Operating Systems Principles,
http://www.securityfocus.com/bid/5993/info/. Bolton Landing, NY, October 2003. ACM.
[7] Bugtraq ID 7255. SecurityFocus. [35] Vulnerability CAN-2001-1246. SecurityFocus.
http://www.securityfocus.com/bid/7255/info/. http://www.securityfocus.com/bid/2954/info/.
[8] Bugtraq ID 8138. SecurityFocus. [36] Vulnerability CAN-2002-0656. SecurityFocus.
http://www.securityfocus.com/bid/8138/info/. http://www.securityfocus.com/bid/5363/info/.
[9] CERT
R Coordination Center. http://www.cert.org. [37] Vulnerability CAN-2003-0132. SecurityFocus.
[10] Open Market. Fastcgi. http://www.fastcgi.com. http://www.securityfocus.com/bid/7254/info/.
[11] R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, [38] Vulnerability CAN-2003-0253.
P. Leach, and T. Berners-Lee. Hypertext Transfer Protocol — http://www.securityfocus.com/bid/8137/info/.
HTTP/1.1. Internet Network Working Group RFC 2616, 1999. [39] Vulnerability CAN-2003-0542. SecurityFocus.
[12] FIPS 180-1. Secure Hash Standard. U.S. Department of http://www.securityfocus.com/bid/8911/info/.
Commerce/N.I.S.T., National Technical Information Service, [40] Vulnerability CVE-2002-0061. SecurityFocus.
Springfield, VA, April 1995. http://www.securityfocus.com/bid/4435/info/.
[13] T. Gchwind and B. A. Schmit. CSE — a C++ servlet [41] Vulnerability Note VU117243. CERT.
environment for high-performance web applications. In http://www.kb.cert.org/vuls/id/910713.
Proceedings of the FREENIX Track: 2003 USENIX Technical [42] Vulnerability Note VU91073. CERT.
Conference, San Antonio, TX, 2003. USENIX. http://www.kb.cert.org/vuls/id/910713.
[14] IBM corporation. IBM websphere application server. [43] Vulnerability Note VU979793. CERT.
http://www.ibm.com. http://www.kb.cert.org/vuls/id/979793.
[15] JBoss Group. http://www.jboss.org. [44] M. Welsh, D. Culler, and E. Brewer. SEDA: An architecture for
[16] M. F. Kaashoek, D. R. Engler, G. R. Ganger, H. M. Briceño, well-conditioned, scalable internet services. In Proceedings of
R. Hunt, D. Mazières, T. Pinckney, R. Grimm, J. Jannotti, and the 18th ACM Symposium on Operating Systems Principles,
K. Mackenzie. Application performance and flexibility on Chateau Lake Louise, Banff, Canada, October 2001. ACM.
exokernel systems. In Proceedings of the 16th ACM Symposium [45] A. Whitaker, M. Shaw, and S. D. Gribble. Scale and
on Operating Systems Principles, Saint-Malo, France, October performance in the denali isolation kernel. In 5th Symposium on
1997. ACM. Operating Systems Design and Implementation (OSDI ’02),
[17] S. T. King and P. M. Chen. Backtracking intrusions. In Boston, MA, October 2002. USENIX.
Proceedings of the 19th ACM Symposium on Operating Systems [46] N. Zeldovich, A. Yip, F. Dabek, R. Morris, D. Mazières, and
Principles, Bolton Landing, NY, October 2003. ACM. F. Kaashoek. Multiprocessor support for event-driven programs.
[18] D. Mazières. A toolkit for user-level file systems. In In Proceedings of the 2003 USENIX, San Antonio, TX, June
Proceedings of the 2001 USENIX. USENIX, June 2001. 2003. USENIX.
[19] Microsoft Corporation. IIS. http://www.microsoft.com/ [47] Zeus Technology Limited. Zeus Web Server.
windowsserver2003/iis/default.mspx. http://www.zeus.co.uk.
[20] mod perl. http://perl.apache.org. [48] The Zope Corporation. http://www.zope.org.
[21] MySQL. http://www.mysql.com.
[22] OkCupid.com. http://www.okcupid.com. Notes
[23] V. S. Pai, P. Druschel, and W. Zwaenepoel. Flash: An efficient
and portable Web server. In Proceedings of the 1999 USENIX, 1 Similar security properties are possible with a standard Web server
Monterey, CA, June 1999. USENIX. and a database that supports stored procedures, views, and roles.
[24] Perl DBI. http://dbi.perl.org.