upload http
[bottlenecks.git] / rubbos / app / httpd-2.0.64 / docs / manual / mod / mod_unique_id.html.en
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
4         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
5               This file is generated from xml source: DO NOT EDIT
6         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7       -->
8 <title>mod_unique_id - Apache HTTP Server</title>
9 <link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
10 <link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
11 <link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
12 <link href="../images/favicon.ico" rel="shortcut icon" /></head>
13 <body>
14 <div id="page-header">
15 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
16 <p class="apache">Apache HTTP Server Version 2.0</p>
17 <img alt="" src="../images/feather.gif" /></div>
18 <div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
19 <div id="path">
20 <a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.0</a> &gt; <a href="./">Modules</a></div>
21 <div id="page-content">
22 <div id="preamble"><h1>Apache Module mod_unique_id</h1>
23 <div class="toplang">
24 <p><span>Available Languages: </span><a href="../en/mod/mod_unique_id.html" title="English">&nbsp;en&nbsp;</a> |
25 <a href="../ja/mod/mod_unique_id.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
26 <a href="../ko/mod/mod_unique_id.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
27 </div>
28 <table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Provides an environment variable with a unique
29 identifier for each request</td></tr>
30 <tr><th><a href="module-dict.html#Status">Status:</a></th><td>Extension</td></tr>
31 <tr><th><a href="module-dict.html#ModuleIdentifier">Module Identifier:</a></th><td>unique_id_module</td></tr>
32 <tr><th><a href="module-dict.html#SourceFile">Source File:</a></th><td>mod_unique_id.c</td></tr></table>
33 <h3>Summary</h3>
34
35
36     <p>This module provides a magic token for each request which is
37     guaranteed to be unique across "all" requests under very
38     specific conditions. The unique identifier is even unique
39     across multiple machines in a properly configured cluster of
40     machines. The environment variable <code>UNIQUE_ID</code> is
41     set to the identifier for each request. Unique identifiers are
42     useful for various reasons which are beyond the scope of this
43     document.</p>
44 </div>
45 <div id="quickview"><h3 class="directives">Directives</h3>
46 <p>This module provides no directives.</p>
47 <h3>Topics</h3>
48 <ul id="topics">
49 <li><img alt="" src="../images/down.gif" /> <a href="#theory">Theory</a></li>
50 </ul></div>
51 <div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
52 <div class="section">
53 <h2><a name="theory" id="theory">Theory</a></h2>
54     
55
56     <p>First a brief recap of how the Apache server works on Unix
57     machines. This feature currently isn't supported on Windows NT.
58     On Unix machines, Apache creates several children, the children
59     process requests one at a time. Each child can serve multiple
60     requests in its lifetime. For the purpose of this discussion,
61     the children don't share any data with each other. We'll refer
62     to the children as <dfn>httpd processes</dfn>.</p>
63
64     <p>Your website has one or more machines under your
65     administrative control, together we'll call them a cluster of
66     machines. Each machine can possibly run multiple instances of
67     Apache. All of these collectively are considered "the
68     universe", and with certain assumptions we'll show that in this
69     universe we can generate unique identifiers for each request,
70     without extensive communication between machines in the
71     cluster.</p>
72
73     <p>The machines in your cluster should satisfy these
74     requirements. (Even if you have only one machine you should
75     synchronize its clock with NTP.)</p>
76
77     <ul>
78       <li>The machines' times are synchronized via NTP or other
79       network time protocol.</li>
80
81       <li>The machines' hostnames all differ, such that the module
82       can do a hostname lookup on the hostname and receive a
83       different IP address for each machine in the cluster.</li>
84     </ul>
85
86     <p>As far as operating system assumptions go, we assume that
87     pids (process ids) fit in 32-bits. If the operating system uses
88     more than 32-bits for a pid, the fix is trivial but must be
89     performed in the code.</p>
90
91     <p>Given those assumptions, at a single point in time we can
92     identify any httpd process on any machine in the cluster from
93     all other httpd processes. The machine's IP address and the pid
94     of the httpd process are sufficient to do this. So in order to
95     generate unique identifiers for requests we need only
96     distinguish between different points in time.</p>
97
98     <p>To distinguish time we will use a Unix timestamp (seconds
99     since January 1, 1970 UTC), and a 16-bit counter. The timestamp
100     has only one second granularity, so the counter is used to
101     represent up to 65536 values during a single second. The
102     quadruple <em>( ip_addr, pid, time_stamp, counter )</em> is
103     sufficient to enumerate 65536 requests per second per httpd
104     process. There are issues however with pid reuse over time, and
105     the counter is used to alleviate this issue.</p>
106
107     <p>When an httpd child is created, the counter is initialized
108     with ( current microseconds divided by 10 ) modulo 65536 (this
109     formula was chosen to eliminate some variance problems with the
110     low order bits of the microsecond timers on some systems). When
111     a unique identifier is generated, the time stamp used is the
112     time the request arrived at the web server. The counter is
113     incremented every time an identifier is generated (and allowed
114     to roll over).</p>
115
116     <p>The kernel generates a pid for each process as it forks the
117     process, and pids are allowed to roll over (they're 16-bits on
118     many Unixes, but newer systems have expanded to 32-bits). So
119     over time the same pid will be reused. However unless it is
120     reused within the same second, it does not destroy the
121     uniqueness of our quadruple. That is, we assume the system does
122     not spawn 65536 processes in a one second interval (it may even
123     be 32768 processes on some Unixes, but even this isn't likely
124     to happen).</p>
125
126     <p>Suppose that time repeats itself for some reason. That is,
127     suppose that the system's clock is screwed up and it revisits a
128     past time (or it is too far forward, is reset correctly, and
129     then revisits the future time). In this case we can easily show
130     that we can get pid and time stamp reuse. The choice of
131     initializer for the counter is intended to help defeat this.
132     Note that we really want a random number to initialize the
133     counter, but there aren't any readily available numbers on most
134     systems (<em>i.e.</em>, you can't use rand() because you need
135     to seed the generator, and can't seed it with the time because
136     time, at least at one second resolution, has repeated itself).
137     This is not a perfect defense.</p>
138
139     <p>How good a defense is it? Suppose that one of your machines
140     serves at most 500 requests per second (which is a very
141     reasonable upper bound at this writing, because systems
142     generally do more than just shovel out static files). To do
143     that it will require a number of children which depends on how
144     many concurrent clients you have. But we'll be pessimistic and
145     suppose that a single child is able to serve 500 requests per
146     second. There are 1000 possible starting counter values such
147     that two sequences of 500 requests overlap. So there is a 1.5%
148     chance that if time (at one second resolution) repeats itself
149     this child will repeat a counter value, and uniqueness will be
150     broken. This was a very pessimistic example, and with real
151     world values it's even less likely to occur. If your system is
152     such that it's still likely to occur, then perhaps you should
153     make the counter 32 bits (by editing the code).</p>
154
155     <p>You may be concerned about the clock being "set back" during
156     summer daylight savings. However this isn't an issue because
157     the times used here are UTC, which "always" go forward. Note
158     that x86 based Unixes may need proper configuration for this to
159     be true -- they should be configured to assume that the
160     motherboard clock is on UTC and compensate appropriately. But
161     even still, if you're running NTP then your UTC time will be
162     correct very shortly after reboot.</p>
163
164     <p>The <code>UNIQUE_ID</code> environment variable is
165     constructed by encoding the 112-bit (32-bit IP address, 32 bit
166     pid, 32 bit time stamp, 16 bit counter) quadruple using the
167     alphabet <code>[A-Za-z0-9@-]</code> in a manner similar to MIME
168     base64 encoding, producing 19 characters. The MIME base64
169     alphabet is actually <code>[A-Za-z0-9+/]</code> however
170     <code>+</code> and <code>/</code> need to be specially encoded
171     in URLs, which makes them less desirable. All values are
172     encoded in network byte ordering so that the encoding is
173     comparable across architectures of different byte ordering. The
174     actual ordering of the encoding is: time stamp, IP address,
175     pid, counter. This ordering has a purpose, but it should be
176     emphasized that applications should not dissect the encoding.
177     Applications should treat the entire encoded
178     <code>UNIQUE_ID</code> as an opaque token, which can be
179     compared against other <code>UNIQUE_ID</code>s for equality
180     only.</p>
181
182     <p>The ordering was chosen such that it's possible to change
183     the encoding in the future without worrying about collision
184     with an existing database of <code>UNIQUE_ID</code>s. The new
185     encodings should also keep the time stamp as the first element,
186     and can otherwise use the same alphabet and bit length. Since
187     the time stamps are essentially an increasing sequence, it's
188     sufficient to have a <em>flag second</em> in which all machines
189     in the cluster stop serving and request, and stop using the old
190     encoding format. Afterwards they can resume requests and begin
191     issuing the new encodings.</p>
192
193     <p>This we believe is a relatively portable solution to this
194     problem. It can be extended to multithreaded systems like
195     Windows NT, and can grow with future needs. The identifiers
196     generated have essentially an infinite life-time because future
197     identifiers can be made longer as required. Essentially no
198     communication is required between machines in the cluster (only
199     NTP synchronization is required, which is low overhead), and no
200     communication between httpd processes is required (the
201     communication is implicit in the pid value assigned by the
202     kernel). In very specific situations the identifier can be
203     shortened, but more information needs to be assumed (for
204     example the 32-bit IP address is overkill for any site, but
205     there is no portable shorter replacement for it). </p>
206 </div>
207 </div>
208 <div class="bottomlang">
209 <p><span>Available Languages: </span><a href="../en/mod/mod_unique_id.html" title="English">&nbsp;en&nbsp;</a> |
210 <a href="../ja/mod/mod_unique_id.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
211 <a href="../ko/mod/mod_unique_id.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
212 </div><div id="footer">
213 <p class="apache">Copyright 2009 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
214 <p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div>
215 </body></html>