~piotr-sikora/libmemcached/fix-tests-on-openbsd

« back to all changes in this revision

Viewing changes to docs/man/memaslap.1

Merge in all of build.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
.TH "MEMASLAP" "1" "April 09, 2011" "0.47" "libmemcached"
 
2
.SH NAME
 
3
memaslap \- libmemcached Documentation
 
4
.
 
5
.nr rst2man-indent-level 0
 
6
.
 
7
.de1 rstReportMargin
 
8
\\$1 \\n[an-margin]
 
9
level \\n[rst2man-indent-level]
 
10
level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
 
11
-
 
12
\\n[rst2man-indent0]
 
13
\\n[rst2man-indent1]
 
14
\\n[rst2man-indent2]
 
15
..
 
16
.de1 INDENT
 
17
.\" .rstReportMargin pre:
 
18
. RS \\$1
 
19
. nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin]
 
20
. nr rst2man-indent-level +1
 
21
.\" .rstReportMargin post:
 
22
..
 
23
.de UNINDENT
 
24
. RE
 
25
.\" indent \\n[an-margin]
 
26
.\" old: \\n[rst2man-indent\\n[rst2man-indent-level]]
 
27
.nr rst2man-indent-level -1
 
28
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 
29
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 
30
..
 
31
.\" Man page generated from reStructeredText.
 
32
.
 
33
.SH SYNOPSIS
 
34
.INDENT 0.0
 
35
.TP
 
36
.B \-\-help
 
37
.UNINDENT
 
38
.SH DESCRIPTION
 
39
.sp
 
40
\fBmemaslap\fP is a load generation and benchmark tool for memcached(1)
 
41
servers. It generates configurable workload such as threads, concurrencies, connections,
 
42
run time, overwrite, miss rate, key size, value size, get/set proportion,
 
43
expected throughput, and so on. Furthermore, it also testss data
 
44
verification, expire\-time verification, UDP, binary protocol, facebook test,
 
45
replication test, multi\-get and reconnection, etc.
 
46
.sp
 
47
Memslap manages network connections like memcached with
 
48
libevent. Each thread of memaslap is bound with a CPU core, all
 
49
the threads don\(aqt communicate with each other, and there are several socket
 
50
connections in each thread. Each connection keeps key size distribution,
 
51
value size distribution, and command distribution by itself.
 
52
.sp
 
53
You can specify servers via the \fB\-\-servers\fP option or via the
 
54
environment variable \fBMEMCACHED_SERVERS\fP.
 
55
.SH FEATURES
 
56
.sp
 
57
Memslap is developed to for the following purposes:
 
58
.sp
 
59
Manages network connections with libevent asynchronously.
 
60
.sp
 
61
Set both TCP and UDP up to use non\-blocking IO.
 
62
.sp
 
63
Improves parallelism: higher performance in multi\-threads environments.
 
64
.sp
 
65
Improves time efficiency: faster processing speed.
 
66
.sp
 
67
Generates key and value more efficiently; key size distribution and value size distribution are configurable.
 
68
.sp
 
69
Supports get, multi\-get, and set commands; command distribution is configurable.
 
70
.sp
 
71
Supports controllable miss rate and overwrite rate.
 
72
.sp
 
73
Supports data and expire\-time verification.
 
74
.sp
 
75
Supports dumping statistic information periodically.
 
76
.sp
 
77
Supports thousands of TCP connections.
 
78
.sp
 
79
Supports binary protocol.
 
80
.sp
 
81
Supports facebook test (set with TCP and multi\-get with UDP) and replication test.
 
82
.SH DETAILS
 
83
.SS Effective implementation of network.
 
84
.sp
 
85
For memaslap, both TCP and UDP use non\-blocking network IO. All
 
86
the network events are managed by libevent as memcached. The network module
 
87
of memaslap is similar to memcached. Libevent can ensure
 
88
memaslap can handle network very efficiently.
 
89
.SS Effective implementation of multi\-threads and concurrency
 
90
.sp
 
91
Memslap has the similar implementation of multi\-threads to
 
92
memcached. Memslap creates one or more self\-governed threads;
 
93
each thread is bound with one CPU core if the system testss setting CPU
 
94
core affinity.
 
95
.sp
 
96
In addition, each thread has a libevent to manage the events of the network;
 
97
each thread has one or more self\-governed concurrencies; and each
 
98
concurrency has one or more socket connections. All the concurrencies don’t
 
99
communicate with each other even though they are in the same thread.
 
100
.sp
 
101
Memslap can create thousands of socket connections, and each
 
102
concurrency has tens of socket connections. Each concurrency randomly or
 
103
sequentially selects one socket connection from its socket connection pool
 
104
to run, so memaslap can ensure each concurrency handles one
 
105
socket connection at any given time. Users can specify the number of
 
106
concurrency and socket connections of each concurrency according to their
 
107
expected workload.
 
108
.SS Effective implementation of generating key and value
 
109
.sp
 
110
In order to improve time efficiency and space efficiency,
 
111
memaslap creates a random characters table with 10M characters. All the
 
112
suffixes of keys and values are generated from this random characters table.
 
113
.sp
 
114
Memslap uses the offset in the character table and the length
 
115
of the string to identify a string. It can save much memory.
 
116
Each key contains two parts, a prefix and a suffix. The prefix is an
 
117
uint64_t, 8 bytes. In order to verify the data set before,
 
118
memaslap need to ensure each key is unique, so it uses the prefix to identify
 
119
a key. The prefix cannot include illegal characters, such as ‘r’, ‘n’,
 
120
‘0’ and ‘ ‘. And memaslap has an algorithm to ensure that.
 
121
.sp
 
122
Memslap doesn’t generate all the objects (key\-value pairs) at
 
123
the beginning. It only generates enough objects to fill the task window
 
124
(default 10K objects) of each concurrency. Each object has the following
 
125
basic information, key prefix, key suffix offset in the character table, key
 
126
length, value offset in the character table, and value length.
 
127
.sp
 
128
In the work process, each concurrency sequentially or randomly selects an
 
129
object from the window to do set operation or get operation. At the same
 
130
time, each concurrency kicks objects out of its window and adds new object
 
131
into it.
 
132
.SS Simple but useful task scheduling
 
133
.sp
 
134
Memslap uses libevent to schedule all the concurrencies of
 
135
threads, and each concurrency schedules tasks based on the local task
 
136
window. Memslap assumes that if each concurrency keeps the same
 
137
key distribution, value distribution and commands distribution, from
 
138
outside, memaslap keeps all the distribution as a whole.
 
139
Each task window includes a lot of objects, each object stores its basic
 
140
information, such as key, value, expire time, and so on. At any time, all
 
141
the objects in the window keep the same and fixed key and value
 
142
distribution. If an object is overwritten, the value of the object will be
 
143
updated. Memslap verifies the data or expire\-time according to
 
144
the object information stored in the task window.
 
145
.sp
 
146
Libevent selects which concurrency to handle based on a specific network
 
147
event. Then the concurrency selects which command (get or set) to operate
 
148
based on the command distribution. If it needs to kick out an old object and
 
149
add a new object, in order to keep the same key and value distribution, the
 
150
new object must have the same key length and value length.
 
151
.sp
 
152
If memcached server has two cache layers (memory and SSD), running
 
153
memaslap with different window sizes can get different cache
 
154
miss rates. If memaslap adds enough objects into the windows at
 
155
the beginning, and the cache of memcached cannot store all the objects
 
156
initialized, then memaslap will get some objects from the second
 
157
cache layer. It causes the first cache layer to miss. So the user can
 
158
specify the window size to get the expected miss rate of the first cache
 
159
layer.
 
160
.SS Useful implementation of multi\-servers , UDP, TCP, multi\-get and binary protocol
 
161
.sp
 
162
Because each thread is self\-governed, memaslap can assign
 
163
different threads to handle different memcached servers. This is just one of
 
164
the ways in which memaslap testss multiple servers. The only
 
165
limitation is that the number of servers cannot be greater than the number
 
166
of threads. The other way to tests multiple servers is for replication
 
167
test. Each concurrency has one socket connection to each memcached server.
 
168
For the implementation, memaslap can set some objects to one
 
169
memcached server, and get these objects from the other servers.
 
170
.sp
 
171
By default, Memslap does single get. If the user specifies
 
172
multi\-get option, memaslap will collect enough get commands and
 
173
pack and send the commands together.
 
174
.sp
 
175
Memslap testss both the ASCII protocol and binary protocol,
 
176
but it runs on the ASCII protocol by default.
 
177
Memslap by default runs on the TCP protocol, but it also
 
178
testss UDP. Because UDP is unreliable, dropped packages and out\-of\-order
 
179
packages may occur. Memslap creates a memory buffer to handle
 
180
these problems. Memslap tries to read all the response data of
 
181
one command from the server and reorders the response data. If some packages
 
182
get lost, the waiting timeout mechanism can ensure half\-baked packages will
 
183
be discarded and the next command will be sent.
 
184
.SH USAGE
 
185
.sp
 
186
Below are some usage samples:
 
187
.sp
 
188
memaslap \-s 127.0.0.1:11211 \-S 5s
 
189
.sp
 
190
memaslap \-s 127.0.0.1:11211 \-t 2m \-v 0.2 \-e 0.05 \-b
 
191
.sp
 
192
memaslap \-s 127.0.0.1:11211 \-F config \-t 2m \-w 40k \-S 20s \-o 0.2
 
193
.sp
 
194
memaslap \-s 127.0.0.1:11211 \-F config \-t 2m \-T 4 \-c 128 \-d 20 \-P 40k
 
195
.sp
 
196
memaslap \-s 127.0.0.1:11211 \-F config \-t 2m \-d 50 \-a \-n 40
 
197
.sp
 
198
memaslap \-s 127.0.0.1:11211,127.0.0.1:11212 \-F config \-t 2m
 
199
.sp
 
200
memaslap \-s 127.0.0.1:11211,127.0.0.1:11212 \-F config \-t 2m \-p 2
 
201
.sp
 
202
The user must specify one server at least to run memaslap. The
 
203
rest of the parameters have default values, as shown below:
 
204
.sp
 
205
Thread number = 1                    Concurrency = 16
 
206
.sp
 
207
Run time = 600 seconds                Configuration file = NULL
 
208
.sp
 
209
Key size = 64                         Value size = 1024
 
210
.sp
 
211
Get/set = 9:1                         Window size = 10k
 
212
.sp
 
213
Execute number = 0                   Single get = true
 
214
.sp
 
215
Multi\-get = false                      Number of sockets of each concurrency = 1
 
216
.sp
 
217
Reconnect = false                     Data verification = false
 
218
.sp
 
219
Expire\-time verification = false           ASCII protocol = true
 
220
.sp
 
221
Binary protocol = false                 Dumping statistic information
 
222
.sp
 
223
periodically = false
 
224
.sp
 
225
Overwrite proportion = 0%             UDP = false
 
226
.sp
 
227
TCP = true                           Limit throughput = false
 
228
.sp
 
229
Facebook test = false                  Replication test = false
 
230
.SS Key size, value size and command distribution.
 
231
.sp
 
232
All the distributions are read from the configuration file specified by user
 
233
with “—cfg_cmd” option. If the user does not specify a configuration file,
 
234
memaslap will run with the default distribution (key size = 64,
 
235
value size = 1024, get/set = 9:1). For information on how to edit the
 
236
configuration file, refer to the “Configuration File” section.
 
237
.sp
 
238
The minimum key size is 16 bytes; the maximum key size is 250 bytes. The
 
239
precision of proportion is 0.001. The proportion of distribution will be
 
240
rounded to 3 decimal places.
 
241
.sp
 
242
The minimum value size is 1 bytes; the maximum value size is 1M bytes. The
 
243
precision of proportion is 0.001. The proportion of distribution will be
 
244
rounded to 3 decimal places.
 
245
Currently, memaslap only testss set and get commands. And it
 
246
testss 100% set and 100% get. For 100% get, it will preset some objects to
 
247
the server.
 
248
.SS Multi\-thread and concurrency
 
249
.sp
 
250
The high performance of memaslap benefits from the special
 
251
schedule of thread and concurrency. It’s important to specify the proper
 
252
number of them. The default number of threads is 1; the default number of
 
253
concurrency is 16. The user can use “—threads” and “\-\-concurrency” to
 
254
specify these variables.
 
255
.sp
 
256
If the system testss setting CPU affinity and the number of threads
 
257
specified by the user is greater than 1, memaslap will try to
 
258
bind each thread to a different CPU core. So if you want to get the best
 
259
performance memaslap, it is better to specify the number of
 
260
thread equal to the number of CPU cores. The number of threads specified by
 
261
the user can also be less or greater than the number of CPU cores. Because
 
262
of the limitation of implementation, the number of concurrencies could be
 
263
the multiple of the number of threads.
 
264
.INDENT 0.0
 
265
.IP 1. 3
 
266
.
 
267
For 8 CPU cores system
 
268
.UNINDENT
 
269
.sp
 
270
For example:
 
271
.sp
 
272
\-\-threads=2 \-\-concurrency=128
 
273
.sp
 
274
\-\-threads=8 \-\-concurrency=128
 
275
.sp
 
276
\-\-threads=8 \-\-concurrency=256
 
277
.sp
 
278
\-\-threads=12 \-\-concurrency=144
 
279
.INDENT 0.0
 
280
.IP 2. 3
 
281
.
 
282
For 16 CPU cores system
 
283
.UNINDENT
 
284
.sp
 
285
For example:
 
286
.sp
 
287
\-\-threads=8 \-\-concurrency=128
 
288
.sp
 
289
\-\-threads=16 \-\-concurrency=256
 
290
.sp
 
291
\-\-threads=16 \-\-concurrency=512
 
292
.sp
 
293
\-\-threads=24 \-\-concurrency=288
 
294
.sp
 
295
The memaslap performs very well, when
 
296
used to test the performance of memcached servers.
 
297
Most of the time, the bottleneck is the network or
 
298
the server. If for some reason the user wants to
 
299
limit the performance of memaslap, there
 
300
are two ways to do this:
 
301
.sp
 
302
Decrease the number of threads and concurrencies.
 
303
Use the option “\-\-tps” that memaslap
 
304
provides to limit the throughput. This option allows
 
305
the user to get the expected throughput. For
 
306
example, assume that the maximum throughput is 50
 
307
kops/s for a specific configuration, you can specify
 
308
the throughput equal to or less than the maximum
 
309
throughput using “\-\-tps” option.
 
310
.SS Window size
 
311
.sp
 
312
Most of the time, the user does not need to specify the window size. The
 
313
default window size is 10k. For Schooner Memcached, the user can specify
 
314
different window sizes to get different cache miss rates based on the test
 
315
case. Memslap testss cache miss rate between 0% and 100%.
 
316
If you use this utility to test the performance of Schooner Memcached, you
 
317
can specify a proper window size to get the expected cache miss rate. The
 
318
formula for calculating window size is as follows:
 
319
.sp
 
320
Assume that the key size is 128 bytes, and the value size is 2048 bytes, and
 
321
concurrency=128.
 
322
.sp
 
323
1. Small cache cache_size=1M, 100% cache miss (all data get from SSD).
 
324
win_size=10k
 
325
.INDENT 0.0
 
326
.IP 2. 3
 
327
.
 
328
cache_size=4G
 
329
.UNINDENT
 
330
.sp
 
331
(1). cache miss rate 0%
 
332
.sp
 
333
win_size=8k
 
334
.sp
 
335
(2). cache miss rate 5%
 
336
.sp
 
337
win_size=11k
 
338
.INDENT 0.0
 
339
.IP 3. 3
 
340
.
 
341
cache_size=16G
 
342
.UNINDENT
 
343
.sp
 
344
(1). cache miss rate 0%
 
345
.sp
 
346
win_size=32k
 
347
.sp
 
348
(2). cache miss
 
349
.sp
 
350
rate 5%
 
351
.sp
 
352
win_size=46k
 
353
.sp
 
354
The formula for calculating window size for cache miss rate 0%:
 
355
.sp
 
356
cache_size / concurrency / (key_size + value_size) * 0.5
 
357
.sp
 
358
The formula for calculating window size for cache miss rate 5%:
 
359
.sp
 
360
cache_size / concurrency / (key_size + value_size) * 0.7
 
361
.SS Verification
 
362
.sp
 
363
Memslap testss both data verification and expire\-time
 
364
verification. The user can use "\-\-verify=" or "\-v" to specify the proportion
 
365
of data verification. In theory, it testss 100% data verification. The
 
366
user can use "\-\-exp_verify=" or "\-e" to specify the proportion of
 
367
expire\-time verification. In theory, it testss 100% expire\-time
 
368
verification. Specify the "\-\-verbose" options to get more detailed error
 
369
information.
 
370
.sp
 
371
For example: \-\-exp_verify=0.01 –verify=0.1 , it means that 1% of the objects
 
372
set with expire\-time, 10% of the objects gotten will be verified. If the
 
373
objects are gotten, memaslap will verify the expire\-time and
 
374
value.
 
375
.SS multi\-servers and multi\-config
 
376
.sp
 
377
Memslap testss multi\-servers based on self\-governed thread.
 
378
There is a limitation that the number of servers cannot be greater than the
 
379
number of threads. Memslap assigns one thread to handle one
 
380
server at least. The user can use the "\-\-servers=" or "\-s" option to specify
 
381
multi\-servers.
 
382
.sp
 
383
For example:
 
384
.sp
 
385
\-\-servers=10.1.1.1:11211,10.1.1.2:11212,10.1.1.3:11213 \-\-threads=6 \-\-concurrency=36
 
386
.sp
 
387
The above command means that there are 6 threads, with each thread having 6
 
388
concurrencies and that threads 0 and 3 handle server 0 (10.1.1.1); threads 1
 
389
and 4 handle server 1 (10.1.1.2); and thread 2 and 5 handle server 2
 
390
(10.1.1.3).
 
391
.sp
 
392
All the threads and concurrencies in memaslap are self\-governed.
 
393
.sp
 
394
So is memaslap. The user can start up several
 
395
memaslap instances. The user can run memaslap on different client
 
396
machines to communicate with the same memcached server at the same. It is
 
397
recommended that the user start different memaslap on different
 
398
machines using the same configuration.
 
399
.SS Run with execute number mode or time mode
 
400
.sp
 
401
The default memaslap runs with time mode. The default run time
 
402
is 10 minutes. If it times out, memaslap will exit. Do not
 
403
specify both execute number mode and time mode at the same time; just
 
404
specify one instead.
 
405
.sp
 
406
For example:
 
407
.sp
 
408
\-\-time=30s (It means the test will run 30 seconds.)
 
409
.sp
 
410
\-\-execute_number=100000 (It means that after running 100000 commands, the test will exit.)
 
411
.SS Dump statistic information periodically.
 
412
.sp
 
413
The user can use "\-\-stat_freq=" or "\-S" to specify the frequency.
 
414
.sp
 
415
For example:
 
416
.sp
 
417
\-\-stat_freq=20s
 
418
.sp
 
419
Memslap will dump the statistics of the commands (get and set) at the frequency of every 20
 
420
seconds.
 
421
.sp
 
422
For more information on the format of dumping statistic information, refer to “Format of Output” section.
 
423
.SS Multi\-get
 
424
.sp
 
425
The user can use "\-\-division=" or "\-d" to specify multi\-get keys count.
 
426
Memslap by default does single get with TCP. Memslap also testss data
 
427
verification and expire\-time verification for multi\-get.
 
428
.sp
 
429
Memslap testss multi\-get with both TCP and UDP. Because of
 
430
the different implementation of the ASCII protocol and binary protocol,
 
431
there are some differences between the two. For the ASCII protocol,
 
432
memaslap sends one “multi\-get” to the server once. For the
 
433
binary protocol, memaslap sends several single get commands
 
434
together as “multi\-get” to the server.
 
435
.SS UDP and TCP
 
436
.sp
 
437
Memslap testss both UDP and TCP. For TCP,
 
438
memaslap does not reconnect the memcached server if socket connections are
 
439
lost. If all the socket connections are lost or memcached server crashes,
 
440
memaslap will exit. If the user specifies the “\-\-reconnect”
 
441
option when socket connections are lost, it will reconnect them.
 
442
.sp
 
443
User can use “\-\-udp” to enable the UDP feature, but UDP comes with some
 
444
limitations:
 
445
.sp
 
446
UDP cannot set data more than 1400 bytes.
 
447
.sp
 
448
UDP is not testsed by the binary protocol because the binary protocol of
 
449
memcached does not tests that.
 
450
.sp
 
451
UDP doesn’t tests reconnection.
 
452
.SS Facebook test
 
453
.sp
 
454
Set data with TCP and multi\-get with UDP. Specify the following options:
 
455
.sp
 
456
"\-\-facebook \-\-division=50"
 
457
.sp
 
458
If you want to create thousands of TCP connections, specify the
 
459
.sp
 
460
"\-\-conn_sock=" option.
 
461
.sp
 
462
For example: \-\-facebook \-\-division=50 \-\-conn_sock=200
 
463
.sp
 
464
The above command means that memaslap will do facebook test,
 
465
each concurrency has 200 socket TCP connections and one UDP socket.
 
466
.sp
 
467
Memslap sets objects with the TCP socket, and multi\-gets 50
 
468
objects once with the UDP socket.
 
469
.sp
 
470
If you specify "\-\-division=50", the key size must be less that 25 bytes
 
471
because the UDP packet size is 1400 bytes.
 
472
.SS Replication test
 
473
.sp
 
474
For replication test, the user must specify at least two memcached servers.
 
475
The user can use “—rep_write=” option to enable feature.
 
476
.sp
 
477
For example:
 
478
.sp
 
479
\-\-servers=10.1.1.1:11211,10.1.1.2:11212 –rep_write=2
 
480
.sp
 
481
The above command means that there are 2 replication memcached servers,
 
482
memaslap will set objects to both server 0 and server 1, get
 
483
objects which are set to server 0 before from server 1, and also get objects
 
484
which are set to server 1 before from server 0. If server 0 crashes,
 
485
memaslap will only get objects from server 1. If server 0 comes
 
486
back to life again, memaslap will reconnect server 0. If both
 
487
server 0 and server 1 crash, memaslap will exit.
 
488
.SS Supports thousands of TCP connections
 
489
.sp
 
490
Start memaslap with "\-\-conn_sock=" or "\-n" to enable this
 
491
feature. Make sure that your system can tests opening thousands of files
 
492
and creating thousands of sockets. However, this feature does not tests
 
493
reconnection if sockets disconnect.
 
494
.sp
 
495
For example:
 
496
.sp
 
497
\-\-threads=8 \-\-concurrency=128 \-\-conn_sock=128
 
498
.sp
 
499
The above command means that memaslap starts up 8 threads, each
 
500
thread has 16 concurrencies, each concurrency has 128 TCP socket
 
501
connections, and the total number of TCP socket connections is 128 * 128 =
 
502
16384.
 
503
.SS Supports binary protocol
 
504
.sp
 
505
Start memaslap with "\-\-binary" or "\-B" options to enable this
 
506
feature. It testss all the above features except UDP, because the latest
 
507
memcached 1.3.3 does not implement binary UDP protocol.
 
508
.sp
 
509
For example:
 
510
.sp
 
511
\-\-binary
 
512
.sp
 
513
Since memcached 1.3.3 doesn\(aqt implement binary UDP protocol,
 
514
memaslap does not tests UDP. In addition, memcached 1.3.3 does not tests
 
515
multi\-get. If you specify "\-\-division=50" option, it just sends 50 get
 
516
commands together as “mulit\-get” to the server.
 
517
.SH CONFIGURATION FILE
 
518
.sp
 
519
This section describes the format of the configuration file.  By default
 
520
when no configuration file is specified memaslap reads the default
 
521
one located at ~/.memaslap.cnf.
 
522
.sp
 
523
Below is a sample configuration file:
 
524
.sp
 
525
.nf
 
526
.ft C
 
527
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
 
528
#comments should start with \(aq#\(aq
 
529
#key
 
530
#start_len end_len proportion
 
531
#
 
532
#key length range from start_len to end_len
 
533
#start_len must be equal to or greater than 16
 
534
#end_len must be equal to or less than 250
 
535
#start_len must be equal to or greater than end_len
 
536
#memaslap will generate keys according to the key range
 
537
#proportion: indicates keys generated from one range accounts for the total
 
538
generated keys
 
539
#
 
540
#example1: key range 16~100 accounts for 80%
 
541
#          key range 101~200 accounts for 10%
 
542
#          key range 201~250 accounts for 10%
 
543
#          total should be 1 (0.8+0.1+0.1 = 1)
 
544
#
 
545
#          16 100 0.8
 
546
#          101 200 0.1
 
547
#          201 249 0.1
 
548
#
 
549
#example2: all keys length are 128 bytes
 
550
#
 
551
#          128 128 1
 
552
key
 
553
128 128 1
 
554
#value
 
555
#start_len end_len proportion
 
556
#
 
557
#value length range from start_len to end_len
 
558
#start_len must be equal to or greater than 1
 
559
#end_len must be equal to or less than 1M
 
560
#start_len must be equal to or greater than end_len
 
561
#memaslap will generate values according to the value range
 
562
#proportion: indicates values generated from one range accounts for the
 
563
total generated values
 
564
#
 
565
#example1: value range 1~1000 accounts for 80%
 
566
#          value range 1001~10000 accounts for 10%
 
567
#          value range 10001~100000 accounts for 10%
 
568
#          total should be 1 (0.8+0.1+0.1 = 1)
 
569
#
 
570
#          1 1000 0.8
 
571
#          1001 10000 0.1
 
572
#          10001 100000 0.1
 
573
#
 
574
#example2: all value length are 128 bytes
 
575
#
 
576
#          128 128 1
 
577
value
 
578
2048 2048 1
 
579
#cmd
 
580
#cmd_type cmd_proportion
 
581
#
 
582
#currently memaslap only testss get and set command.
 
583
#
 
584
#cmd_type
 
585
#set     0
 
586
#get     1
 
587
#
 
588
#example: set command accounts for 50%
 
589
#         get command accounts for 50%
 
590
#         total should be 1 (0.5+0.5 = 1)
 
591
#
 
592
#         cmd
 
593
#         0    0.5
 
594
#         1    0.5
 
595
cmd
 
596
0    0.1
 
597
1.0 0.9
 
598
.ft P
 
599
.fi
 
600
.SH FORMAT OF OUTPUT
 
601
.sp
 
602
At the beginning, memaslap displays some configuration information as follows:
 
603
.sp
 
604
servers : 127.0.0.1:11211
 
605
.sp
 
606
threads count: 1
 
607
.sp
 
608
concurrency: 16
 
609
.sp
 
610
run time: 20s
 
611
.sp
 
612
windows size: 10k
 
613
.sp
 
614
set proportion: set_prop=0.10
 
615
.sp
 
616
get proportion: get_prop=0.90
 
617
.SS Where
 
618
.sp
 
619
servers : "servers"
 
620
.INDENT 0.0
 
621
.INDENT 3.5
 
622
.sp
 
623
The servers used by memaslap.
 
624
.UNINDENT
 
625
.UNINDENT
 
626
.sp
 
627
threads count
 
628
.INDENT 0.0
 
629
.INDENT 3.5
 
630
.sp
 
631
The number of threads memaslap runs with.
 
632
.UNINDENT
 
633
.UNINDENT
 
634
.sp
 
635
concurrency
 
636
.INDENT 0.0
 
637
.INDENT 3.5
 
638
.sp
 
639
The number of concurrencies memaslap runs with.
 
640
.UNINDENT
 
641
.UNINDENT
 
642
.sp
 
643
run time
 
644
.INDENT 0.0
 
645
.INDENT 3.5
 
646
.sp
 
647
How long to run memaslap.
 
648
.UNINDENT
 
649
.UNINDENT
 
650
.sp
 
651
windows size
 
652
.INDENT 0.0
 
653
.INDENT 3.5
 
654
.sp
 
655
The task window size of each concurrency.
 
656
.UNINDENT
 
657
.UNINDENT
 
658
.sp
 
659
set proportion
 
660
.INDENT 0.0
 
661
.INDENT 3.5
 
662
.sp
 
663
The proportion of set command.
 
664
.UNINDENT
 
665
.UNINDENT
 
666
.sp
 
667
get proportion
 
668
.INDENT 0.0
 
669
.INDENT 3.5
 
670
.sp
 
671
The proportion of get command.
 
672
.UNINDENT
 
673
.UNINDENT
 
674
.sp
 
675
The output of dynamic statistics is something like this:
 
676
.sp
 
677
.nf
 
678
.ft C
 
679
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
 
680
Get Statistics
 
681
Type  Time(s)  Ops   TPS(ops/s)  Net(M/s)  Get_miss  Min(us)  Max(us)
 
682
Avg(us)  Std_dev    Geo_dist
 
683
Period   5   345826  69165     65.3      0         27      2198     203
 
684
95.43      177.29
 
685
Global  20  1257935  62896     71.8      0         26      3791     224
 
686
117.79     192.60
 
687
 
 
688
 
 
689
Set Statistics
 
690
Type  Time(s)  Ops   TPS(ops/s)  Net(M/s)  Get_miss  Min(us)  Max(us)
 
691
Avg(us)  Std_dev    Geo_dist
 
692
Period   5    38425   7685      7.3       0         42      628     240
 
693
88.05      220.21
 
694
Global   20   139780  6989      8.0       0         37      3790    253
 
695
117.93     224.83
 
696
 
 
697
 
 
698
Total Statistics
 
699
Type  Time(s)  Ops   TPS(ops/s)  Net(M/s)  Get_miss  Min(us)  Max(us)
 
700
Avg(us)  Std_dev    Geo_dist
 
701
Period   5   384252   76850     72.5      0        27      2198     207
 
702
94.72      181.18
 
703
Global  20  1397720   69886     79.7      0        26      3791     227
 
704
117.93     195.60
 
705
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
 
706
.ft P
 
707
.fi
 
708
.SS Where
 
709
.sp
 
710
Get Statistics
 
711
.INDENT 0.0
 
712
.INDENT 3.5
 
713
.sp
 
714
Statistics information of get command
 
715
.UNINDENT
 
716
.UNINDENT
 
717
.sp
 
718
Set Statistics
 
719
.INDENT 0.0
 
720
.INDENT 3.5
 
721
.sp
 
722
Statistics information of set command
 
723
.UNINDENT
 
724
.UNINDENT
 
725
.sp
 
726
Total Statistics
 
727
.INDENT 0.0
 
728
.INDENT 3.5
 
729
.sp
 
730
Statistics information of both get and set command
 
731
.UNINDENT
 
732
.UNINDENT
 
733
.sp
 
734
Period
 
735
.INDENT 0.0
 
736
.INDENT 3.5
 
737
.sp
 
738
Result within a period
 
739
.UNINDENT
 
740
.UNINDENT
 
741
.sp
 
742
Global
 
743
.INDENT 0.0
 
744
.INDENT 3.5
 
745
.sp
 
746
Accumulated results
 
747
.UNINDENT
 
748
.UNINDENT
 
749
.sp
 
750
Ops
 
751
.INDENT 0.0
 
752
.INDENT 3.5
 
753
.sp
 
754
Total operations
 
755
.UNINDENT
 
756
.UNINDENT
 
757
.sp
 
758
TPS
 
759
.INDENT 0.0
 
760
.INDENT 3.5
 
761
.sp
 
762
Throughput, operations/second
 
763
.UNINDENT
 
764
.UNINDENT
 
765
.sp
 
766
Net
 
767
.INDENT 0.0
 
768
.INDENT 3.5
 
769
.sp
 
770
The rate of network
 
771
.UNINDENT
 
772
.UNINDENT
 
773
.sp
 
774
Get_miss
 
775
.INDENT 0.0
 
776
.INDENT 3.5
 
777
.sp
 
778
How many objects can’t be gotten
 
779
.UNINDENT
 
780
.UNINDENT
 
781
.sp
 
782
Min
 
783
.INDENT 0.0
 
784
.INDENT 3.5
 
785
.sp
 
786
The minimum response time
 
787
.UNINDENT
 
788
.UNINDENT
 
789
.sp
 
790
Max
 
791
.INDENT 0.0
 
792
.INDENT 3.5
 
793
.sp
 
794
The maximum response time
 
795
.UNINDENT
 
796
.UNINDENT
 
797
.sp
 
798
Avg:
 
799
.INDENT 0.0
 
800
.INDENT 3.5
 
801
.sp
 
802
The average response time
 
803
.UNINDENT
 
804
.UNINDENT
 
805
.sp
 
806
Std_dev
 
807
.INDENT 0.0
 
808
.INDENT 3.5
 
809
.sp
 
810
Standard deviation of response time
 
811
.UNINDENT
 
812
.UNINDENT
 
813
.sp
 
814
Geo_dist
 
815
.INDENT 0.0
 
816
.INDENT 3.5
 
817
.sp
 
818
Geometric distribution based on natural exponential function
 
819
.UNINDENT
 
820
.UNINDENT
 
821
.sp
 
822
At the end, memaslap will output something like this:
 
823
.sp
 
824
.nf
 
825
.ft C
 
826
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
 
827
Get Statistics (1257956 events)
 
828
  Min:        26
 
829
  Max:      3791
 
830
  Avg:       224
 
831
  Geo:    192.60
 
832
  Std:    116.23
 
833
                  Log2 Dist:
 
834
                    4:        0       10    84490   215345
 
835
                    8:   484890   459823    12543      824
 
836
                   12:       31
 
837
 
 
838
 Set Statistics (139782 events)
 
839
    Min:        37
 
840
    Max:      3790
 
841
    Avg:       253
 
842
    Geo:    224.84
 
843
    Std:    116.83
 
844
    Log2 Dist:
 
845
      4:        0        0     4200 16988
 
846
      8:    50784    65574 2064      167
 
847
      12:        5
 
848
 
 
849
  Total Statistics (1397738 events)
 
850
      Min:        26
 
851
      Max:      3791
 
852
      Avg:       227
 
853
      Geo:    195.60
 
854
      Std:    116.60
 
855
      Log2 Dist:
 
856
        4:        0       10    88690   232333
 
857
        8:   535674   525397    14607      991
 
858
        12:       36
 
859
 
 
860
cmd_get: 1257969
 
861
cmd_set: 139785
 
862
get_misses: 0
 
863
verify_misses: 0
 
864
verify_failed: 0
 
865
expired_get: 0
 
866
unexpired_unget: 0
 
867
written_bytes: 242516030
 
868
read_bytes: 1003702556
 
869
object_bytes: 152086080
 
870
packet_disorder: 0
 
871
packet_drop: 0
 
872
udp_timeout: 0
 
873
 
 
874
Run time: 20.0s Ops: 1397754 TPS: 69817 Net_rate: 59.4M/s
 
875
\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
 
876
.ft P
 
877
.fi
 
878
.SS Where
 
879
.sp
 
880
Get Statistics
 
881
.INDENT 0.0
 
882
.INDENT 3.5
 
883
.sp
 
884
Get statistics of response time
 
885
.UNINDENT
 
886
.UNINDENT
 
887
.sp
 
888
Set Statistics
 
889
.INDENT 0.0
 
890
.INDENT 3.5
 
891
.sp
 
892
Set statistics of response time
 
893
.UNINDENT
 
894
.UNINDENT
 
895
.sp
 
896
Total Statistics
 
897
.INDENT 0.0
 
898
.INDENT 3.5
 
899
.sp
 
900
Both get and set statistics of response time
 
901
.UNINDENT
 
902
.UNINDENT
 
903
.sp
 
904
Min
 
905
.INDENT 0.0
 
906
.INDENT 3.5
 
907
.sp
 
908
The accumulated and minimum response time
 
909
.UNINDENT
 
910
.UNINDENT
 
911
.sp
 
912
Max
 
913
.INDENT 0.0
 
914
.INDENT 3.5
 
915
.sp
 
916
The accumulated and maximum response time
 
917
.UNINDENT
 
918
.UNINDENT
 
919
.sp
 
920
Avg
 
921
.INDENT 0.0
 
922
.INDENT 3.5
 
923
.sp
 
924
The accumulated and average response time
 
925
.UNINDENT
 
926
.UNINDENT
 
927
.sp
 
928
Std
 
929
.INDENT 0.0
 
930
.INDENT 3.5
 
931
.sp
 
932
Standard deviation of response time
 
933
.UNINDENT
 
934
.UNINDENT
 
935
.sp
 
936
Log2 Dist
 
937
.INDENT 0.0
 
938
.INDENT 3.5
 
939
.sp
 
940
Geometric distribution based on logarithm 2
 
941
.UNINDENT
 
942
.UNINDENT
 
943
.sp
 
944
cmd_get
 
945
.INDENT 0.0
 
946
.INDENT 3.5
 
947
.sp
 
948
Total get commands done
 
949
.UNINDENT
 
950
.UNINDENT
 
951
.sp
 
952
cmd_set
 
953
.INDENT 0.0
 
954
.INDENT 3.5
 
955
.sp
 
956
Total set commands done
 
957
.UNINDENT
 
958
.UNINDENT
 
959
.sp
 
960
get_misses
 
961
.INDENT 0.0
 
962
.INDENT 3.5
 
963
.sp
 
964
How many objects can’t be gotten from server
 
965
.UNINDENT
 
966
.UNINDENT
 
967
.sp
 
968
verify_misses
 
969
.INDENT 0.0
 
970
.INDENT 3.5
 
971
.sp
 
972
How many objects need to verify but can’t get them
 
973
.UNINDENT
 
974
.UNINDENT
 
975
.sp
 
976
verify_failed
 
977
.INDENT 0.0
 
978
.INDENT 3.5
 
979
.sp
 
980
How many objects with insistent value
 
981
.UNINDENT
 
982
.UNINDENT
 
983
.sp
 
984
expired_get
 
985
.INDENT 0.0
 
986
.INDENT 3.5
 
987
.sp
 
988
How many objects are expired but we get them
 
989
.UNINDENT
 
990
.UNINDENT
 
991
.sp
 
992
unexpired_unget
 
993
.INDENT 0.0
 
994
.INDENT 3.5
 
995
.sp
 
996
How many objects are unexpired but we can’t get them
 
997
.UNINDENT
 
998
.UNINDENT
 
999
.sp
 
1000
written_bytes
 
1001
.INDENT 0.0
 
1002
.INDENT 3.5
 
1003
.sp
 
1004
Total written bytes
 
1005
.UNINDENT
 
1006
.UNINDENT
 
1007
.sp
 
1008
read_bytes
 
1009
.INDENT 0.0
 
1010
.INDENT 3.5
 
1011
.sp
 
1012
Total read bytes
 
1013
.UNINDENT
 
1014
.UNINDENT
 
1015
.sp
 
1016
object_bytes
 
1017
.INDENT 0.0
 
1018
.INDENT 3.5
 
1019
.sp
 
1020
Total object bytes
 
1021
.UNINDENT
 
1022
.UNINDENT
 
1023
.sp
 
1024
packet_disorder
 
1025
.INDENT 0.0
 
1026
.INDENT 3.5
 
1027
.sp
 
1028
How many UDP packages are disorder
 
1029
.UNINDENT
 
1030
.UNINDENT
 
1031
.sp
 
1032
packet_drop
 
1033
.INDENT 0.0
 
1034
.INDENT 3.5
 
1035
.sp
 
1036
How many UDP packages are lost
 
1037
.UNINDENT
 
1038
.UNINDENT
 
1039
.sp
 
1040
udp_timeout
 
1041
.INDENT 0.0
 
1042
.INDENT 3.5
 
1043
.sp
 
1044
How many times UDP time out happen
 
1045
.UNINDENT
 
1046
.UNINDENT
 
1047
.sp
 
1048
Run time
 
1049
.INDENT 0.0
 
1050
.INDENT 3.5
 
1051
.sp
 
1052
Total run time
 
1053
.UNINDENT
 
1054
.UNINDENT
 
1055
.sp
 
1056
Ops
 
1057
.INDENT 0.0
 
1058
.INDENT 3.5
 
1059
.sp
 
1060
Total operations
 
1061
.UNINDENT
 
1062
.UNINDENT
 
1063
.sp
 
1064
TPS
 
1065
.INDENT 0.0
 
1066
.INDENT 3.5
 
1067
.sp
 
1068
Throughput, operations/second
 
1069
.UNINDENT
 
1070
.UNINDENT
 
1071
.sp
 
1072
Net_rate
 
1073
.INDENT 0.0
 
1074
.INDENT 3.5
 
1075
.sp
 
1076
The average rate of network
 
1077
.UNINDENT
 
1078
.UNINDENT
 
1079
.SH OPTIONS
 
1080
.INDENT 0.0
 
1081
.TP
 
1082
.B \-s, \-\-servers=
 
1083
.
 
1084
List one or more servers to connect. Servers count must be less than
 
1085
threads count. e.g.: \-\-servers=localhost:1234,localhost:11211
 
1086
.TP
 
1087
.B \-T, \-\-threads=
 
1088
.
 
1089
Number of threads to startup, better equal to CPU numbers. Default 8.
 
1090
.TP
 
1091
.B \-c, \-\-concurrency=
 
1092
.
 
1093
Number of concurrency to simulate with load. Default 128.
 
1094
.TP
 
1095
.B \-n, \-\-conn_sock=
 
1096
.
 
1097
Number of TCP socks per concurrency. Default 1.
 
1098
.TP
 
1099
.B \-x, \-\-execute_number=
 
1100
.
 
1101
Number of operations(get and set) to execute for the
 
1102
given test. Default 1000000.
 
1103
.TP
 
1104
.B \-t, \-\-time=
 
1105
.
 
1106
How long the test to run, suffix: s\-seconds, m\-minutes, h\-hours,
 
1107
d\-days e.g.: \-\-time=2h.
 
1108
.TP
 
1109
.B \-F, \-\-cfg_cmd=
 
1110
.
 
1111
Load the configure file to get command,key and value distribution list.
 
1112
.TP
 
1113
.B \-w, \-\-win_size=
 
1114
.
 
1115
Task window size of each concurrency, suffix: K, M e.g.: \-\-win_size=10k.
 
1116
Default 10k.
 
1117
.TP
 
1118
.B \-X, \-\-fixed_size=
 
1119
.
 
1120
Fixed length of value.
 
1121
.TP
 
1122
.B \-v, \-\-verify=
 
1123
.
 
1124
The proportion of date verification, e.g.: \-\-verify=0.01
 
1125
.TP
 
1126
.B \-d, \-\-division=
 
1127
.
 
1128
Number of keys to multi\-get once. Default 1, means single get.
 
1129
.TP
 
1130
.B \-S, \-\-stat_freq=
 
1131
.
 
1132
Frequency of dumping statistic information. suffix: s\-seconds,
 
1133
m\-minutes, e.g.: \-\-resp_freq=10s.
 
1134
.TP
 
1135
.B \-e, \-\-exp_verify=
 
1136
.
 
1137
The proportion of objects with expire time, e.g.: \-\-exp_verify=0.01.
 
1138
Default no object with expire time
 
1139
.TP
 
1140
.B \-o, \-\-overwrite=
 
1141
.
 
1142
The proportion of objects need overwrite, e.g.: \-\-overwrite=0.01.
 
1143
Default never overwrite object.
 
1144
.UNINDENT
 
1145
.INDENT 0.0
 
1146
.TP
 
1147
.B \-R,  \-\-reconnect
 
1148
.
 
1149
Reconnect tests, when connection is closed it will be reconnected.
 
1150
.TP
 
1151
.B \-U,  \-\-udp
 
1152
.
 
1153
UDP tests, default memaslap uses TCP, TCP port and UDP port of
 
1154
server must be same.
 
1155
.TP
 
1156
.B \-a,  \-\-facebook
 
1157
.
 
1158
Whether it enables facebook test feature, set with TCP and multi\-get with UDP.
 
1159
.TP
 
1160
.B \-B,  \-\-binary
 
1161
.
 
1162
Whether it enables binary protocol. Default with ASCII protocol.
 
1163
.UNINDENT
 
1164
.INDENT 0.0
 
1165
.TP
 
1166
.B \-P, \-\-tps=
 
1167
.
 
1168
Expected throughput, suffix: K, e.g.: \-\-tps=10k.
 
1169
.TP
 
1170
.B \-p, \-\-rep_write=
 
1171
.
 
1172
The first nth servers can write data, e.g.: \-\-rep_write=2.
 
1173
.UNINDENT
 
1174
.INDENT 0.0
 
1175
.TP
 
1176
.B \-b,  \-\-verbose
 
1177
.
 
1178
Whether it outputs detailed information when verification fails.
 
1179
.TP
 
1180
.B \-h,  \-\-help
 
1181
.
 
1182
Display this message and then exit.
 
1183
.TP
 
1184
.B \-V,  \-\-version
 
1185
.
 
1186
Display the version of the application and then exit.
 
1187
.UNINDENT
 
1188
.SH EXAMPLES
 
1189
.sp
 
1190
memaslap \-s 127.0.0.1:11211 \-S 5s
 
1191
.sp
 
1192
memaslap \-s 127.0.0.1:11211 \-t 2m \-v 0.2 \-e 0.05 \-b
 
1193
.sp
 
1194
memaslap \-s 127.0.0.1:11211 \-F config \-t 2m \-w 40k \-S 20s \-o 0.2
 
1195
.sp
 
1196
memaslap \-s 127.0.0.1:11211 \-F config \-t 2m \-T 4 \-c 128 \-d 20 \-P 40k
 
1197
.sp
 
1198
memaslap \-s 127.0.0.1:11211 \-F config \-t 2m \-d 50 \-a \-n 40
 
1199
.sp
 
1200
memaslap \-s 127.0.0.1:11211,127.0.0.1:11212 \-F config \-t 2m
 
1201
.sp
 
1202
memaslap \-s 127.0.0.1:11211,127.0.0.1:11212 \-F config \-t 2m \-p 2
 
1203
.SH HOME
 
1204
.sp
 
1205
To find out more information please check:
 
1206
\fI\%http://launchpad.org/libmemcached\fP
 
1207
.SH AUTHORS
 
1208
.sp
 
1209
Mingqiang Zhuang <\fI\%mingqiangzhuang@hengtiansoft.com\fP> (Schooner Technolgy)
 
1210
Brian Aker, <\fI\%brian@tangent.org\fP>
 
1211
.SH SEE ALSO
 
1212
.sp
 
1213
\fImemcached(1)\fP \fIlibmemcached(3)\fP
 
1214
.SH AUTHOR
 
1215
Brian Aker
 
1216
.SH COPYRIGHT
 
1217
2011, Brian Aker DataDifferential, http://datadifferential.com/
 
1218
.\" Generated by docutils manpage writer.
 
1219
.\" 
 
1220
.