Showing with 115,334 additions and 477 deletions.
  1. +40 −16 test/pummel/test-keep-alive.js
  2. +14 −2 tools/wrk/.gitignore
  3. +43 −14 tools/wrk/Makefile
  4. +28 −0 tools/wrk/NOTICE
  5. +82 −13 tools/wrk/README
  6. +56 −0 tools/wrk/deps/luajit/COPYRIGHT
  7. +149 −0 tools/wrk/deps/luajit/Makefile
  8. +16 −0 tools/wrk/deps/luajit/README
  9. +166 −0 tools/wrk/deps/luajit/doc/bluequad-print.css
  10. +325 −0 tools/wrk/deps/luajit/doc/bluequad.css
  11. +892 −0 tools/wrk/deps/luajit/doc/changes.html
  12. +102 −0 tools/wrk/deps/luajit/doc/contact.html
  13. +187 −0 tools/wrk/deps/luajit/doc/ext_c_api.html
  14. +330 −0 tools/wrk/deps/luajit/doc/ext_ffi.html
  15. +566 −0 tools/wrk/deps/luajit/doc/ext_ffi_api.html
  16. +1,243 −0 tools/wrk/deps/luajit/doc/ext_ffi_semantics.html
  17. +601 −0 tools/wrk/deps/luajit/doc/ext_ffi_tutorial.html
  18. +199 −0 tools/wrk/deps/luajit/doc/ext_jit.html
  19. +408 −0 tools/wrk/deps/luajit/doc/extensions.html
  20. +184 −0 tools/wrk/deps/luajit/doc/faq.html
  21. BIN tools/wrk/deps/luajit/doc/img/contact.png
  22. +613 −0 tools/wrk/deps/luajit/doc/install.html
  23. +228 −0 tools/wrk/deps/luajit/doc/luajit.html
  24. +306 −0 tools/wrk/deps/luajit/doc/running.html
  25. +125 −0 tools/wrk/deps/luajit/doc/status.html
  26. +456 −0 tools/wrk/deps/luajit/dynasm/dasm_arm.h
  27. +1,122 −0 tools/wrk/deps/luajit/dynasm/dasm_arm.lua
  28. +416 −0 tools/wrk/deps/luajit/dynasm/dasm_mips.h
  29. +953 −0 tools/wrk/deps/luajit/dynasm/dasm_mips.lua
  30. +412 −0 tools/wrk/deps/luajit/dynasm/dasm_ppc.h
  31. +1,249 −0 tools/wrk/deps/luajit/dynasm/dasm_ppc.lua
  32. +83 −0 tools/wrk/deps/luajit/dynasm/dasm_proto.h
  33. +12 −0 tools/wrk/deps/luajit/dynasm/dasm_x64.lua
  34. +471 −0 tools/wrk/deps/luajit/dynasm/dasm_x86.h
  35. +1,931 −0 tools/wrk/deps/luajit/dynasm/dasm_x86.lua
  36. +1,095 −0 tools/wrk/deps/luajit/dynasm/dynasm.lua
  37. +88 −0 tools/wrk/deps/luajit/etc/luajit.1
  38. +24 −0 tools/wrk/deps/luajit/etc/luajit.pc
  39. +677 −0 tools/wrk/deps/luajit/src/Makefile
  40. +226 −0 tools/wrk/deps/luajit/src/Makefile.dep
  41. +4 −0 tools/wrk/deps/luajit/src/host/README
  42. +516 −0 tools/wrk/deps/luajit/src/host/buildvm.c
  43. +104 −0 tools/wrk/deps/luajit/src/host/buildvm.h
  44. +313 −0 tools/wrk/deps/luajit/src/host/buildvm_asm.c
  45. +229 −0 tools/wrk/deps/luajit/src/host/buildvm_fold.c
  46. +398 −0 tools/wrk/deps/luajit/src/host/buildvm_lib.c
  47. +368 −0 tools/wrk/deps/luajit/src/host/buildvm_peobj.c
  48. +427 −0 tools/wrk/deps/luajit/src/host/genminilua.lua
  49. +7,769 −0 tools/wrk/deps/luajit/src/host/minilua.c
  50. +191 −0 tools/wrk/deps/luajit/src/jit/bc.lua
  51. +659 −0 tools/wrk/deps/luajit/src/jit/bcsave.lua
  52. +689 −0 tools/wrk/deps/luajit/src/jit/dis_arm.lua
  53. +428 −0 tools/wrk/deps/luajit/src/jit/dis_mips.lua
  54. +20 −0 tools/wrk/deps/luajit/src/jit/dis_mipsel.lua
  55. +591 −0 tools/wrk/deps/luajit/src/jit/dis_ppc.lua
  56. +20 −0 tools/wrk/deps/luajit/src/jit/dis_x64.lua
  57. +836 −0 tools/wrk/deps/luajit/src/jit/dis_x86.lua
  58. +700 −0 tools/wrk/deps/luajit/src/jit/dump.lua
  59. +167 −0 tools/wrk/deps/luajit/src/jit/v.lua
  60. +167 −0 tools/wrk/deps/luajit/src/lauxlib.h
  61. +356 −0 tools/wrk/deps/luajit/src/lib_aux.c
  62. +683 −0 tools/wrk/deps/luajit/src/lib_base.c
  63. +74 −0 tools/wrk/deps/luajit/src/lib_bit.c
  64. +405 −0 tools/wrk/deps/luajit/src/lib_debug.c
  65. +850 −0 tools/wrk/deps/luajit/src/lib_ffi.c
  66. +55 −0 tools/wrk/deps/luajit/src/lib_init.c
  67. +539 −0 tools/wrk/deps/luajit/src/lib_io.c
  68. +663 −0 tools/wrk/deps/luajit/src/lib_jit.c
  69. +233 −0 tools/wrk/deps/luajit/src/lib_math.c
  70. +280 −0 tools/wrk/deps/luajit/src/lib_os.c
  71. +605 −0 tools/wrk/deps/luajit/src/lib_package.c
  72. +940 −0 tools/wrk/deps/luajit/src/lib_string.c
  73. +300 −0 tools/wrk/deps/luajit/src/lib_table.c
  74. +26 −0 tools/wrk/deps/luajit/src/lj.supp
  75. +1,388 −0 tools/wrk/deps/luajit/src/lj_alloc.c
  76. +17 −0 tools/wrk/deps/luajit/src/lj_alloc.h
  77. +1,200 −0 tools/wrk/deps/luajit/src/lj_api.c
  78. +419 −0 tools/wrk/deps/luajit/src/lj_arch.h
  79. +1,912 −0 tools/wrk/deps/luajit/src/lj_asm.c
  80. +17 −0 tools/wrk/deps/luajit/src/lj_asm.h
  81. +2,358 −0 tools/wrk/deps/luajit/src/lj_asm_arm.h
  82. +1,976 −0 tools/wrk/deps/luajit/src/lj_asm_mips.h
  83. +2,166 −0 tools/wrk/deps/luajit/src/lj_asm_ppc.h
  84. +2,793 −0 tools/wrk/deps/luajit/src/lj_asm_x86.h
  85. +14 −0 tools/wrk/deps/luajit/src/lj_bc.c
  86. +261 −0 tools/wrk/deps/luajit/src/lj_bc.h
  87. +66 −0 tools/wrk/deps/luajit/src/lj_bcdump.h
  88. +476 −0 tools/wrk/deps/luajit/src/lj_bcread.c
  89. +396 −0 tools/wrk/deps/luajit/src/lj_bcwrite.c
  90. +351 −0 tools/wrk/deps/luajit/src/lj_carith.c
  91. +27 −0 tools/wrk/deps/luajit/src/lj_carith.h
  92. +899 −0 tools/wrk/deps/luajit/src/lj_ccall.c
  93. +171 −0 tools/wrk/deps/luajit/src/lj_ccall.h
  94. +641 −0 tools/wrk/deps/luajit/src/lj_ccallback.c
  95. +25 −0 tools/wrk/deps/luajit/src/lj_ccallback.h
  96. +751 −0 tools/wrk/deps/luajit/src/lj_cconv.c
  97. +70 −0 tools/wrk/deps/luajit/src/lj_cconv.h
  98. +285 −0 tools/wrk/deps/luajit/src/lj_cdata.c
  99. +75 −0 tools/wrk/deps/luajit/src/lj_cdata.h
  100. +43 −0 tools/wrk/deps/luajit/src/lj_char.c
  101. +42 −0 tools/wrk/deps/luajit/src/lj_char.h
  102. +412 −0 tools/wrk/deps/luajit/src/lj_clib.c
  103. +29 −0 tools/wrk/deps/luajit/src/lj_clib.h
  104. +1,872 −0 tools/wrk/deps/luajit/src/lj_cparse.c
  105. +65 −0 tools/wrk/deps/luajit/src/lj_cparse.h
  106. +1,653 −0 tools/wrk/deps/luajit/src/lj_crecord.c
  107. +31 −0 tools/wrk/deps/luajit/src/lj_crecord.h
  108. +634 −0 tools/wrk/deps/luajit/src/lj_ctype.c
  109. +461 −0 tools/wrk/deps/luajit/src/lj_ctype.h
  110. +596 −0 tools/wrk/deps/luajit/src/lj_debug.c
  111. +61 −0 tools/wrk/deps/luajit/src/lj_debug.h
  112. +349 −0 tools/wrk/deps/luajit/src/lj_def.h
  113. +494 −0 tools/wrk/deps/luajit/src/lj_dispatch.c
  114. +131 −0 tools/wrk/deps/luajit/src/lj_dispatch.h
  115. +356 −0 tools/wrk/deps/luajit/src/lj_emit_arm.h
  116. +211 −0 tools/wrk/deps/luajit/src/lj_emit_mips.h
  117. +238 −0 tools/wrk/deps/luajit/src/lj_emit_ppc.h
  118. +466 −0 tools/wrk/deps/luajit/src/lj_emit_x86.h
  119. +785 −0 tools/wrk/deps/luajit/src/lj_err.c
  120. +41 −0 tools/wrk/deps/luajit/src/lj_err.h
  121. +192 −0 tools/wrk/deps/luajit/src/lj_errmsg.h
  122. +18 −0 tools/wrk/deps/luajit/src/lj_ff.h
  123. +889 −0 tools/wrk/deps/luajit/src/lj_ffrecord.c
  124. +24 −0 tools/wrk/deps/luajit/src/lj_ffrecord.h
  125. +183 −0 tools/wrk/deps/luajit/src/lj_frame.h
  126. +185 −0 tools/wrk/deps/luajit/src/lj_func.c
  127. +24 −0 tools/wrk/deps/luajit/src/lj_func.h
  128. +839 −0 tools/wrk/deps/luajit/src/lj_gc.c
  129. +134 −0 tools/wrk/deps/luajit/src/lj_gc.h
  130. +793 −0 tools/wrk/deps/luajit/src/lj_gdbjit.c
  131. +22 −0 tools/wrk/deps/luajit/src/lj_gdbjit.h
  132. +501 −0 tools/wrk/deps/luajit/src/lj_ir.c
  133. +551 −0 tools/wrk/deps/luajit/src/lj_ir.h
  134. +271 −0 tools/wrk/deps/luajit/src/lj_ircall.h
  135. +161 −0 tools/wrk/deps/luajit/src/lj_iropt.h
  136. +416 −0 tools/wrk/deps/luajit/src/lj_jit.h
  137. +481 −0 tools/wrk/deps/luajit/src/lj_lex.c
  138. +85 −0 tools/wrk/deps/luajit/src/lj_lex.h
  139. +258 −0 tools/wrk/deps/luajit/src/lj_lib.c
  140. +112 −0 tools/wrk/deps/luajit/src/lj_lib.h
  141. +168 −0 tools/wrk/deps/luajit/src/lj_load.c
  142. +360 −0 tools/wrk/deps/luajit/src/lj_mcode.c
  143. +30 −0 tools/wrk/deps/luajit/src/lj_mcode.h
  144. +466 −0 tools/wrk/deps/luajit/src/lj_meta.c
  145. +37 −0 tools/wrk/deps/luajit/src/lj_meta.h
  146. +35 −0 tools/wrk/deps/luajit/src/lj_obj.c
  147. +856 −0 tools/wrk/deps/luajit/src/lj_obj.h
  148. +77 −0 tools/wrk/deps/luajit/src/lj_opt_dce.c
  149. +2,295 −0 tools/wrk/deps/luajit/src/lj_opt_fold.c
  150. +437 −0 tools/wrk/deps/luajit/src/lj_opt_loop.c
  151. +907 −0 tools/wrk/deps/luajit/src/lj_opt_mem.c
  152. +648 −0 tools/wrk/deps/luajit/src/lj_opt_narrow.c
  153. +245 −0 tools/wrk/deps/luajit/src/lj_opt_sink.c
  154. +731 −0 tools/wrk/deps/luajit/src/lj_opt_split.c
  155. +2,750 −0 tools/wrk/deps/luajit/src/lj_parse.c
  156. +18 −0 tools/wrk/deps/luajit/src/lj_parse.h
  157. +2,247 −0 tools/wrk/deps/luajit/src/lj_record.c
  158. +44 −0 tools/wrk/deps/luajit/src/lj_record.h
  159. +862 −0 tools/wrk/deps/luajit/src/lj_snap.c
  160. +34 −0 tools/wrk/deps/luajit/src/lj_snap.h
  161. +287 −0 tools/wrk/deps/luajit/src/lj_state.c
  162. +35 −0 tools/wrk/deps/luajit/src/lj_state.h
  163. +339 −0 tools/wrk/deps/luajit/src/lj_str.c
  164. +50 −0 tools/wrk/deps/luajit/src/lj_str.h
  165. +497 −0 tools/wrk/deps/luajit/src/lj_strscan.c
  166. +39 −0 tools/wrk/deps/luajit/src/lj_strscan.h
  167. +624 −0 tools/wrk/deps/luajit/src/lj_tab.c
  168. +67 −0 tools/wrk/deps/luajit/src/lj_tab.h
  169. +162 −0 tools/wrk/deps/luajit/src/lj_target.h
  170. +274 −0 tools/wrk/deps/luajit/src/lj_target_arm.h
  171. +257 −0 tools/wrk/deps/luajit/src/lj_target_mips.h
  172. +280 −0 tools/wrk/deps/luajit/src/lj_target_ppc.h
  173. +342 −0 tools/wrk/deps/luajit/src/lj_target_x86.h
  174. +815 −0 tools/wrk/deps/luajit/src/lj_trace.c
  175. +53 −0 tools/wrk/deps/luajit/src/lj_trace.h
  176. +61 −0 tools/wrk/deps/luajit/src/lj_traceerr.h
  177. +34 −0 tools/wrk/deps/luajit/src/lj_udata.c
  178. +14 −0 tools/wrk/deps/luajit/src/lj_udata.h
  179. +116 −0 tools/wrk/deps/luajit/src/lj_vm.h
  180. +57 −0 tools/wrk/deps/luajit/src/lj_vmevent.c
  181. +59 −0 tools/wrk/deps/luajit/src/lj_vmevent.h
  182. +140 −0 tools/wrk/deps/luajit/src/lj_vmmath.c
  183. +93 −0 tools/wrk/deps/luajit/src/ljamalg.c
  184. +393 −0 tools/wrk/deps/luajit/src/lua.h
  185. +9 −0 tools/wrk/deps/luajit/src/lua.hpp
  186. +139 −0 tools/wrk/deps/luajit/src/luaconf.h
  187. +571 −0 tools/wrk/deps/luajit/src/luajit.c
  188. +70 −0 tools/wrk/deps/luajit/src/luajit.h
  189. +43 −0 tools/wrk/deps/luajit/src/lualib.h
  190. +113 −0 tools/wrk/deps/luajit/src/msvcbuild.bat
  191. +4,487 −0 tools/wrk/deps/luajit/src/vm_arm.dasc
  192. +4,241 −0 tools/wrk/deps/luajit/src/vm_mips.dasc
  193. +5,137 −0 tools/wrk/deps/luajit/src/vm_ppc.dasc
  194. +3,691 −0 tools/wrk/deps/luajit/src/vm_ppcspe.dasc
  195. +6,374 −0 tools/wrk/deps/luajit/src/vm_x86.dasc
  196. +92 −0 tools/wrk/deps/luajit/src/xedkbuild.bat
  197. +18 −0 tools/wrk/scripts/auth.lua
  198. +14 −0 tools/wrk/scripts/counter.lua
  199. +16 −0 tools/wrk/scripts/pipeline.lua
  200. +6 −0 tools/wrk/scripts/post.lua
  201. +10 −0 tools/wrk/scripts/report.lua
  202. +3 −3 tools/wrk/src/ae.c
  203. +6 −6 tools/wrk/src/ae_evport.c
  204. +2 −2 tools/wrk/src/config.h
  205. +270 −153 tools/wrk/src/http_parser.c
  206. +48 −61 tools/wrk/src/http_parser.h
  207. +58 −0 tools/wrk/src/main.h
  208. +39 −0 tools/wrk/src/net.c
  209. +29 −0 tools/wrk/src/net.h
  210. +296 −0 tools/wrk/src/script.c
  211. +35 −0 tools/wrk/src/script.h
  212. +99 −0 tools/wrk/src/ssl.c
  213. +14 −0 tools/wrk/src/ssl.h
  214. +48 −18 tools/wrk/src/stats.c
  215. +25 −3 tools/wrk/src/stats.h
  216. +10 −2 tools/wrk/src/units.c
  217. +2 −0 tools/wrk/src/units.h
  218. +317 −147 tools/wrk/src/wrk.c
  219. +24 −37 tools/wrk/src/wrk.h
  220. +57 −0 tools/wrk/src/wrk.lua
@@ -25,8 +25,10 @@
// This test requires the program 'ab'
var common = require('../common');
var assert = require('assert');
var spawn = require('child_process').spawn;
var http = require('http');
var exec = require('child_process').exec;
var path = require('path');
var url = require('url');

var body = 'hello world\n';
var server = http.createServer(function(req, res) {
@@ -43,17 +45,41 @@ var normalReqSec = 0;


function runAb(opts, callback) {
var command = 'ab ' + opts + ' http://127.0.0.1:' + common.PORT + '/';
exec(command, function(err, stdout, stderr) {
if (err) {
if (stderr.indexOf('ab') >= 0) {
console.log('ab not installed? skipping test.\n' + stderr);
process.reallyExit(0);
}
var args = [
'-c', opts.concurrent || 100,
'-t', opts.threads || 2,
'-d', opts.duration || '10s',
];

if (!opts.keepalive) {
args.push('-H');
args.push('Connection: close');
}

args.push(url.format({ hostname: '127.0.0.1', port: common.PORT, protocol: 'http'}));

var comm = path.join(__dirname, '..', '..', 'tools', 'wrk', 'wrk');

//console.log(comm, args.join(' '));

var child = spawn(comm, args);
child.stderr.pipe(process.stderr);
child.stdout.setEncoding('utf8');

var stdout;

child.stdout.on('data', function(data) {
stdout += data;
});

child.on('close', function(code, signal) {
if (code) {
console.error(code, signal);
process.exit(code);
return;
}
if (err) throw err;
var matches = /Requests per second:\s*(\d+)\./mi.exec(stdout);

var matches = /Requests\/sec:\s*(\d+)\./mi.exec(stdout);
var reqSec = parseInt(matches[1]);

matches = /Keep-Alive requests:\s*(\d+)/mi.exec(stdout);
@@ -69,15 +95,13 @@ function runAb(opts, callback) {
}

server.listen(common.PORT, function() {
runAb('-k -c 100 -t 2', function(reqSec, keepAliveRequests) {
runAb({ keepalive: true }, function(reqSec) {
keepAliveReqSec = reqSec;
assert.equal(true, keepAliveRequests > 0);
console.log('keep-alive: ' + keepAliveReqSec + ' req/sec');
console.log('keep-alive:', keepAliveReqSec, 'req/sec');

runAb('-c 100 -t 2', function(reqSec, keepAliveRequests) {
runAb({ keepalive: false }, function(reqSec) {
normalReqSec = reqSec;
assert.equal(0, keepAliveRequests);
console.log('normal: ' + normalReqSec + ' req/sec');
console.log('normal:' + normalReqSec + ' req/sec');
server.close();
});
});
@@ -1,2 +1,14 @@
obj/*
/wrk
*.o
*.a
wrk
deps/luajit/src/host/buildvm
deps/luajit/src/host/buildvm_arch.h
deps/luajit/src/host/minilua
deps/luajit/src/jit/vmdef.lua
deps/luajit/src/lj_bcdef.h
deps/luajit/src/lj_ffdef.h
deps/luajit/src/lj_folddef.h
deps/luajit/src/lj_libdef.h
deps/luajit/src/lj_recdef.h
deps/luajit/src/lj_vm.s
deps/luajit/src/luajit
@@ -1,35 +1,64 @@
CFLAGS := -std=c99 -Wall -O2 -pthread
LDFLAGS := -pthread
LIBS := -lm
ifeq ($(shell uname),SunOS)
LIBS += -lnsl -lsocket -lresolv
CFLAGS := -std=c99 -Wall -O2 -D_REENTRANT
LIBS := -lpthread -lm -lcrypto -lssl

TARGET := $(shell uname -s | tr [A-Z] [a-z] 2>/dev/null || echo unknown)

ifeq ($(TARGET), sunos)
CFLAGS += -D_PTHREADS -D_POSIX_C_SOURCE=200112L
LIBS += -lsocket
else ifeq ($(TARGET), darwin)
LDFLAGS += -pagezero_size 10000 -image_base 100000000
else ifeq ($(TARGET), linux)
LIBS += -ldl
LDFLAGS += -Wl,-E
else ifeq ($(TARGET), freebsd)
CFLAGS += -D_DECLARE_C99_LDBL_MATH
LDFLAGS += -Wl,-E
endif

SRC := wrk.c aprintf.c stats.c units.c ae.c zmalloc.c http_parser.c tinymt64.c
SRC := wrk.c net.c ssl.c aprintf.c stats.c script.c units.c \
ae.c zmalloc.c http_parser.c tinymt64.c
BIN := wrk

ODIR := obj
OBJ := $(patsubst %.c,$(ODIR)/%.o,$(SRC))
OBJ := $(patsubst %.c,$(ODIR)/%.o,$(SRC)) $(ODIR)/bytecode.o

LDIR = deps/luajit/src
LIBS := -lluajit $(LIBS)
CFLAGS += -I $(LDIR)
LDFLAGS += -L $(LDIR)

all: $(BIN)

clean:
$(RM) $(BIN) obj/*
@$(MAKE) -C deps/luajit clean

$(BIN): $(OBJ)
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
@echo LINK $(BIN)
@$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)

$(OBJ): config.h Makefile | $(ODIR)
$(OBJ): config.h Makefile $(LDIR)/libluajit.a | $(ODIR)

$(ODIR):
@mkdir $@
@mkdir -p $@

$(ODIR)/bytecode.o: src/wrk.lua
@echo LUAJIT $<
@$(SHELL) -c 'cd $(LDIR) && ./luajit -b $(CURDIR)/$< $(CURDIR)/$@'

$(ODIR)/%.o : %.c
$(CC) $(CFLAGS) -c -o $@ $<
@echo CC $<
@$(CC) $(CFLAGS) -c -o $@ $<

$(LDIR)/libluajit.a:
@echo Building LuaJIT...
@$(MAKE) -C $(LDIR) BUILDMODE=static

.PHONY: all clean
.SUFFIXES:
.SUFFIXES: .c .o
.SUFFIXES: .c .o .lua

vpath %.c src
vpath %.h src
vpath %.c src
vpath %.h src
vpath %.lua scripts
@@ -14,7 +14,9 @@ This product includes software developed by Salvatore Sanfilippo and
other contributors to the redis project.

Copyright (c) 2006-2010, Salvatore Sanfilippo <antirez at gmail dot com>
Copyright (c) 2009-2012, Salvatore Sanfilippo <antirez at gmail dot com>
Copyright (C) 2009 Harish Mallipeddi - harish.mallipeddi@gmail.com
Copyright (c) 2012, Joyent, Inc. All rights reserved.

Copyright (c) 2006-2009, Salvatore Sanfilippo
All rights reserved.
@@ -79,6 +81,32 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.

=========================================================================
== LuaJIT Notice ==
=========================================================================

LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/

Copyright (C) 2005-2013 Mike Pall. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

=========================================================================
== Tiny Mersenne Twister (TinyMT) Notice ==
=========================================================================
@@ -4,23 +4,85 @@ wrk - a HTTP benchmarking tool
load when run on a single multi-core CPU. It combines a multithreaded
design with scalable event notification systems such as epoll and kqueue.

An optional LuaJIT script can perform HTTP request generation, response
processing, and custom reporting. Several example scripts are located in
scripts/

Basic Usage

wrk -t8 -c400 -r10m http://localhost:8080/index.html
wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

This runs wrk with 8 threads, keeping 400 connections open, and making a
total of 10 million HTTP GET requests to http://localhost:8080/index.html
This runs a benchmark for 30 seconds, using 12 threads, and keeping
400 HTTP connections open.

Output:

Making 10000000 requests to http://localhost:8080/index.html
8 threads and 400 connections
Running 30s test @ http://127.0.0.1:8080/index.html
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 439.75us 350.49us 7.60ms 92.88%
Req/Sec 61.13k 8.26k 72.00k 87.54%
10000088 requests in 19.87s, 3.42GB read
Requests/sec: 503396.23
Transfer/sec: 176.16MB
Latency 635.91us 0.89ms 12.92ms 93.69%
Req/Sec 56.20k 8.07k 62.00k 86.54%
22464657 requests in 30.00s, 17.76GB read
Requests/sec: 748868.53
Transfer/sec: 606.33MB

Scripting

wrk's public Lua API is:

init = function(args)
request = function()
response = function(status, headers, body)
done = function(summary, latency, requests)

wrk = {
scheme = "http",
host = "localhost",
port = nil,
method = "GET",
path = "/",
headers = {},
body = nil
}

function wrk.format(method, path, headers, body)

wrk.format returns a HTTP request string containing the passed
parameters merged with values from the wrk table.

global init -- function called when the thread is initialized
global request -- function returning the HTTP message for each request
global response -- optional function called with HTTP response data
global done -- optional function called with results of run

The init() function receives any extra command line arguments for the
script. Script arguments must be separated from wrk arguments with "--"
and scripts that override init() but not request() must call wrk.init()

The done() function receives a table containing result data, and two
statistics objects representing the sampled per-request latency and
per-thread request rate. Duration and latency are microsecond values
and rate is measured in requests per second.

latency.min -- minimum value seen
latency.max -- maximum value seen
latency.mean -- average value seen
latency.stdev -- standard deviation
latency:percentile(99.0) -- 99th percentile value
latency[i] -- raw sample value

summary = {
duration = N, -- run duration in microseconds
requests = N, -- total completed requests
bytes = N, -- total bytes received
errors = {
connect = N, -- total socket connection errors
read = N, -- total socket read errors
write = N, -- total socket write errors
status = N, -- total HTTP status codes > 399
timeout = N -- total request timeouts
}
}

Benchmarking Tips

@@ -29,9 +91,16 @@ Benchmarking Tips
initial connection burst the server's listen(2) backlog should be greater
than the number of concurrent connections being tested.

A user script that only changes the HTTP method, path, adds headers or
a body, will have no performance impact. If multiple HTTP requests are
necessary they should be pre-generated and returned via a quick lookup in
the request() call. Per-request actions, particularly building a new HTTP
request, and use of response() will necessarily reduce the amount of load
that can be generated.

Acknowledgements

wrk contains code from a number of open source projects including the
'ae' event loop from redis, the nginx/joyent/node.js 'http-parser' and
the Tiny Mersenne Twister PRNG. Please consult the NOTICE file for
licensing details.
'ae' event loop from redis, the nginx/joyent/node.js 'http-parser',
Mike Pall's LuaJIT, and the Tiny Mersenne Twister PRNG. Please consult
the NOTICE file for licensing details.
@@ -0,0 +1,56 @@
===============================================================================
LuaJIT -- a Just-In-Time Compiler for Lua. http://luajit.org/

Copyright (C) 2005-2013 Mike Pall. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

[ MIT license: http://www.opensource.org/licenses/mit-license.php ]

===============================================================================
[ LuaJIT includes code from Lua 5.1/5.2, which has this license statement: ]

Copyright (C) 1994-2012 Lua.org, PUC-Rio.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

===============================================================================
[ LuaJIT includes code from dlmalloc, which has this license statement: ]

This is a version (aka dlmalloc) of malloc/free/realloc written by
Doug Lea and released to the public domain, as explained at
http://creativecommons.org/licenses/publicdomain

===============================================================================