Merge "veyron/runtimes/google/ipc: fix handling of proxy address"
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 6a6d9b8..fdc0afa 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -358,7 +358,7 @@
 	if err != nil {
 		return nil, "", err
 	}
-	s := expect.NewSession(nil, handle.Stdout(), time.Second)
+	s := expect.NewSession(nil, handle.Stdout(), 10*time.Second)
 	s.ExpectVar("PID")
 	if err := s.Error(); err != nil {
 		return nil, "", err
diff --git a/runtimes/google/ipc/benchmarks/RESULTS.txt b/runtimes/google/ipc/benchmarks/RESULTS.txt
index 5079f5b..979b2ac 100644
--- a/runtimes/google/ipc/benchmarks/RESULTS.txt
+++ b/runtimes/google/ipc/benchmarks/RESULTS.txt
@@ -1,108 +1,108 @@
-Date: 12/12/2014
+Date: 12/14/2014
 Platform: Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz,  66114888KB Memory
 
 $ veyron go run veyron/runtimes/google/ipc/benchmarks/bm/main.go \
   -test.cpu=1,2 -test.benchtime=5s -histogram
 
-Benchmark____1B     5000           2083384 ns/op           0.00 MB/s
-Benchmark____1B-2           5000           2079227 ns/op           0.00 MB/s
-Benchmark___10B     5000           2393875 ns/op           0.01 MB/s
-Benchmark___10B-2           5000           2130395 ns/op           0.01 MB/s
-Benchmark__100B     5000           2570157 ns/op           0.08 MB/s
-Benchmark__100B-2           5000           2313091 ns/op           0.09 MB/s
-Benchmark___1KB     5000           2441822 ns/op           0.82 MB/s
-Benchmark___1KB-2           5000           2269425 ns/op           0.88 MB/s
-Benchmark__10KB     5000           2777789 ns/op           7.20 MB/s
-Benchmark__10KB-2           5000           2320824 ns/op           8.62 MB/s
-Benchmark_100KB     2000           5462859 ns/op          36.61 MB/s
-Benchmark_100KB-2           2000           4058566 ns/op          49.28 MB/s
+Benchmark____1B     3000           2260153 ns/op           0.00 MB/s
+Benchmark____1B-2           3000           2362339 ns/op           0.00 MB/s
+Benchmark___10B     3000           2595581 ns/op           0.01 MB/s
+Benchmark___10B-2           3000           2372671 ns/op           0.01 MB/s
+Benchmark__100B     3000           2690733 ns/op           0.07 MB/s
+Benchmark__100B-2           3000           2419120 ns/op           0.08 MB/s
+Benchmark___1KB     3000           2498211 ns/op           0.80 MB/s
+Benchmark___1KB-2           3000           2244818 ns/op           0.89 MB/s
+Benchmark__10KB     3000           2740536 ns/op           7.30 MB/s
+Benchmark__10KB-2           3000           2394824 ns/op           8.35 MB/s
+Benchmark_100KB     2000           5581491 ns/op          35.83 MB/s
+Benchmark_100KB-2           2000           4127286 ns/op          48.46 MB/s
 
-Benchmark____1_chunk_____1B         2000           5280468 ns/op           0.00 MB/s
-Benchmark____1_chunk_____1B-2       2000           4850675 ns/op           0.00 MB/s
-Benchmark____1_chunk____10B         2000           5334596 ns/op           0.00 MB/s
-Benchmark____1_chunk____10B-2       2000           4867046 ns/op           0.00 MB/s
-Benchmark____1_chunk___100B         2000           5429984 ns/op           0.04 MB/s
-Benchmark____1_chunk___100B-2       2000           4913146 ns/op           0.04 MB/s
-Benchmark____1_chunk____1KB         2000           5193539 ns/op           0.39 MB/s
-Benchmark____1_chunk____1KB-2       2000           4864711 ns/op           0.41 MB/s
-Benchmark____1_chunk___10KB         2000           5472549 ns/op           3.65 MB/s
-Benchmark____1_chunk___10KB-2       2000           4950905 ns/op           4.04 MB/s
-Benchmark____1_chunk__100KB         1000           7896673 ns/op          25.33 MB/s
-Benchmark____1_chunk__100KB-2       2000           5976114 ns/op          33.47 MB/s
-Benchmark___10_chunks____1B         2000           6964499 ns/op           0.00 MB/s
-Benchmark___10_chunks____1B-2       2000           5836079 ns/op           0.00 MB/s
-Benchmark___10_chunks___10B         1000           7468897 ns/op           0.03 MB/s
-Benchmark___10_chunks___10B-2       2000           5896988 ns/op           0.03 MB/s
-Benchmark___10_chunks__100B         2000           7511902 ns/op           0.27 MB/s
-Benchmark___10_chunks__100B-2       2000           5975725 ns/op           0.33 MB/s
-Benchmark___10_chunks___1KB         1000           7678796 ns/op           2.60 MB/s
-Benchmark___10_chunks___1KB-2       2000           6047220 ns/op           3.31 MB/s
-Benchmark___10_chunks__10KB         1000           9913510 ns/op          20.17 MB/s
-Benchmark___10_chunks__10KB-2       2000           7066239 ns/op          28.30 MB/s
-Benchmark___10_chunks_100KB          500          32109490 ns/op          62.29 MB/s
-Benchmark___10_chunks_100KB-2        500          18957196 ns/op         105.50 MB/s
-Benchmark__100_chunks____1B          500          23105522 ns/op           0.01 MB/s
-Benchmark__100_chunks____1B-2       1000          14962218 ns/op           0.01 MB/s
-Benchmark__100_chunks___10B          500          24822827 ns/op           0.08 MB/s
-Benchmark__100_chunks___10B-2        500          15143142 ns/op           0.13 MB/s
-Benchmark__100_chunks__100B          500          25825032 ns/op           0.77 MB/s
-Benchmark__100_chunks__100B-2        500          16276252 ns/op           1.23 MB/s
-Benchmark__100_chunks___1KB          500          29567438 ns/op           6.76 MB/s
-Benchmark__100_chunks___1KB-2        500          18167929 ns/op          11.01 MB/s
-Benchmark__100_chunks__10KB          100          52974498 ns/op          37.75 MB/s
-Benchmark__100_chunks__10KB-2        500          30197012 ns/op          66.23 MB/s
-Benchmark__100_chunks_100KB           50         259344427 ns/op          77.12 MB/s
-Benchmark__100_chunks_100KB-2        100         138213866 ns/op         144.70 MB/s
-Benchmark___1K_chunks____1B          100         140929084 ns/op           0.01 MB/s
-Benchmark___1K_chunks____1B-2        100         105473615 ns/op           0.02 MB/s
-Benchmark___1K_chunks___10B           50         200076160 ns/op           0.10 MB/s
-Benchmark___1K_chunks___10B-2        100         112141677 ns/op           0.18 MB/s
-Benchmark___1K_chunks__100B           50         227795062 ns/op           0.88 MB/s
-Benchmark___1K_chunks__100B-2        100         127584568 ns/op           1.57 MB/s
-Benchmark___1K_chunks___1KB           50         260678247 ns/op           7.67 MB/s
-Benchmark___1K_chunks___1KB-2        100         147406551 ns/op          13.57 MB/s
-Benchmark___1K_chunks__10KB           20         484028853 ns/op          41.32 MB/s
-Benchmark___1K_chunks__10KB-2         50         255874182 ns/op          78.16 MB/s
-Benchmark___1K_chunks_100KB            5        2464952174 ns/op          81.14 MB/s
-Benchmark___1K_chunks_100KB-2          5        1336699604 ns/op         149.62 MB/s
+Benchmark____1_chunk_____1B         3000           2744128 ns/op           0.00 MB/s
+Benchmark____1_chunk_____1B-2       3000           2347418 ns/op           0.00 MB/s
+Benchmark____1_chunk____10B         3000           2857309 ns/op           0.01 MB/s
+Benchmark____1_chunk____10B-2       3000           2363346 ns/op           0.01 MB/s
+Benchmark____1_chunk___100B         3000           2922993 ns/op           0.07 MB/s
+Benchmark____1_chunk___100B-2       3000           2558699 ns/op           0.08 MB/s
+Benchmark____1_chunk____1KB         3000           2646432 ns/op           0.76 MB/s
+Benchmark____1_chunk____1KB-2       3000           2400649 ns/op           0.83 MB/s
+Benchmark____1_chunk___10KB         3000           2954627 ns/op           6.77 MB/s
+Benchmark____1_chunk___10KB-2       3000           2546084 ns/op           7.86 MB/s
+Benchmark____1_chunk__100KB         2000           5517042 ns/op          36.25 MB/s
+Benchmark____1_chunk__100KB-2       2000           4157872 ns/op          48.10 MB/s
+Benchmark___10_chunks____1B         2000           4177247 ns/op           0.00 MB/s
+Benchmark___10_chunks____1B-2       2000           3432532 ns/op           0.01 MB/s
+Benchmark___10_chunks___10B         2000           4664935 ns/op           0.04 MB/s
+Benchmark___10_chunks___10B-2       2000           3548029 ns/op           0.06 MB/s
+Benchmark___10_chunks__100B         2000           4845710 ns/op           0.41 MB/s
+Benchmark___10_chunks__100B-2       2000           3658666 ns/op           0.55 MB/s
+Benchmark___10_chunks___1KB         2000           4971196 ns/op           4.02 MB/s
+Benchmark___10_chunks___1KB-2       2000           3662827 ns/op           5.46 MB/s
+Benchmark___10_chunks__10KB         1000           7533684 ns/op          26.55 MB/s
+Benchmark___10_chunks__10KB-2       2000           4922363 ns/op          40.63 MB/s
+Benchmark___10_chunks_100KB          200          31539312 ns/op          63.41 MB/s
+Benchmark___10_chunks_100KB-2        500          18574440 ns/op         107.67 MB/s
+Benchmark__100_chunks____1B          500          18036549 ns/op           0.01 MB/s
+Benchmark__100_chunks____1B-2       1000          12395699 ns/op           0.02 MB/s
+Benchmark__100_chunks___10B          300          20669375 ns/op           0.10 MB/s
+Benchmark__100_chunks___10B-2        500          12634978 ns/op           0.16 MB/s
+Benchmark__100_chunks__100B          300          23164692 ns/op           0.86 MB/s
+Benchmark__100_chunks__100B-2        500          13821225 ns/op           1.45 MB/s
+Benchmark__100_chunks___1KB          300          26071439 ns/op           7.67 MB/s
+Benchmark__100_chunks___1KB-2        500          15738134 ns/op          12.71 MB/s
+Benchmark__100_chunks__10KB          100          50248311 ns/op          39.80 MB/s
+Benchmark__100_chunks__10KB-2        300          28614761 ns/op          69.89 MB/s
+Benchmark__100_chunks_100KB           30         272889576 ns/op          73.29 MB/s
+Benchmark__100_chunks_100KB-2         50         149680912 ns/op         133.62 MB/s
+Benchmark___1K_chunks____1B          100         111621410 ns/op           0.02 MB/s
+Benchmark___1K_chunks____1B-2        100         103311101 ns/op           0.02 MB/s
+Benchmark___1K_chunks___10B           50         189580683 ns/op           0.11 MB/s
+Benchmark___1K_chunks___10B-2        100         107068429 ns/op           0.19 MB/s
+Benchmark___1K_chunks__100B           30         223128293 ns/op           0.90 MB/s
+Benchmark___1K_chunks__100B-2         50         125690815 ns/op           1.59 MB/s
+Benchmark___1K_chunks___1KB           30         251956982 ns/op           7.94 MB/s
+Benchmark___1K_chunks___1KB-2         50         144214400 ns/op          13.87 MB/s
+Benchmark___1K_chunks__10KB           20         474946063 ns/op          42.11 MB/s
+Benchmark___1K_chunks__10KB-2         30         267531367 ns/op          74.76 MB/s
+Benchmark___1K_chunks_100KB            2        2675372295 ns/op          74.76 MB/s
+Benchmark___1K_chunks_100KB-2          5        1421481350 ns/op         140.70 MB/s
 
-Benchmark__per_chunk____1B         50000            233075 ns/op           0.01 MB/s
-Benchmark__per_chunk____1B-2       50000            177314 ns/op           0.01 MB/s
-Benchmark__per_chunk___10B         20000            519996 ns/op           0.04 MB/s
-Benchmark__per_chunk___10B-2       50000            338254 ns/op           0.06 MB/s
-Benchmark__per_chunk__100B         10000            573593 ns/op           0.35 MB/s
-Benchmark__per_chunk__100B-2       50000            267646 ns/op           0.75 MB/s
-Benchmark__per_chunk___1KB         20000            514359 ns/op           3.89 MB/s
-Benchmark__per_chunk___1KB-2       50000            275305 ns/op           7.26 MB/s
-Benchmark__per_chunk__10KB         10000            703176 ns/op          28.44 MB/s
-Benchmark__per_chunk__10KB-2       20000            395105 ns/op          50.62 MB/s
-Benchmark__per_chunk_100KB          5000           2834149 ns/op          70.57 MB/s
-Benchmark__per_chunk_100KB-2       10000           1461822 ns/op         136.82 MB/s
+Benchmark__per_chunk____1B         50000            163939 ns/op           0.01 MB/s
+Benchmark__per_chunk____1B-2       50000            118409 ns/op           0.02 MB/s
+Benchmark__per_chunk___10B         20000            321908 ns/op           0.06 MB/s
+Benchmark__per_chunk___10B-2       50000            176818 ns/op           0.11 MB/s
+Benchmark__per_chunk__100B         20000            411514 ns/op           0.49 MB/s
+Benchmark__per_chunk__100B-2       30000            231565 ns/op           0.86 MB/s
+Benchmark__per_chunk___1KB         20000            423999 ns/op           4.72 MB/s
+Benchmark__per_chunk___1KB-2       30000            248721 ns/op           8.04 MB/s
+Benchmark__per_chunk__10KB         10000            631536 ns/op          31.67 MB/s
+Benchmark__per_chunk__10KB-2       20000            346868 ns/op          57.66 MB/s
+Benchmark__per_chunk_100KB          3000           2613430 ns/op          76.53 MB/s
+Benchmark__per_chunk_100KB-2        5000           1369809 ns/op         146.01 MB/s
 
-Benchmark___10B_mux__100_chunks___10B        500          22049071 ns/op           0.00 MB/s
-Benchmark___10B_mux__100_chunks___10B-2     2000           4734244 ns/op           0.00 MB/s
-Benchmark___10B_mux__100_chunks__100B        500          23746639 ns/op           0.00 MB/s
-Benchmark___10B_mux__100_chunks__100B-2     2000           5501514 ns/op           0.00 MB/s
-Benchmark___10B_mux__100_chunks___1KB        500          25033793 ns/op           0.00 MB/s
-Benchmark___10B_mux__100_chunks___1KB-2     2000           5598670 ns/op           0.00 MB/s
-Benchmark___10B_mux___1K_chunks___10B        100         121659148 ns/op           0.00 MB/s
-Benchmark___10B_mux___1K_chunks___10B-2     1000           7827224 ns/op           0.00 MB/s
-Benchmark___10B_mux___1K_chunks__100B        100         141824661 ns/op           0.00 MB/s
-Benchmark___10B_mux___1K_chunks__100B-2     1000          11127970 ns/op           0.00 MB/s
-Benchmark___10B_mux___1K_chunks___1KB        100         148589902 ns/op           0.00 MB/s
-Benchmark___10B_mux___1K_chunks___1KB-2     1000          12616916 ns/op           0.00 MB/s
-Benchmark__100B_mux__100_chunks___10B        500          23895451 ns/op           0.01 MB/s
-Benchmark__100B_mux__100_chunks___10B-2     2000           5134742 ns/op           0.04 MB/s
-Benchmark__100B_mux__100_chunks__100B        500          25336809 ns/op           0.01 MB/s
-Benchmark__100B_mux__100_chunks__100B-2     2000           6012040 ns/op           0.03 MB/s
-Benchmark__100B_mux__100_chunks___1KB        500          27144821 ns/op           0.01 MB/s
-Benchmark__100B_mux__100_chunks___1KB-2     2000           6117827 ns/op           0.03 MB/s
-Benchmark__100B_mux___1K_chunks___10B        100         132175574 ns/op           0.00 MB/s
-Benchmark__100B_mux___1K_chunks___10B-2     1000           8590497 ns/op           0.02 MB/s
-Benchmark__100B_mux___1K_chunks__100B        100         145204032 ns/op           0.00 MB/s
-Benchmark__100B_mux___1K_chunks__100B-2     1000          12104363 ns/op           0.02 MB/s
-Benchmark__100B_mux___1K_chunks___1KB        100         150385852 ns/op           0.00 MB/s
-Benchmark__100B_mux___1K_chunks___1KB-2     1000          13867566 ns/op           0.01 MB/s
+Benchmark___10B_mux__100_chunks___10B        500          18817141 ns/op           0.00 MB/s
+Benchmark___10B_mux__100_chunks___10B-2     1000           7104449 ns/op           0.00 MB/s
+Benchmark___10B_mux__100_chunks__100B        300          21167617 ns/op           0.00 MB/s
+Benchmark___10B_mux__100_chunks__100B-2     1000           8372251 ns/op           0.00 MB/s
+Benchmark___10B_mux__100_chunks___1KB        300          22817830 ns/op           0.00 MB/s
+Benchmark___10B_mux__100_chunks___1KB-2     1000           8831943 ns/op           0.00 MB/s
+Benchmark___10B_mux___1K_chunks___10B        100         123136622 ns/op           0.00 MB/s
+Benchmark___10B_mux___1K_chunks___10B-2      300          22274569 ns/op           0.00 MB/s
+Benchmark___10B_mux___1K_chunks__100B        100         143814971 ns/op           0.00 MB/s
+Benchmark___10B_mux___1K_chunks__100B-2      200          34125016 ns/op           0.00 MB/s
+Benchmark___10B_mux___1K_chunks___1KB        100         136987808 ns/op           0.00 MB/s
+Benchmark___10B_mux___1K_chunks___1KB-2      200          35831221 ns/op           0.00 MB/s
+Benchmark__100B_mux__100_chunks___10B        500          20748811 ns/op           0.01 MB/s
+Benchmark__100B_mux__100_chunks___10B-2     1000           7604070 ns/op           0.03 MB/s
+Benchmark__100B_mux__100_chunks__100B        300          21922577 ns/op           0.01 MB/s
+Benchmark__100B_mux__100_chunks__100B-2     1000           9164254 ns/op           0.02 MB/s
+Benchmark__100B_mux__100_chunks___1KB        300          23892634 ns/op           0.01 MB/s
+Benchmark__100B_mux__100_chunks___1KB-2     1000           9288578 ns/op           0.02 MB/s
+Benchmark__100B_mux___1K_chunks___10B        100         120357166 ns/op           0.00 MB/s
+Benchmark__100B_mux___1K_chunks___10B-2      300          23110788 ns/op           0.01 MB/s
+Benchmark__100B_mux___1K_chunks__100B        100         146211502 ns/op           0.00 MB/s
+Benchmark__100B_mux___1K_chunks__100B-2      200          36485527 ns/op           0.01 MB/s
+Benchmark__100B_mux___1K_chunks___1KB        100         145242261 ns/op           0.00 MB/s
+Benchmark__100B_mux___1K_chunks___1KB-2      200          37420006 ns/op           0.01 MB/s
 
 
 % The followings are the full output with histograms.
@@ -110,13 +110,13 @@
 ================================================================================
 Echo RPC
 ================================================================================
-Benchmark____1B	    5000	   2083384 ns/op	   0.00 MB/s
+Benchmark____1B	    3000	   2260153 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 3  Avg: 1.40
+Count: 3000  Min: 1  Max: 3  Avg: 1.54
 ------------------------------------------------------------
-[  1,   2)  3397   67.9%   67.9%  #######
-[  2,   3)  1201   24.0%   92.0%  ##
-[  3,   4)   402    8.0%  100.0%  #
+[  1,   2)  1754   58.5%   58.5%  ######
+[  2,   3)   864   28.8%   87.3%  ###
+[  3,   4)   382   12.7%  100.0%  #
 [  4,   5)     0    0.0%  100.0%  
 [  5,   6)     0    0.0%  100.0%  
 [  6,   7)     0    0.0%  100.0%  
@@ -131,37 +131,100 @@
 [ 15,  16)     0    0.0%  100.0%  
 [ 16,  17)     0    0.0%  100.0%  
 [ 17, inf)     0    0.0%  100.0%  
-Benchmark____1B-2	    5000	   2079227 ns/op	   0.00 MB/s
+Benchmark____1B-2	    3000	   2362339 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 3  Avg: 1.31
+Count: 3000  Min: 1  Max: 4  Avg: 1.98
 ------------------------------------------------------------
-[  1,   2)  4002   80.0%   80.0%  ########
-[  2,   3)   450    9.0%   89.0%  #
-[  3,   4)   548   11.0%  100.0%  #
-[  4,   5)     0    0.0%  100.0%  
+[  1,   2)   608   20.3%   20.3%  ##
+[  2,   3)  1864   62.1%   82.4%  ######
+[  3,   4)   520   17.3%   99.7%  ##
+[  4,   5)     8    0.3%  100.0%  
 [  5,   6)     0    0.0%  100.0%  
 [  6,   7)     0    0.0%  100.0%  
 [  7,   8)     0    0.0%  100.0%  
 [  8,   9)     0    0.0%  100.0%  
 [  9,  10)     0    0.0%  100.0%  
 [ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  13)     0    0.0%  100.0%  
-[ 13,  14)     0    0.0%  100.0%  
-[ 14,  15)     0    0.0%  100.0%  
-[ 15,  16)     0    0.0%  100.0%  
-[ 16,  17)     0    0.0%  100.0%  
-[ 17, inf)     0    0.0%  100.0%  
-Benchmark___10B	    5000	   2393875 ns/op	   0.01 MB/s
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  15)     0    0.0%  100.0%  
+[ 15,  17)     0    0.0%  100.0%  
+[ 17,  19)     0    0.0%  100.0%  
+[ 19,  21)     0    0.0%  100.0%  
+[ 21,  23)     0    0.0%  100.0%  
+[ 23, inf)     0    0.0%  100.0%  
+Benchmark___10B	    3000	   2595581 ns/op	   0.01 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 6  Avg: 1.77
+Count: 3000  Min: 2  Max: 5  Avg: 2.37
 ------------------------------------------------------------
-[  1,   2)  2689   53.8%   53.8%  #####
-[  2,   3)  1646   32.9%   86.7%  ###
-[  3,   4)    39    0.8%   87.5%  
-[  4,   5)   360    7.2%   94.7%  #
-[  5,   6)   265    5.3%  100.0%  #
-[  6,   7)     1    0.0%  100.0%  
+[  2,   3)  2459   82.0%   82.0%  ########
+[  3,   4)    45    1.5%   83.5%  
+[  4,   5)   437   14.6%   98.0%  #
+[  5,   6)    59    2.0%  100.0%  
+[  6,   7)     0    0.0%  100.0%  
+[  7,   8)     0    0.0%  100.0%  
+[  8,   9)     0    0.0%  100.0%  
+[  9,  10)     0    0.0%  100.0%  
+[ 10,  11)     0    0.0%  100.0%  
+[ 11,  12)     0    0.0%  100.0%  
+[ 12,  14)     0    0.0%  100.0%  
+[ 14,  16)     0    0.0%  100.0%  
+[ 16,  18)     0    0.0%  100.0%  
+[ 18,  20)     0    0.0%  100.0%  
+[ 20,  22)     0    0.0%  100.0%  
+[ 22,  24)     0    0.0%  100.0%  
+[ 24, inf)     0    0.0%  100.0%  
+Benchmark___10B-2	    3000	   2372671 ns/op	   0.01 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 1  Max: 5  Avg: 1.93
+------------------------------------------------------------
+[  1,   2)   866   28.9%   28.9%  ###
+[  2,   3)  1691   56.4%   85.2%  ######
+[  3,   4)   233    7.8%   93.0%  #
+[  4,   5)   201    6.7%   99.7%  #
+[  5,   6)     9    0.3%  100.0%  
+[  6,   7)     0    0.0%  100.0%  
+[  7,   8)     0    0.0%  100.0%  
+[  8,   9)     0    0.0%  100.0%  
+[  9,  11)     0    0.0%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  15)     0    0.0%  100.0%  
+[ 15,  17)     0    0.0%  100.0%  
+[ 17,  20)     0    0.0%  100.0%  
+[ 20,  23)     0    0.0%  100.0%  
+[ 23,  26)     0    0.0%  100.0%  
+[ 26,  29)     0    0.0%  100.0%  
+[ 29, inf)     0    0.0%  100.0%  
+Benchmark__100B	    3000	   2690733 ns/op	   0.07 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 2  Max: 7  Avg: 2.48
+------------------------------------------------------------
+[  2,   3)  2544   84.8%   84.8%  ########
+[  3,   4)    82    2.7%   87.5%  
+[  4,   5)     0    0.0%   87.5%  
+[  5,   6)   146    4.9%   92.4%  
+[  6,   7)   226    7.5%   99.9%  #
+[  7,   8)     2    0.1%  100.0%  
+[  8,   9)     0    0.0%  100.0%  
+[  9,  11)     0    0.0%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  15)     0    0.0%  100.0%  
+[ 15,  17)     0    0.0%  100.0%  
+[ 17,  20)     0    0.0%  100.0%  
+[ 20,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
+[ 27,  31)     0    0.0%  100.0%  
+[ 31,  35)     0    0.0%  100.0%  
+[ 35, inf)     0    0.0%  100.0%  
+Benchmark__100B-2	    3000	   2419120 ns/op	   0.08 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 1  Max: 6  Avg: 2.05
+------------------------------------------------------------
+[  1,   2)   647   21.6%   21.6%  ##
+[  2,   3)  2027   67.6%   89.1%  #######
+[  3,   4)     1    0.0%   89.2%  
+[  4,   5)   184    6.1%   95.3%  #
+[  5,   6)   128    4.3%   99.6%  
+[  6,   7)    13    0.4%  100.0%  
 [  7,   8)     0    0.0%  100.0%  
 [  8,  10)     0    0.0%  100.0%  
 [ 10,  12)     0    0.0%  100.0%  
@@ -173,14 +236,207 @@
 [ 26,  30)     0    0.0%  100.0%  
 [ 30,  34)     0    0.0%  100.0%  
 [ 34, inf)     0    0.0%  100.0%  
-Benchmark___10B-2	    5000	   2130395 ns/op	   0.01 MB/s
+Benchmark___1KB	    3000	   2498211 ns/op	   0.80 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 5  Avg: 1.34
+Count: 3000  Min: 1  Max: 10  Avg: 1.76
 ------------------------------------------------------------
-[  1,   2)  4228   84.6%   84.6%  ########
-[  2,   3)   249    5.0%   89.5%  
-[  3,   4)   110    2.2%   91.7%  
-[  4,   5)   412    8.2%  100.0%  #
+[  1,   2)  2191   73.0%   73.0%  #######
+[  2,   3)   449   15.0%   88.0%  #
+[  3,   4)    75    2.5%   90.5%  
+[  4,   5)     3    0.1%   90.6%  
+[  5,   6)     6    0.2%   90.8%  
+[  6,   8)   240    8.0%   98.8%  #
+[  8,  10)    35    1.2%  100.0%  
+[ 10,  12)     1    0.0%  100.0%  
+[ 12,  15)     0    0.0%  100.0%  
+[ 15,  18)     0    0.0%  100.0%  
+[ 18,  22)     0    0.0%  100.0%  
+[ 22,  27)     0    0.0%  100.0%  
+[ 27,  32)     0    0.0%  100.0%  
+[ 32,  38)     0    0.0%  100.0%  
+[ 38,  45)     0    0.0%  100.0%  
+[ 45,  54)     0    0.0%  100.0%  
+[ 54, inf)     0    0.0%  100.0%  
+Benchmark___1KB-2	    3000	   2244818 ns/op	   0.89 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 1  Max: 7  Avg: 1.62
+------------------------------------------------------------
+[  1,   2)  1949   65.0%   65.0%  ######
+[  2,   3)   795   26.5%   91.5%  ###
+[  3,   4)     0    0.0%   91.5%  
+[  4,   5)    63    2.1%   93.6%  
+[  5,   6)   112    3.7%   97.3%  
+[  6,   7)    72    2.4%   99.7%  
+[  7,   9)     9    0.3%  100.0%  
+[  9,  11)     0    0.0%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  15)     0    0.0%  100.0%  
+[ 15,  18)     0    0.0%  100.0%  
+[ 18,  21)     0    0.0%  100.0%  
+[ 21,  25)     0    0.0%  100.0%  
+[ 25,  29)     0    0.0%  100.0%  
+[ 29,  34)     0    0.0%  100.0%  
+[ 34,  40)     0    0.0%  100.0%  
+[ 40, inf)     0    0.0%  100.0%  
+Benchmark__10KB	    3000	   2740536 ns/op	   7.30 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 2  Max: 10  Avg: 2.62
+------------------------------------------------------------
+[  2,   3)  2652   88.4%   88.4%  #########
+[  3,   4)    72    2.4%   90.8%  
+[  4,   5)     0    0.0%   90.8%  
+[  5,   6)     0    0.0%   90.8%  
+[  6,   7)     0    0.0%   90.8%  
+[  7,   9)    93    3.1%   93.9%  
+[  9,  11)   183    6.1%  100.0%  #
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
+[ 27,  32)     0    0.0%  100.0%  
+[ 32,  38)     0    0.0%  100.0%  
+[ 38,  44)     0    0.0%  100.0%  
+[ 44,  52)     0    0.0%  100.0%  
+[ 52, inf)     0    0.0%  100.0%  
+Benchmark__10KB-2	    3000	   2394824 ns/op	   8.35 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 1  Max: 8  Avg: 1.84
+------------------------------------------------------------
+[  1,   2)  1531   51.0%   51.0%  #####
+[  2,   3)  1214   40.5%   91.5%  ####
+[  3,   4)     0    0.0%   91.5%  
+[  4,   5)     0    0.0%   91.5%  
+[  5,   6)    83    2.8%   94.3%  
+[  6,   7)    69    2.3%   96.6%  
+[  7,   9)   103    3.4%  100.0%  
+[  9,  11)     0    0.0%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
+[ 27,  32)     0    0.0%  100.0%  
+[ 32,  38)     0    0.0%  100.0%  
+[ 38,  44)     0    0.0%  100.0%  
+[ 44, inf)     0    0.0%  100.0%  
+Benchmark_100KB	    2000	   5581491 ns/op	  35.83 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 3  Max: 15  Avg: 4.93
+------------------------------------------------------------
+[  3,   4)  1253   62.7%   62.7%  ######
+[  4,   5)   259   13.0%   75.6%  #
+[  5,   6)   124    6.2%   81.8%  #
+[  6,   7)     1    0.1%   81.9%  
+[  7,   8)     0    0.0%   81.9%  
+[  8,  10)     0    0.0%   81.9%  
+[ 10,  12)    84    4.2%   86.1%  
+[ 12,  15)   274   13.7%   99.8%  #
+[ 15,  18)     5    0.2%  100.0%  
+[ 18,  22)     0    0.0%  100.0%  
+[ 22,  27)     0    0.0%  100.0%  
+[ 27,  33)     0    0.0%  100.0%  
+[ 33,  40)     0    0.0%  100.0%  
+[ 40,  48)     0    0.0%  100.0%  
+[ 48,  58)     0    0.0%  100.0%  
+[ 58,  69)     0    0.0%  100.0%  
+[ 69, inf)     0    0.0%  100.0%  
+Benchmark_100KB-2	    2000	   4127286 ns/op	  48.46 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 2  Max: 10  Avg: 3.78
+------------------------------------------------------------
+[  2,   3)   373   18.7%   18.7%  ##
+[  3,   4)  1286   64.3%   83.0%  ######
+[  4,   5)     0    0.0%   83.0%  
+[  5,   6)     0    0.0%   83.0%  
+[  6,   7)     0    0.0%   83.0%  
+[  7,   9)   116    5.8%   88.8%  #
+[  9,  11)   225   11.2%  100.0%  #
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
+[ 27,  32)     0    0.0%  100.0%  
+[ 32,  38)     0    0.0%  100.0%  
+[ 38,  44)     0    0.0%  100.0%  
+[ 44,  52)     0    0.0%  100.0%  
+[ 52, inf)     0    0.0%  100.0%  
+
+================================================================================
+Echo streaming RPC
+================================================================================
+Benchmark____1_chunk_____1B	    3000	   2744128 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 2  Max: 4  Avg: 2.31
+------------------------------------------------------------
+[  2,   3)  2072   69.1%   69.1%  #######
+[  3,   4)   921   30.7%   99.8%  ###
+[  4,   5)     7    0.2%  100.0%  
+[  5,   6)     0    0.0%  100.0%  
+[  6,   7)     0    0.0%  100.0%  
+[  7,   8)     0    0.0%  100.0%  
+[  8,   9)     0    0.0%  100.0%  
+[  9,  10)     0    0.0%  100.0%  
+[ 10,  11)     0    0.0%  100.0%  
+[ 11,  12)     0    0.0%  100.0%  
+[ 12,  13)     0    0.0%  100.0%  
+[ 13,  14)     0    0.0%  100.0%  
+[ 14,  15)     0    0.0%  100.0%  
+[ 15,  16)     0    0.0%  100.0%  
+[ 16,  17)     0    0.0%  100.0%  
+[ 17,  18)     0    0.0%  100.0%  
+[ 18, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk_____1B-2	    3000	   2347418 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 1  Max: 4  Avg: 2.18
+------------------------------------------------------------
+[  1,   2)    46    1.5%    1.5%  
+[  2,   3)  2381   79.4%   80.9%  ########
+[  3,   4)   567   18.9%   99.8%  ##
+[  4,   5)     6    0.2%  100.0%  
+[  5,   6)     0    0.0%  100.0%  
+[  6,   7)     0    0.0%  100.0%  
+[  7,   8)     0    0.0%  100.0%  
+[  8,   9)     0    0.0%  100.0%  
+[  9,  10)     0    0.0%  100.0%  
+[ 10,  11)     0    0.0%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  15)     0    0.0%  100.0%  
+[ 15,  17)     0    0.0%  100.0%  
+[ 17,  19)     0    0.0%  100.0%  
+[ 19,  21)     0    0.0%  100.0%  
+[ 21,  23)     0    0.0%  100.0%  
+[ 23, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk____10B	    3000	   2857309 ns/op	   0.01 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 2  Max: 5  Avg: 2.45
+------------------------------------------------------------
+[  2,   3)  2387   79.6%   79.6%  ########
+[  3,   4)    88    2.9%   82.5%  
+[  4,   5)   303   10.1%   92.6%  #
+[  5,   6)   222    7.4%  100.0%  #
+[  6,   7)     0    0.0%  100.0%  
+[  7,   8)     0    0.0%  100.0%  
+[  8,   9)     0    0.0%  100.0%  
+[  9,  10)     0    0.0%  100.0%  
+[ 10,  11)     0    0.0%  100.0%  
+[ 11,  12)     0    0.0%  100.0%  
+[ 12,  14)     0    0.0%  100.0%  
+[ 14,  16)     0    0.0%  100.0%  
+[ 16,  18)     0    0.0%  100.0%  
+[ 18,  20)     0    0.0%  100.0%  
+[ 20,  22)     0    0.0%  100.0%  
+[ 22,  24)     0    0.0%  100.0%  
+[ 24, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk____10B-2	    3000	   2363346 ns/op	   0.01 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 1  Max: 5  Avg: 2.18
+------------------------------------------------------------
+[  1,   2)    32    1.1%    1.1%  
+[  2,   3)  2535   84.5%   85.6%  ########
+[  3,   4)   293    9.8%   95.3%  #
+[  4,   5)   139    4.6%  100.0%  
 [  5,   6)     1    0.0%  100.0%  
 [  6,   7)     0    0.0%  100.0%  
 [  7,   8)     0    0.0%  100.0%  
@@ -194,38 +450,80 @@
 [ 23,  26)     0    0.0%  100.0%  
 [ 26,  29)     0    0.0%  100.0%  
 [ 29, inf)     0    0.0%  100.0%  
-Benchmark__100B	    5000	   2570157 ns/op	   0.08 MB/s
+Benchmark____1_chunk___100B	    3000	   2922993 ns/op	   0.07 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 10  Avg: 2.35
+Count: 3000  Min: 2  Max: 7  Avg: 2.50
 ------------------------------------------------------------
-[  1,   2)   627   12.5%   12.5%  #
-[  2,   3)  3834   76.7%   89.2%  ########
-[  3,   4)    95    1.9%   91.1%  
-[  4,   5)     6    0.1%   91.2%  
-[  5,   6)    22    0.4%   91.7%  
-[  6,   8)   254    5.1%   96.8%  #
-[  8,  10)   160    3.2%  100.0%  
-[ 10,  12)     2    0.0%  100.0%  
-[ 12,  15)     0    0.0%  100.0%  
-[ 15,  18)     0    0.0%  100.0%  
-[ 18,  22)     0    0.0%  100.0%  
-[ 22,  27)     0    0.0%  100.0%  
+[  2,   3)  2527   84.2%   84.2%  ########
+[  3,   4)   106    3.5%   87.8%  
+[  4,   5)     0    0.0%   87.8%  
+[  5,   6)    99    3.3%   91.1%  
+[  6,   7)   255    8.5%   99.6%  #
+[  7,   8)    13    0.4%  100.0%  
+[  8,   9)     0    0.0%  100.0%  
+[  9,  11)     0    0.0%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  15)     0    0.0%  100.0%  
+[ 15,  17)     0    0.0%  100.0%  
+[ 17,  20)     0    0.0%  100.0%  
+[ 20,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
+[ 27,  31)     0    0.0%  100.0%  
+[ 31,  35)     0    0.0%  100.0%  
+[ 35, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk___100B-2	    3000	   2558699 ns/op	   0.08 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 1  Max: 6  Avg: 2.28
+------------------------------------------------------------
+[  1,   2)     5    0.2%    0.2%  
+[  2,   3)  2673   89.1%   89.3%  #########
+[  3,   4)     2    0.1%   89.3%  
+[  4,   5)   177    5.9%   95.2%  #
+[  5,   6)    96    3.2%   98.4%  
+[  6,   7)    47    1.6%  100.0%  
+[  7,   8)     0    0.0%  100.0%  
+[  8,  10)     0    0.0%  100.0%  
+[ 10,  12)     0    0.0%  100.0%  
+[ 12,  14)     0    0.0%  100.0%  
+[ 14,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  22)     0    0.0%  100.0%  
+[ 22,  26)     0    0.0%  100.0%  
+[ 26,  30)     0    0.0%  100.0%  
+[ 30,  34)     0    0.0%  100.0%  
+[ 34, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk____1KB	    3000	   2646432 ns/op	   0.76 MB/s
+Histogram (unit: ms)
+Count: 3000  Min: 2  Max: 10  Avg: 2.49
+------------------------------------------------------------
+[  2,   3)  2647   88.2%   88.2%  #########
+[  3,   4)    71    2.4%   90.6%  
+[  4,   5)     4    0.1%   90.7%  
+[  5,   6)     0    0.0%   90.7%  
+[  6,   7)    67    2.2%   93.0%  
+[  7,   9)   209    7.0%   99.9%  #
+[  9,  11)     2    0.1%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
 [ 27,  32)     0    0.0%  100.0%  
 [ 32,  38)     0    0.0%  100.0%  
-[ 38,  45)     0    0.0%  100.0%  
-[ 45,  54)     0    0.0%  100.0%  
-[ 54, inf)     0    0.0%  100.0%  
-Benchmark__100B-2	    5000	   2313091 ns/op	   0.09 MB/s
+[ 38,  44)     0    0.0%  100.0%  
+[ 44,  52)     0    0.0%  100.0%  
+[ 52, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk____1KB-2	    3000	   2400649 ns/op	   0.83 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 7  Avg: 1.78
+Count: 3000  Min: 1  Max: 7  Avg: 2.01
 ------------------------------------------------------------
-[  1,   2)  2417   48.3%   48.3%  #####
-[  2,   3)  2204   44.1%   92.4%  ####
-[  3,   4)     0    0.0%   92.4%  
-[  4,   5)     0    0.0%   92.4%  
-[  5,   6)   229    4.6%   97.0%  
-[  6,   7)   123    2.5%   99.5%  
-[  7,   9)    27    0.5%  100.0%  
+[  1,   2)   864   28.8%   28.8%  ###
+[  2,   3)  1881   62.7%   91.5%  ######
+[  3,   4)     2    0.1%   91.6%  
+[  4,   5)    10    0.3%   91.9%  
+[  5,   6)   127    4.2%   96.1%  
+[  6,   7)    94    3.1%   99.3%  
+[  7,   9)    22    0.7%  100.0%  
 [  9,  11)     0    0.0%  100.0%  
 [ 11,  13)     0    0.0%  100.0%  
 [ 13,  15)     0    0.0%  100.0%  
@@ -236,103 +534,145 @@
 [ 29,  34)     0    0.0%  100.0%  
 [ 34,  40)     0    0.0%  100.0%  
 [ 40, inf)     0    0.0%  100.0%  
-Benchmark___1KB	    5000	   2441822 ns/op	   0.82 MB/s
+Benchmark____1_chunk___10KB	    3000	   2954627 ns/op	   6.77 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 12  Avg: 1.65
+Count: 3000  Min: 2  Max: 10  Avg: 2.65
 ------------------------------------------------------------
-[  1,   2)  4546   90.9%   90.9%  #########
-[  2,   3)    52    1.0%   92.0%  
-[  3,   4)     4    0.1%   92.0%  
-[  4,   5)    69    1.4%   93.4%  
-[  5,   6)     0    0.0%   93.4%  
-[  6,   8)     8    0.2%   93.6%  
-[  8,  10)    66    1.3%   94.9%  
-[ 10,  13)   255    5.1%  100.0%  #
+[  2,   3)  2621   87.4%   87.4%  #########
+[  3,   4)    93    3.1%   90.5%  
+[  4,   5)    13    0.4%   90.9%  
+[  5,   6)     0    0.0%   90.9%  
+[  6,   7)     0    0.0%   90.9%  
+[  7,   9)    99    3.3%   94.2%  
+[  9,  11)   174    5.8%  100.0%  #
+[ 11,  13)     0    0.0%  100.0%  
 [ 13,  16)     0    0.0%  100.0%  
-[ 16,  20)     0    0.0%  100.0%  
-[ 20,  24)     0    0.0%  100.0%  
-[ 24,  29)     0    0.0%  100.0%  
-[ 29,  35)     0    0.0%  100.0%  
-[ 35,  42)     0    0.0%  100.0%  
-[ 42,  51)     0    0.0%  100.0%  
-[ 51,  62)     0    0.0%  100.0%  
-[ 62, inf)     0    0.0%  100.0%  
-Benchmark___1KB-2	    5000	   2269425 ns/op	   0.88 MB/s
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
+[ 27,  32)     0    0.0%  100.0%  
+[ 32,  38)     0    0.0%  100.0%  
+[ 38,  44)     0    0.0%  100.0%  
+[ 44,  52)     0    0.0%  100.0%  
+[ 52, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk___10KB-2	    3000	   2546084 ns/op	   7.86 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 9  Avg: 1.61
+Count: 3000  Min: 1  Max: 8  Avg: 2.25
 ------------------------------------------------------------
-[  1,   2)  3458   69.2%   69.2%  #######
-[  2,   3)  1248   25.0%   94.1%  ##
-[  3,   4)     1    0.0%   94.1%  
-[  4,   5)     0    0.0%   94.1%  
-[  5,   6)     0    0.0%   94.1%  
-[  6,   8)   183    3.7%   97.8%  
-[  8,  10)   110    2.2%  100.0%  
-[ 10,  12)     0    0.0%  100.0%  
-[ 12,  15)     0    0.0%  100.0%  
-[ 15,  18)     0    0.0%  100.0%  
-[ 18,  22)     0    0.0%  100.0%  
-[ 22,  26)     0    0.0%  100.0%  
-[ 26,  31)     0    0.0%  100.0%  
-[ 31,  37)     0    0.0%  100.0%  
-[ 37,  43)     0    0.0%  100.0%  
-[ 43,  51)     0    0.0%  100.0%  
-[ 51, inf)     0    0.0%  100.0%  
-Benchmark__10KB	    5000	   2777789 ns/op	   7.20 MB/s
+[  1,   2)   414   13.8%   13.8%  #
+[  2,   3)  2335   77.8%   91.6%  ########
+[  3,   4)     0    0.0%   91.6%  
+[  4,   5)     0    0.0%   91.6%  
+[  5,   6)    37    1.2%   92.9%  
+[  6,   7)    88    2.9%   95.8%  
+[  7,   9)   126    4.2%  100.0%  
+[  9,  11)     0    0.0%  100.0%  
+[ 11,  13)     0    0.0%  100.0%  
+[ 13,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  27)     0    0.0%  100.0%  
+[ 27,  32)     0    0.0%  100.0%  
+[ 32,  38)     0    0.0%  100.0%  
+[ 38,  44)     0    0.0%  100.0%  
+[ 44, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk__100KB	    2000	   5517042 ns/op	  36.25 MB/s
 Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 16  Avg: 2.15
+Count: 2000  Min: 3  Max: 15  Avg: 4.82
 ------------------------------------------------------------
-[  1,   2)  2964   59.3%   59.3%  ######
-[  2,   3)  1640   32.8%   92.1%  ###
-[  3,   4)     3    0.1%   92.1%  
-[  4,   5)    47    0.9%   93.1%  
-[  5,   7)    30    0.6%   93.7%  
-[  7,   9)     0    0.0%   93.7%  
-[  9,  11)    17    0.3%   94.0%  
-[ 11,  14)   134    2.7%   96.7%  
-[ 14,  18)   165    3.3%  100.0%  
-[ 18,  23)     0    0.0%  100.0%  
-[ 23,  29)     0    0.0%  100.0%  
-[ 29,  36)     0    0.0%  100.0%  
-[ 36,  44)     0    0.0%  100.0%  
-[ 44,  54)     0    0.0%  100.0%  
-[ 54,  66)     0    0.0%  100.0%  
-[ 66,  80)     0    0.0%  100.0%  
-[ 80, inf)     0    0.0%  100.0%  
-Benchmark__10KB-2	    5000	   2320824 ns/op	   8.62 MB/s
-Histogram (unit: ms)
-Count: 5000  Min: 1  Max: 11  Avg: 1.58
-------------------------------------------------------------
-[  1,   2)  4005   80.1%   80.1%  ########
-[  2,   3)   703   14.1%   94.2%  #
-[  3,   4)     0    0.0%   94.2%  
-[  4,   5)     0    0.0%   94.2%  
-[  5,   6)     0    0.0%   94.2%  
-[  6,   8)     3    0.1%   94.2%  
-[  8,  10)   273    5.5%   99.7%  #
-[ 10,  12)    16    0.3%  100.0%  
-[ 12,  15)     0    0.0%  100.0%  
-[ 15,  18)     0    0.0%  100.0%  
+[  3,   4)  1247   62.4%   62.4%  ######
+[  4,   5)   256   12.8%   75.2%  #
+[  5,   6)   146    7.3%   82.5%  #
+[  6,   7)     0    0.0%   82.5%  
+[  7,   8)     0    0.0%   82.5%  
+[  8,  10)     0    0.0%   82.5%  
+[ 10,  12)   132    6.6%   89.1%  #
+[ 12,  15)   217   10.9%   99.9%  #
+[ 15,  18)     2    0.1%  100.0%  
 [ 18,  22)     0    0.0%  100.0%  
 [ 22,  27)     0    0.0%  100.0%  
 [ 27,  33)     0    0.0%  100.0%  
 [ 33,  40)     0    0.0%  100.0%  
 [ 40,  48)     0    0.0%  100.0%  
-[ 48,  57)     0    0.0%  100.0%  
-[ 57, inf)     0    0.0%  100.0%  
-Benchmark_100KB	    2000	   5462859 ns/op	  36.61 MB/s
+[ 48,  58)     0    0.0%  100.0%  
+[ 58,  69)     0    0.0%  100.0%  
+[ 69, inf)     0    0.0%  100.0%  
+Benchmark____1_chunk__100KB-2	    2000	   4157872 ns/op	  48.10 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 3  Max: 19  Avg: 4.80
+Count: 2000  Min: 2  Max: 11  Avg: 3.83
 ------------------------------------------------------------
-[  3,   4)  1609   80.5%   80.5%  ########
-[  4,   5)     8    0.4%   80.9%  
-[  5,   6)    51    2.6%   83.4%  
-[  6,   7)    84    4.2%   87.6%  
-[  7,   9)     0    0.0%   87.6%  
-[  9,  11)     0    0.0%   87.6%  
-[ 11,  14)     0    0.0%   87.6%  
-[ 14,  17)   135    6.8%   94.4%  #
-[ 17,  21)   113    5.7%  100.0%  #
+[  2,   3)   159    8.0%    8.0%  #
+[  3,   4)  1495   74.8%   82.7%  #######
+[  4,   5)    11    0.6%   83.2%  
+[  5,   6)     0    0.0%   83.2%  
+[  6,   7)     0    0.0%   83.2%  
+[  7,   9)   167    8.3%   91.6%  #
+[  9,  11)   166    8.3%   99.9%  #
+[ 11,  13)     2    0.1%  100.0%  
+[ 13,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  28)     0    0.0%  100.0%  
+[ 28,  33)     0    0.0%  100.0%  
+[ 33,  39)     0    0.0%  100.0%  
+[ 39,  46)     0    0.0%  100.0%  
+[ 46,  55)     0    0.0%  100.0%  
+[ 55, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks____1B	    2000	   4177247 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 2  Max: 17  Avg: 3.75
+------------------------------------------------------------
+[  2,   3)    49    2.5%    2.5%  
+[  3,   4)  1771   88.6%   91.0%  #########
+[  4,   5)     0    0.0%   91.0%  
+[  5,   6)     2    0.1%   91.1%  
+[  6,   8)    42    2.1%   93.2%  
+[  8,  10)     0    0.0%   93.2%  
+[ 10,  12)    33    1.7%   94.9%  
+[ 12,  15)    73    3.7%   98.5%  
+[ 15,  19)    30    1.5%  100.0%  
+[ 19,  24)     0    0.0%  100.0%  
+[ 24,  30)     0    0.0%  100.0%  
+[ 30,  37)     0    0.0%  100.0%  
+[ 37,  45)     0    0.0%  100.0%  
+[ 45,  55)     0    0.0%  100.0%  
+[ 55,  67)     0    0.0%  100.0%  
+[ 67,  81)     0    0.0%  100.0%  
+[ 81, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks____1B-2	    2000	   3432532 ns/op	   0.01 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 2  Max: 12  Avg: 2.82
+------------------------------------------------------------
+[  2,   3)  1276   63.8%   63.8%  ######
+[  3,   4)   541   27.1%   90.9%  ###
+[  4,   5)    45    2.2%   93.1%  
+[  5,   6)     0    0.0%   93.1%  
+[  6,   7)     0    0.0%   93.1%  
+[  7,   9)    41    2.1%   95.2%  
+[  9,  11)    68    3.4%   98.6%  
+[ 11,  13)    29    1.5%  100.0%  
+[ 13,  16)     0    0.0%  100.0%  
+[ 16,  19)     0    0.0%  100.0%  
+[ 19,  23)     0    0.0%  100.0%  
+[ 23,  28)     0    0.0%  100.0%  
+[ 28,  34)     0    0.0%  100.0%  
+[ 34,  41)     0    0.0%  100.0%  
+[ 41,  49)     0    0.0%  100.0%  
+[ 49,  58)     0    0.0%  100.0%  
+[ 58, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks___10B	    2000	   4664935 ns/op	   0.04 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 3  Max: 19  Avg: 3.94
+------------------------------------------------------------
+[  3,   4)  1739   87.0%   87.0%  #########
+[  4,   5)    94    4.7%   91.7%  
+[  5,   6)     0    0.0%   91.7%  
+[  6,   7)     9    0.5%   92.1%  
+[  7,   9)    26    1.3%   93.4%  
+[  9,  11)     0    0.0%   93.4%  
+[ 11,  14)    33    1.7%   95.1%  
+[ 14,  17)    63    3.2%   98.2%  
+[ 17,  21)    36    1.8%  100.0%  
 [ 21,  26)     0    0.0%  100.0%  
 [ 26,  32)     0    0.0%  100.0%  
 [ 32,  39)     0    0.0%  100.0%  
@@ -341,1002 +681,662 @@
 [ 59,  72)     0    0.0%  100.0%  
 [ 72,  88)     0    0.0%  100.0%  
 [ 88, inf)     0    0.0%  100.0%  
-Benchmark_100KB-2	    2000	   4058566 ns/op	  49.28 MB/s
+Benchmark___10_chunks___10B-2	    2000	   3548029 ns/op	   0.06 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 2  Max: 15  Avg: 3.57
+Count: 2000  Min: 2  Max: 14  Avg: 3.02
 ------------------------------------------------------------
-[  2,   3)   770   38.5%   38.5%  ####
-[  3,   4)   991   49.6%   88.1%  #####
-[  4,   5)     2    0.1%   88.2%  
-[  5,   6)     0    0.0%   88.2%  
-[  6,   7)     0    0.0%   88.2%  
-[  7,   9)     0    0.0%   88.2%  
-[  9,  11)    89    4.5%   92.6%  
-[ 11,  14)   147    7.4%  100.0%  #
+[  2,   3)   971   48.6%   48.6%  #####
+[  3,   4)   835   41.8%   90.3%  ####
+[  4,   5)    67    3.4%   93.7%  
+[  5,   6)     0    0.0%   93.7%  
+[  6,   7)     0    0.0%   93.7%  
+[  7,   9)    16    0.8%   94.5%  
+[  9,  11)    40    2.0%   96.5%  
+[ 11,  14)    70    3.5%  100.0%  
 [ 14,  17)     1    0.1%  100.0%  
 [ 17,  21)     0    0.0%  100.0%  
 [ 21,  26)     0    0.0%  100.0%  
 [ 26,  32)     0    0.0%  100.0%  
 [ 32,  39)     0    0.0%  100.0%  
+[ 39,  47)     0    0.0%  100.0%  
+[ 47,  57)     0    0.0%  100.0%  
+[ 57,  68)     0    0.0%  100.0%  
+[ 68, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks__100B	    2000	   4845710 ns/op	   0.41 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 3  Max: 20  Avg: 4.09
+------------------------------------------------------------
+[  3,   4)  1559   78.0%   78.0%  ########
+[  4,   5)   272   13.6%   91.6%  #
+[  5,   6)     1    0.1%   91.6%  
+[  6,   7)     0    0.0%   91.6%  
+[  7,   9)    43    2.1%   93.8%  
+[  9,  11)     1    0.1%   93.8%  
+[ 11,  14)     0    0.0%   93.8%  
+[ 14,  17)    44    2.2%   96.0%  
+[ 17,  21)    80    4.0%  100.0%  
+[ 21,  26)     0    0.0%  100.0%  
+[ 26,  32)     0    0.0%  100.0%  
+[ 32,  39)     0    0.0%  100.0%  
+[ 39,  48)     0    0.0%  100.0%  
+[ 48,  59)     0    0.0%  100.0%  
+[ 59,  73)     0    0.0%  100.0%  
+[ 73,  90)     0    0.0%  100.0%  
+[ 90, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks__100B-2	    2000	   3658666 ns/op	   0.55 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 2  Max: 14  Avg: 3.26
+------------------------------------------------------------
+[  2,   3)   567   28.4%   28.4%  ###
+[  3,   4)  1240   62.0%   90.4%  ######
+[  4,   5)    68    3.4%   93.8%  
+[  5,   6)     5    0.2%   94.0%  
+[  6,   7)     0    0.0%   94.0%  
+[  7,   9)     0    0.0%   94.0%  
+[  9,  11)    50    2.5%   96.5%  
+[ 11,  14)    62    3.1%   99.6%  
+[ 14,  17)     8    0.4%  100.0%  
+[ 17,  21)     0    0.0%  100.0%  
+[ 21,  26)     0    0.0%  100.0%  
+[ 26,  32)     0    0.0%  100.0%  
+[ 32,  39)     0    0.0%  100.0%  
+[ 39,  47)     0    0.0%  100.0%  
+[ 47,  57)     0    0.0%  100.0%  
+[ 57,  68)     0    0.0%  100.0%  
+[ 68, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks___1KB	    2000	   4971196 ns/op	   4.02 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 3  Max: 23  Avg: 4.37
+------------------------------------------------------------
+[  3,   4)  1222   61.1%   61.1%  ######
+[  4,   5)   620   31.0%   92.1%  ###
+[  5,   6)     0    0.0%   92.1%  
+[  6,   7)     0    0.0%   92.1%  
+[  7,   9)    31    1.6%   93.7%  
+[  9,  11)     1    0.1%   93.7%  
+[ 11,  14)     0    0.0%   93.7%  
+[ 14,  18)    32    1.6%   95.3%  
+[ 18,  22)    90    4.5%   99.8%  
+[ 22,  28)     4    0.2%  100.0%  
+[ 28,  35)     0    0.0%  100.0%  
+[ 35,  43)     0    0.0%  100.0%  
+[ 43,  53)     0    0.0%  100.0%  
+[ 53,  66)     0    0.0%  100.0%  
+[ 66,  82)     0    0.0%  100.0%  
+[ 82, 101)     0    0.0%  100.0%  
+[101, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks___1KB-2	    2000	   3662827 ns/op	   5.46 MB/s
+Histogram (unit: ms)
+Count: 2000  Min: 2  Max: 15  Avg: 3.11
+------------------------------------------------------------
+[  2,   3)  1012   50.6%   50.6%  #####
+[  3,   4)   794   39.7%   90.3%  ####
+[  4,   5)    67    3.4%   93.7%  
+[  5,   6)     4    0.2%   93.9%  
+[  6,   7)     0    0.0%   93.9%  
+[  7,   9)     0    0.0%   93.9%  
+[  9,  11)    25    1.2%   95.1%  
+[ 11,  14)    53    2.7%   97.8%  
+[ 14,  17)    45    2.2%  100.0%  
+[ 17,  21)     0    0.0%  100.0%  
+[ 21,  26)     0    0.0%  100.0%  
+[ 26,  32)     0    0.0%  100.0%  
+[ 32,  39)     0    0.0%  100.0%  
 [ 39,  48)     0    0.0%  100.0%  
 [ 48,  58)     0    0.0%  100.0%  
 [ 58,  70)     0    0.0%  100.0%  
 [ 70, inf)     0    0.0%  100.0%  
-
-================================================================================
-Echo streaming RPC
-================================================================================
-Benchmark____1_chunk_____1B	    2000	   5280468 ns/op	   0.00 MB/s
+Benchmark___10_chunks__10KB	    1000	   7533684 ns/op	  26.55 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 6  Avg: 4.61
+Count: 1000  Min: 5  Max: 26  Avg: 7.03
 ------------------------------------------------------------
-[  4,   5)   912   45.6%   45.6%  #####
-[  5,   6)   953   47.7%   93.2%  #####
-[  6,   7)   135    6.8%  100.0%  #
-[  7,   8)     0    0.0%  100.0%  
-[  8,   9)     0    0.0%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  13)     0    0.0%  100.0%  
-[ 13,  14)     0    0.0%  100.0%  
-[ 14,  15)     0    0.0%  100.0%  
-[ 15,  16)     0    0.0%  100.0%  
-[ 16,  17)     0    0.0%  100.0%  
-[ 17,  18)     0    0.0%  100.0%  
-[ 18,  19)     0    0.0%  100.0%  
-[ 19,  20)     0    0.0%  100.0%  
-[ 20, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk_____1B-2	    2000	   4850675 ns/op	   0.00 MB/s
+[  5,   6)   831   83.1%   83.1%  ########
+[  6,   7)     4    0.4%   83.5%  
+[  7,   8)     0    0.0%   83.5%  
+[  8,   9)    29    2.9%   86.4%  
+[  9,  11)    18    1.8%   88.2%  
+[ 11,  13)     0    0.0%   88.2%  
+[ 13,  16)     0    0.0%   88.2%  
+[ 16,  20)    39    3.9%   92.1%  
+[ 20,  25)    78    7.8%   99.9%  #
+[ 25,  31)     1    0.1%  100.0%  
+[ 31,  38)     0    0.0%  100.0%  
+[ 38,  47)     0    0.0%  100.0%  
+[ 47,  58)     0    0.0%  100.0%  
+[ 58,  71)     0    0.0%  100.0%  
+[ 71,  88)     0    0.0%  100.0%  
+[ 88, 108)     0    0.0%  100.0%  
+[108, inf)     0    0.0%  100.0%  
+Benchmark___10_chunks__10KB-2	    2000	   4922363 ns/op	  40.63 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 6  Avg: 4.26
+Count: 2000  Min: 3  Max: 18  Avg: 4.32
 ------------------------------------------------------------
-[  4,   5)  1489   74.5%   74.5%  #######
-[  5,   6)   506   25.3%   99.8%  ###
-[  6,   7)     5    0.2%  100.0%  
-[  7,   8)     0    0.0%  100.0%  
-[  8,   9)     0    0.0%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  13)     0    0.0%  100.0%  
-[ 13,  14)     0    0.0%  100.0%  
-[ 14,  15)     0    0.0%  100.0%  
-[ 15,  16)     0    0.0%  100.0%  
-[ 16,  17)     0    0.0%  100.0%  
-[ 17,  18)     0    0.0%  100.0%  
-[ 18,  19)     0    0.0%  100.0%  
-[ 19,  20)     0    0.0%  100.0%  
-[ 20, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk____10B	    2000	   5334596 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 7  Avg: 4.69
-------------------------------------------------------------
-[  4,   5)  1035   51.8%   51.8%  #####
-[  5,   6)   565   28.2%   80.0%  ###
-[  6,   7)   389   19.5%   99.5%  ##
-[  7,   8)    11    0.6%  100.0%  
-[  8,   9)     0    0.0%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  13)     0    0.0%  100.0%  
-[ 13,  14)     0    0.0%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  20)     0    0.0%  100.0%  
-[ 20,  22)     0    0.0%  100.0%  
-[ 22,  24)     0    0.0%  100.0%  
-[ 24,  26)     0    0.0%  100.0%  
-[ 26, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk____10B-2	    2000	   4867046 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 6  Avg: 4.21
-------------------------------------------------------------
-[  4,   5)  1631   81.6%   81.6%  ########
-[  5,   6)   316   15.8%   97.4%  ##
-[  6,   7)    53    2.7%  100.0%  
-[  7,   8)     0    0.0%  100.0%  
-[  8,   9)     0    0.0%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  13)     0    0.0%  100.0%  
-[ 13,  14)     0    0.0%  100.0%  
-[ 14,  15)     0    0.0%  100.0%  
-[ 15,  16)     0    0.0%  100.0%  
-[ 16,  17)     0    0.0%  100.0%  
-[ 17,  18)     0    0.0%  100.0%  
-[ 18,  19)     0    0.0%  100.0%  
-[ 19,  20)     0    0.0%  100.0%  
-[ 20, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk___100B	    2000	   5429984 ns/op	   0.04 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 9  Avg: 5.03
-------------------------------------------------------------
-[  4,   5)   512   25.6%   25.6%  ###
-[  5,   6)  1166   58.3%   83.9%  ######
-[  6,   7)    79    4.0%   87.9%  
-[  7,   8)   237   11.9%   99.7%  #
-[  8,   9)     5    0.2%  100.0%  
-[  9,  10)     1    0.1%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  13)     0    0.0%  100.0%  
-[ 13,  15)     0    0.0%  100.0%  
-[ 15,  17)     0    0.0%  100.0%  
-[ 17,  19)     0    0.0%  100.0%  
-[ 19,  22)     0    0.0%  100.0%  
-[ 22,  25)     0    0.0%  100.0%  
-[ 25,  29)     0    0.0%  100.0%  
-[ 29,  33)     0    0.0%  100.0%  
-[ 33,  37)     0    0.0%  100.0%  
-[ 37, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk___100B-2	    2000	   4913146 ns/op	   0.04 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 7  Avg: 4.28
-------------------------------------------------------------
-[  4,   5)  1694   84.7%   84.7%  ########
-[  5,   6)    54    2.7%   87.4%  
-[  6,   7)   245   12.2%   99.7%  #
-[  7,   8)     7    0.4%  100.0%  
-[  8,   9)     0    0.0%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  13)     0    0.0%  100.0%  
-[ 13,  14)     0    0.0%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  20)     0    0.0%  100.0%  
-[ 20,  22)     0    0.0%  100.0%  
-[ 22,  24)     0    0.0%  100.0%  
-[ 24,  26)     0    0.0%  100.0%  
-[ 26, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk____1KB	    2000	   5193539 ns/op	   0.39 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 8  Avg: 4.48
-------------------------------------------------------------
-[  4,   5)  1624   81.2%   81.2%  ########
-[  5,   6)   121    6.1%   87.2%  #
-[  6,   7)    19    1.0%   88.2%  
-[  7,   8)   138    6.9%   95.1%  #
-[  8,   9)    98    4.9%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  14)     0    0.0%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  20)     0    0.0%  100.0%  
-[ 20,  23)     0    0.0%  100.0%  
-[ 23,  26)     0    0.0%  100.0%  
-[ 26,  29)     0    0.0%  100.0%  
-[ 29,  32)     0    0.0%  100.0%  
-[ 32, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk____1KB-2	    2000	   4864711 ns/op	   0.41 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 7  Avg: 4.24
-------------------------------------------------------------
-[  4,   5)  1762   88.1%   88.1%  #########
-[  5,   6)     4    0.2%   88.3%  
-[  6,   7)   227   11.4%   99.7%  #
-[  7,   8)     7    0.4%  100.0%  
-[  8,   9)     0    0.0%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  13)     0    0.0%  100.0%  
-[ 13,  14)     0    0.0%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  20)     0    0.0%  100.0%  
-[ 20,  22)     0    0.0%  100.0%  
-[ 22,  24)     0    0.0%  100.0%  
-[ 24,  26)     0    0.0%  100.0%  
-[ 26, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk___10KB	    2000	   5472549 ns/op	   3.65 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 10  Avg: 4.73
-------------------------------------------------------------
-[  4,   5)  1418   70.9%   70.9%  #######
-[  5,   6)   298   14.9%   85.8%  #
-[  6,   7)    37    1.9%   87.7%  
-[  7,   8)    28    1.4%   89.1%  
-[  8,   9)   101    5.1%   94.1%  #
-[  9,  10)   116    5.8%   99.9%  #
-[ 10,  12)     2    0.1%  100.0%  
-[ 12,  14)     0    0.0%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  21)     0    0.0%  100.0%  
-[ 21,  24)     0    0.0%  100.0%  
-[ 24,  28)     0    0.0%  100.0%  
-[ 28,  32)     0    0.0%  100.0%  
-[ 32,  37)     0    0.0%  100.0%  
-[ 37,  43)     0    0.0%  100.0%  
-[ 43, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk___10KB-2	    2000	   4950905 ns/op	   4.04 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 8  Avg: 4.34
-------------------------------------------------------------
-[  4,   5)  1760   88.0%   88.0%  #########
-[  5,   6)     7    0.4%   88.4%  
-[  6,   7)    25    1.2%   89.6%  
-[  7,   8)   206   10.3%   99.9%  #
-[  8,   9)     2    0.1%  100.0%  
-[  9,  10)     0    0.0%  100.0%  
-[ 10,  11)     0    0.0%  100.0%  
-[ 11,  12)     0    0.0%  100.0%  
-[ 12,  14)     0    0.0%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  20)     0    0.0%  100.0%  
-[ 20,  23)     0    0.0%  100.0%  
-[ 23,  26)     0    0.0%  100.0%  
-[ 26,  29)     0    0.0%  100.0%  
-[ 29,  32)     0    0.0%  100.0%  
-[ 32, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk__100KB	    1000	   7896673 ns/op	  25.33 MB/s
-Histogram (unit: ms)
-Count: 1000  Min: 6  Max: 12  Avg: 7.24
-------------------------------------------------------------
-[  6,   7)   660   66.0%   66.0%  #######
-[  7,   8)   113   11.3%   77.3%  #
-[  8,   9)     6    0.6%   77.9%  
-[  9,  10)     0    0.0%   77.9%  
-[ 10,  11)    43    4.3%   82.2%  
-[ 11,  12)   128   12.8%   95.0%  #
-[ 12,  14)    50    5.0%  100.0%  #
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  20)     0    0.0%  100.0%  
-[ 20,  23)     0    0.0%  100.0%  
-[ 23,  26)     0    0.0%  100.0%  
-[ 26,  30)     0    0.0%  100.0%  
-[ 30,  34)     0    0.0%  100.0%  
-[ 34,  39)     0    0.0%  100.0%  
-[ 39,  45)     0    0.0%  100.0%  
-[ 45, inf)     0    0.0%  100.0%  
-Benchmark____1_chunk__100KB-2	    2000	   5976114 ns/op	  33.47 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 4  Max: 10  Avg: 5.67
-------------------------------------------------------------
-[  4,   5)     3    0.2%    0.2%  
-[  5,   6)  1574   78.7%   78.9%  ########
-[  6,   7)     2    0.1%   79.0%  
-[  7,   8)    25    1.2%   80.2%  
-[  8,   9)   296   14.8%   95.0%  #
-[  9,  10)    98    4.9%   99.9%  
-[ 10,  12)     2    0.1%  100.0%  
-[ 12,  14)     0    0.0%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  18)     0    0.0%  100.0%  
-[ 18,  21)     0    0.0%  100.0%  
-[ 21,  24)     0    0.0%  100.0%  
-[ 24,  28)     0    0.0%  100.0%  
-[ 28,  32)     0    0.0%  100.0%  
-[ 32,  37)     0    0.0%  100.0%  
-[ 37,  43)     0    0.0%  100.0%  
-[ 43, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks____1B	    2000	   6964499 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 5  Max: 15  Avg: 6.65
-------------------------------------------------------------
-[  5,   6)     1    0.1%    0.1%  
-[  6,   7)  1743   87.2%   87.2%  #########
-[  7,   8)    20    1.0%   88.2%  
-[  8,   9)    48    2.4%   90.6%  
-[  9,  10)     3    0.2%   90.8%  
-[ 10,  12)    62    3.1%   93.9%  
-[ 12,  14)    91    4.5%   98.4%  
-[ 14,  16)    32    1.6%  100.0%  
-[ 16,  19)     0    0.0%  100.0%  
-[ 19,  22)     0    0.0%  100.0%  
-[ 22,  26)     0    0.0%  100.0%  
-[ 26,  31)     0    0.0%  100.0%  
-[ 31,  37)     0    0.0%  100.0%  
-[ 37,  44)     0    0.0%  100.0%  
-[ 44,  52)     0    0.0%  100.0%  
-[ 52,  61)     0    0.0%  100.0%  
-[ 61, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks____1B-2	    2000	   5836079 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 5  Max: 11  Avg: 5.42
-------------------------------------------------------------
-[  5,   6)  1781   89.1%   89.1%  #########
-[  6,   7)    31    1.6%   90.6%  
-[  7,   8)     1    0.1%   90.7%  
-[  8,   9)    29    1.5%   92.1%  
-[  9,  10)    94    4.7%   96.8%  
-[ 10,  11)    49    2.5%   99.2%  
-[ 11,  13)    15    0.8%  100.0%  
-[ 13,  15)     0    0.0%  100.0%  
-[ 15,  17)     0    0.0%  100.0%  
-[ 17,  19)     0    0.0%  100.0%  
-[ 19,  22)     0    0.0%  100.0%  
-[ 22,  25)     0    0.0%  100.0%  
-[ 25,  29)     0    0.0%  100.0%  
-[ 29,  33)     0    0.0%  100.0%  
-[ 33,  38)     0    0.0%  100.0%  
-[ 38,  44)     0    0.0%  100.0%  
-[ 44, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks___10B	    1000	   7468897 ns/op	   0.03 MB/s
-Histogram (unit: ms)
-Count: 1000  Min: 6  Max: 20  Avg: 6.94
-------------------------------------------------------------
-[  6,   7)   841   84.1%   84.1%  ########
-[  7,   8)    30    3.0%   87.1%  
-[  8,   9)     2    0.2%   87.3%  
-[  9,  10)    31    3.1%   90.4%  
-[ 10,  12)     6    0.6%   91.0%  
-[ 12,  14)    29    2.9%   93.9%  
-[ 14,  16)    26    2.6%   96.5%  
-[ 16,  19)    32    3.2%   99.7%  
-[ 19,  23)     3    0.3%  100.0%  
-[ 23,  27)     0    0.0%  100.0%  
-[ 27,  32)     0    0.0%  100.0%  
-[ 32,  38)     0    0.0%  100.0%  
+[  3,   4)  1573   78.7%   78.7%  ########
+[  4,   5)   146    7.3%   86.0%  #
+[  5,   6)    53    2.7%   88.6%  
+[  6,   7)     0    0.0%   88.6%  
+[  7,   9)     0    0.0%   88.6%  
+[  9,  11)     3    0.2%   88.8%  
+[ 11,  13)    79    4.0%   92.7%  
+[ 13,  16)   107    5.4%   98.1%  #
+[ 16,  20)    39    2.0%  100.0%  
+[ 20,  25)     0    0.0%  100.0%  
+[ 25,  31)     0    0.0%  100.0%  
+[ 31,  38)     0    0.0%  100.0%  
 [ 38,  46)     0    0.0%  100.0%  
-[ 46,  55)     0    0.0%  100.0%  
-[ 55,  66)     0    0.0%  100.0%  
-[ 66,  80)     0    0.0%  100.0%  
-[ 80, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks___10B-2	    2000	   5896988 ns/op	   0.03 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 5  Max: 13  Avg: 5.45
-------------------------------------------------------------
-[  5,   6)  1795   89.8%   89.8%  #########
-[  6,   7)    31    1.6%   91.3%  
-[  7,   8)     0    0.0%   91.3%  
-[  8,   9)     7    0.4%   91.7%  
-[  9,  10)    35    1.8%   93.4%  
-[ 10,  12)   124    6.2%   99.6%  #
-[ 12,  14)     8    0.4%  100.0%  
-[ 14,  16)     0    0.0%  100.0%  
-[ 16,  19)     0    0.0%  100.0%  
-[ 19,  22)     0    0.0%  100.0%  
-[ 22,  26)     0    0.0%  100.0%  
-[ 26,  30)     0    0.0%  100.0%  
-[ 30,  35)     0    0.0%  100.0%  
-[ 35,  41)     0    0.0%  100.0%  
-[ 41,  47)     0    0.0%  100.0%  
-[ 47,  55)     0    0.0%  100.0%  
-[ 55, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks__100B	    2000	   7511902 ns/op	   0.27 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 6  Max: 20  Avg: 6.89
-------------------------------------------------------------
-[  6,   7)  1706   85.3%   85.3%  #########
-[  7,   8)    76    3.8%   89.1%  
-[  8,   9)     3    0.2%   89.2%  
-[  9,  10)    40    2.0%   91.2%  
-[ 10,  12)     7    0.4%   91.6%  
-[ 12,  14)    43    2.1%   93.8%  
-[ 14,  16)    10    0.5%   94.2%  
-[ 16,  19)   113    5.7%   99.9%  #
-[ 19,  23)     2    0.1%  100.0%  
-[ 23,  27)     0    0.0%  100.0%  
-[ 27,  32)     0    0.0%  100.0%  
-[ 32,  38)     0    0.0%  100.0%  
-[ 38,  46)     0    0.0%  100.0%  
-[ 46,  55)     0    0.0%  100.0%  
-[ 55,  66)     0    0.0%  100.0%  
-[ 66,  80)     0    0.0%  100.0%  
-[ 80, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks__100B-2	    2000	   5975725 ns/op	   0.33 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 5  Max: 14  Avg: 5.52
-------------------------------------------------------------
-[  5,   6)  1796   89.8%   89.8%  #########
-[  6,   7)    32    1.6%   91.4%  
-[  7,   8)    12    0.6%   92.0%  
-[  8,   9)     0    0.0%   92.0%  
-[  9,  10)     7    0.4%   92.4%  
-[ 10,  12)    97    4.9%   97.2%  
-[ 12,  14)    55    2.8%  100.0%  
-[ 14,  16)     1    0.1%  100.0%  
-[ 16,  19)     0    0.0%  100.0%  
-[ 19,  22)     0    0.0%  100.0%  
-[ 22,  26)     0    0.0%  100.0%  
-[ 26,  31)     0    0.0%  100.0%  
-[ 31,  36)     0    0.0%  100.0%  
-[ 36,  42)     0    0.0%  100.0%  
-[ 42,  49)     0    0.0%  100.0%  
-[ 49,  58)     0    0.0%  100.0%  
-[ 58, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks___1KB	    1000	   7678796 ns/op	   2.60 MB/s
-Histogram (unit: ms)
-Count: 1000  Min: 6  Max: 21  Avg: 7.07
-------------------------------------------------------------
-[  6,   7)   862   86.2%   86.2%  #########
-[  7,   8)    21    2.1%   88.3%  
-[  8,   9)     0    0.0%   88.3%  
-[  9,  10)     7    0.7%   89.0%  
-[ 10,  12)    27    2.7%   91.7%  
-[ 12,  14)     0    0.0%   91.7%  
-[ 14,  16)    23    2.3%   94.0%  
-[ 16,  19)    38    3.8%   97.8%  
-[ 19,  23)    22    2.2%  100.0%  
-[ 23,  28)     0    0.0%  100.0%  
-[ 28,  34)     0    0.0%  100.0%  
-[ 34,  41)     0    0.0%  100.0%  
-[ 41,  49)     0    0.0%  100.0%  
-[ 49,  59)     0    0.0%  100.0%  
-[ 59,  71)     0    0.0%  100.0%  
-[ 71,  85)     0    0.0%  100.0%  
-[ 85, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks___1KB-2	    2000	   6047220 ns/op	   3.31 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 5  Max: 14  Avg: 5.57
-------------------------------------------------------------
-[  5,   6)  1775   88.8%   88.8%  #########
-[  6,   7)    43    2.1%   90.9%  
-[  7,   8)    17    0.9%   91.8%  
-[  8,   9)     0    0.0%   91.8%  
-[  9,  10)     2    0.1%   91.9%  
-[ 10,  12)    87    4.4%   96.2%  
-[ 12,  14)    74    3.7%   99.9%  
-[ 14,  16)     2    0.1%  100.0%  
-[ 16,  19)     0    0.0%  100.0%  
-[ 19,  22)     0    0.0%  100.0%  
-[ 22,  26)     0    0.0%  100.0%  
-[ 26,  31)     0    0.0%  100.0%  
-[ 31,  36)     0    0.0%  100.0%  
-[ 36,  42)     0    0.0%  100.0%  
-[ 42,  49)     0    0.0%  100.0%  
-[ 49,  58)     0    0.0%  100.0%  
-[ 58, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks__10KB	    1000	   9913510 ns/op	  20.17 MB/s
-Histogram (unit: ms)
-Count: 1000  Min: 8  Max: 22  Avg: 9.63
-------------------------------------------------------------
-[  8,   9)   808   80.8%   80.8%  ########
-[  9,  10)     2    0.2%   81.0%  
-[ 10,  11)    33    3.3%   84.3%  
-[ 11,  12)    11    1.1%   85.4%  
-[ 12,  14)     0    0.0%   85.4%  
-[ 14,  16)     0    0.0%   85.4%  
-[ 16,  18)    37    3.7%   89.1%  
-[ 18,  21)    95    9.5%   98.6%  #
-[ 21,  25)    14    1.4%  100.0%  
-[ 25,  29)     0    0.0%  100.0%  
-[ 29,  34)     0    0.0%  100.0%  
-[ 34,  40)     0    0.0%  100.0%  
-[ 40,  48)     0    0.0%  100.0%  
-[ 48,  57)     0    0.0%  100.0%  
-[ 57,  68)     0    0.0%  100.0%  
+[ 46,  56)     0    0.0%  100.0%  
+[ 56,  68)     0    0.0%  100.0%  
 [ 68,  82)     0    0.0%  100.0%  
 [ 82, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks__10KB-2	    2000	   7066239 ns/op	  28.30 MB/s
+Benchmark___10_chunks_100KB	     200	  31539312 ns/op	  63.41 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 5  Max: 15  Avg: 6.56
+Count: 200  Min: 22  Max: 40  Avg: 30.91
 ------------------------------------------------------------
-[  5,   6)   710   35.5%   35.5%  ####
-[  6,   7)   971   48.6%   84.1%  #####
-[  7,   8)    34    1.7%   85.8%  
-[  8,   9)     0    0.0%   85.8%  
-[  9,  10)     0    0.0%   85.8%  
-[ 10,  12)    56    2.8%   88.6%  
-[ 12,  14)   201   10.1%   98.6%  #
-[ 14,  16)    28    1.4%  100.0%  
-[ 16,  19)     0    0.0%  100.0%  
-[ 19,  22)     0    0.0%  100.0%  
-[ 22,  26)     0    0.0%  100.0%  
-[ 26,  31)     0    0.0%  100.0%  
-[ 31,  37)     0    0.0%  100.0%  
-[ 37,  44)     0    0.0%  100.0%  
-[ 44,  52)     0    0.0%  100.0%  
-[ 52,  61)     0    0.0%  100.0%  
-[ 61, inf)     0    0.0%  100.0%  
-Benchmark___10_chunks_100KB	     500	  32109490 ns/op	  62.29 MB/s
+[ 22,  23)    1    0.5%    0.5%  
+[ 23,  24)    1    0.5%    1.0%  
+[ 24,  25)   69   34.5%   35.5%  ###
+[ 25,  26)   22   11.0%   46.5%  #
+[ 26,  28)    7    3.5%   50.0%  
+[ 28,  30)    0    0.0%   50.0%  
+[ 30,  33)    0    0.0%   50.0%  
+[ 33,  36)    0    0.0%   50.0%  
+[ 36,  40)   95   47.5%   97.5%  #####
+[ 40,  45)    5    2.5%  100.0%  
+[ 45,  51)    0    0.0%  100.0%  
+[ 51,  59)    0    0.0%  100.0%  
+[ 59,  69)    0    0.0%  100.0%  
+[ 69,  81)    0    0.0%  100.0%  
+[ 81,  95)    0    0.0%  100.0%  
+[ 95, 112)    0    0.0%  100.0%  
+[112, inf)    0    0.0%  100.0%  
+Benchmark___10_chunks_100KB-2	     500	  18574440 ns/op	 107.67 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 24  Max: 41  Avg: 31.61
+Count: 500  Min: 12  Max: 27  Avg: 18.10
 ------------------------------------------------------------
-[ 24,  25)   55   11.0%   11.0%  #
-[ 25,  26)  105   21.0%   32.0%  ##
-[ 26,  27)   50   10.0%   42.0%  #
-[ 27,  28)   10    2.0%   44.0%  
-[ 28,  30)    2    0.4%   44.4%  
-[ 30,  32)    0    0.0%   44.4%  
-[ 32,  35)   23    4.6%   49.0%  
-[ 35,  38)  157   31.4%   80.4%  ###
-[ 38,  42)   98   19.6%  100.0%  ##
-[ 42,  47)    0    0.0%  100.0%  
-[ 47,  53)    0    0.0%  100.0%  
-[ 53,  60)    0    0.0%  100.0%  
-[ 60,  69)    0    0.0%  100.0%  
-[ 69,  80)    0    0.0%  100.0%  
-[ 80,  94)    0    0.0%  100.0%  
-[ 94, 111)    0    0.0%  100.0%  
-[111, inf)    0    0.0%  100.0%  
-Benchmark___10_chunks_100KB-2	     500	  18957196 ns/op	 105.50 MB/s
+[ 12,  13)   79   15.8%   15.8%  ##
+[ 13,  14)  168   33.6%   49.4%  ###
+[ 14,  15)   12    2.4%   51.8%  
+[ 15,  16)    1    0.2%   52.0%  
+[ 16,  18)    0    0.0%   52.0%  
+[ 18,  20)    0    0.0%   52.0%  
+[ 20,  22)   30    6.0%   58.0%  #
+[ 22,  25)   94   18.8%   76.8%  ##
+[ 25,  29)  116   23.2%  100.0%  ##
+[ 29,  34)    0    0.0%  100.0%  
+[ 34,  40)    0    0.0%  100.0%  
+[ 40,  47)    0    0.0%  100.0%  
+[ 47,  55)    0    0.0%  100.0%  
+[ 55,  65)    0    0.0%  100.0%  
+[ 65,  77)    0    0.0%  100.0%  
+[ 77,  91)    0    0.0%  100.0%  
+[ 91, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks____1B	     500	  18036549 ns/op	   0.01 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 14  Max: 24  Avg: 18.47
+Count: 500  Min: 14  Max: 41  Avg: 17.44
 ------------------------------------------------------------
-[ 14,  15)  155   31.0%   31.0%  ###
-[ 15,  16)   78   15.6%   46.6%  ##
-[ 16,  17)    0    0.0%   46.6%  
-[ 17,  18)    0    0.0%   46.6%  
-[ 18,  19)    0    0.0%   46.6%  
-[ 19,  21)   33    6.6%   53.2%  #
-[ 21,  23)  121   24.2%   77.4%  ##
-[ 23,  25)  113   22.6%  100.0%  ##
-[ 25,  28)    0    0.0%  100.0%  
-[ 28,  31)    0    0.0%  100.0%  
-[ 31,  35)    0    0.0%  100.0%  
-[ 35,  40)    0    0.0%  100.0%  
-[ 40,  46)    0    0.0%  100.0%  
-[ 46,  53)    0    0.0%  100.0%  
-[ 53,  61)    0    0.0%  100.0%  
-[ 61,  70)    0    0.0%  100.0%  
-[ 70, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks____1B	     500	  23105522 ns/op	   0.01 MB/s
+[ 14,  15)  280   56.0%   56.0%  ######
+[ 15,  16)  106   21.2%   77.2%  ##
+[ 16,  17)   10    2.0%   79.2%  
+[ 17,  18)    1    0.2%   79.4%  
+[ 18,  20)    6    1.2%   80.6%  
+[ 20,  23)   22    4.4%   85.0%  
+[ 23,  26)    0    0.0%   85.0%  
+[ 26,  30)   16    3.2%   88.2%  
+[ 30,  35)   27    5.4%   93.6%  #
+[ 35,  42)   32    6.4%  100.0%  #
+[ 42,  51)    0    0.0%  100.0%  
+[ 51,  62)    0    0.0%  100.0%  
+[ 62,  75)    0    0.0%  100.0%  
+[ 75,  92)    0    0.0%  100.0%  
+[ 92, 113)    0    0.0%  100.0%  
+[113, 140)    0    0.0%  100.0%  
+[140, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks____1B-2	    1000	  12395699 ns/op	   0.02 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 16  Max: 40  Avg: 22.54
+Count: 1000  Min: 7  Max: 31  Avg: 11.90
 ------------------------------------------------------------
-[ 16,  17)    1    0.2%    0.2%  
-[ 17,  18)   14    2.8%    3.0%  
-[ 18,  19)   47    9.4%   12.4%  #
-[ 19,  20)   90   18.0%   30.4%  ##
-[ 20,  22)  213   42.6%   73.0%  ####
-[ 22,  24)   21    4.2%   77.2%  
-[ 24,  27)   20    4.0%   81.2%  
-[ 27,  31)   11    2.2%   83.4%  
-[ 31,  36)   63   12.6%   96.0%  #
-[ 36,  42)   20    4.0%  100.0%  
-[ 42,  50)    0    0.0%  100.0%  
-[ 50,  60)    0    0.0%  100.0%  
-[ 60,  72)    0    0.0%  100.0%  
-[ 72,  87)    0    0.0%  100.0%  
-[ 87, 106)    0    0.0%  100.0%  
-[106, 130)    0    0.0%  100.0%  
-[130, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks____1B-2	    1000	  14962218 ns/op	   0.01 MB/s
+[  7,   8)    26    2.6%    2.6%  
+[  8,   9)    14    1.4%    4.0%  
+[  9,  10)   171   17.1%   21.1%  ##
+[ 10,  11)   528   52.8%   73.9%  #####
+[ 11,  13)    71    7.1%   81.0%  #
+[ 13,  15)    23    2.3%   83.3%  
+[ 15,  18)     8    0.8%   84.1%  
+[ 18,  22)    68    6.8%   90.9%  #
+[ 22,  27)    89    8.9%   99.8%  #
+[ 27,  33)     2    0.2%  100.0%  
+[ 33,  41)     0    0.0%  100.0%  
+[ 41,  51)     0    0.0%  100.0%  
+[ 51,  63)     0    0.0%  100.0%  
+[ 63,  78)     0    0.0%  100.0%  
+[ 78,  97)     0    0.0%  100.0%  
+[ 97, 121)     0    0.0%  100.0%  
+[121, inf)     0    0.0%  100.0%  
+Benchmark__100_chunks___10B	     300	  20669375 ns/op	   0.10 MB/s
 Histogram (unit: ms)
-Count: 1000  Min: 11  Max: 25  Avg: 14.46
+Count: 300  Min: 17  Max: 39  Avg: 20.31
 ------------------------------------------------------------
-[ 11,  12)     5    0.5%    0.5%  
-[ 12,  13)   376   37.6%   38.1%  ####
-[ 13,  14)   375   37.5%   75.6%  ####
-[ 14,  15)    39    3.9%   79.5%  
-[ 15,  17)    13    1.3%   80.8%  
-[ 17,  19)     4    0.4%   81.2%  
-[ 19,  21)    26    2.6%   83.8%  
-[ 21,  24)   107   10.7%   94.5%  #
-[ 24,  28)    55    5.5%  100.0%  #
-[ 28,  32)     0    0.0%  100.0%  
-[ 32,  37)     0    0.0%  100.0%  
-[ 37,  43)     0    0.0%  100.0%  
-[ 43,  51)     0    0.0%  100.0%  
-[ 51,  60)     0    0.0%  100.0%  
-[ 60,  71)     0    0.0%  100.0%  
-[ 71,  85)     0    0.0%  100.0%  
-[ 85, inf)     0    0.0%  100.0%  
-Benchmark__100_chunks___10B	     500	  24822827 ns/op	   0.08 MB/s
+[ 17,  18)  228   76.0%   76.0%  ########
+[ 18,  19)    8    2.7%   78.7%  
+[ 19,  20)    2    0.7%   79.3%  
+[ 20,  21)    0    0.0%   79.3%  
+[ 21,  23)    3    1.0%   80.3%  
+[ 23,  25)   12    4.0%   84.3%  
+[ 25,  28)    0    0.0%   84.3%  
+[ 28,  32)    0    0.0%   84.3%  
+[ 32,  37)   15    5.0%   89.3%  #
+[ 37,  43)   32   10.7%  100.0%  #
+[ 43,  50)    0    0.0%  100.0%  
+[ 50,  59)    0    0.0%  100.0%  
+[ 59,  70)    0    0.0%  100.0%  
+[ 70,  84)    0    0.0%  100.0%  
+[ 84, 101)    0    0.0%  100.0%  
+[101, 122)    0    0.0%  100.0%  
+[122, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks___10B-2	     500	  12634978 ns/op	   0.16 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 20  Max: 41  Avg: 24.42
+Count: 500  Min: 9  Max: 27  Avg: 12.11
 ------------------------------------------------------------
-[ 20,  21)   61   12.2%   12.2%  #
-[ 21,  22)  294   58.8%   71.0%  ######
-[ 22,  23)   16    3.2%   74.2%  
-[ 23,  24)    4    0.8%   75.0%  
-[ 24,  26)   20    4.0%   79.0%  
-[ 26,  28)    5    1.0%   80.0%  
-[ 28,  31)    7    1.4%   81.4%  
-[ 31,  35)   12    2.4%   83.8%  
-[ 35,  40)   38    7.6%   91.4%  #
-[ 40,  46)   43    8.6%  100.0%  #
-[ 46,  53)    0    0.0%  100.0%  
+[  9,  10)   69   13.8%   13.8%  #
+[ 10,  11)  287   57.4%   71.2%  ######
+[ 11,  12)   47    9.4%   80.6%  #
+[ 12,  13)   10    2.0%   82.6%  
+[ 13,  15)    8    1.6%   84.2%  
+[ 15,  17)    0    0.0%   84.2%  
+[ 17,  20)    5    1.0%   85.2%  
+[ 20,  23)   28    5.6%   90.8%  #
+[ 23,  27)   43    8.6%   99.4%  #
+[ 27,  32)    3    0.6%  100.0%  
+[ 32,  38)    0    0.0%  100.0%  
+[ 38,  46)    0    0.0%  100.0%  
+[ 46,  56)    0    0.0%  100.0%  
+[ 56,  68)    0    0.0%  100.0%  
+[ 68,  82)    0    0.0%  100.0%  
+[ 82,  99)    0    0.0%  100.0%  
+[ 99, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks__100B	     300	  23164692 ns/op	   0.86 MB/s
+Histogram (unit: ms)
+Count: 300  Min: 19  Max: 42  Avg: 22.72
+------------------------------------------------------------
+[ 19,  20)  209   69.7%   69.7%  #######
+[ 20,  21)   17    5.7%   75.3%  #
+[ 21,  22)    6    2.0%   77.3%  
+[ 22,  23)    1    0.3%   77.7%  
+[ 23,  25)    1    0.3%   78.0%  
+[ 25,  27)   17    5.7%   83.7%  #
+[ 27,  30)    0    0.0%   83.7%  
+[ 30,  34)    0    0.0%   83.7%  
+[ 34,  39)   19    6.3%   90.0%  #
+[ 39,  45)   30   10.0%  100.0%  #
+[ 45,  53)    0    0.0%  100.0%  
 [ 53,  62)    0    0.0%  100.0%  
-[ 62,  73)    0    0.0%  100.0%  
-[ 73,  86)    0    0.0%  100.0%  
-[ 86, 103)    0    0.0%  100.0%  
-[103, 123)    0    0.0%  100.0%  
-[123, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks___10B-2	     500	  15143142 ns/op	   0.13 MB/s
+[ 62,  74)    0    0.0%  100.0%  
+[ 74,  89)    0    0.0%  100.0%  
+[ 89, 107)    0    0.0%  100.0%  
+[107, 129)    0    0.0%  100.0%  
+[129, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks__100B-2	     500	  13821225 ns/op	   1.45 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 11  Max: 25  Avg: 14.63
+Count: 500  Min: 10  Max: 29  Avg: 13.29
 ------------------------------------------------------------
-[ 11,  12)    1    0.2%    0.2%  
-[ 12,  13)  126   25.2%   25.4%  ###
-[ 13,  14)  238   47.6%   73.0%  #####
-[ 14,  15)   35    7.0%   80.0%  #
-[ 15,  17)    6    1.2%   81.2%  
-[ 17,  19)    0    0.0%   81.2%  
-[ 19,  21)   10    2.0%   83.2%  
-[ 21,  24)   52   10.4%   93.6%  #
-[ 24,  28)   32    6.4%  100.0%  #
-[ 28,  32)    0    0.0%  100.0%  
-[ 32,  37)    0    0.0%  100.0%  
-[ 37,  43)    0    0.0%  100.0%  
-[ 43,  51)    0    0.0%  100.0%  
-[ 51,  60)    0    0.0%  100.0%  
-[ 60,  71)    0    0.0%  100.0%  
-[ 71,  85)    0    0.0%  100.0%  
-[ 85, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks__100B	     500	  25825032 ns/op	   0.77 MB/s
+[ 10,  11)   47    9.4%    9.4%  #
+[ 11,  12)  307   61.4%   70.8%  ######
+[ 12,  13)   46    9.2%   80.0%  #
+[ 13,  14)    9    1.8%   81.8%  
+[ 14,  16)    9    1.8%   83.6%  
+[ 16,  18)    0    0.0%   83.6%  
+[ 18,  21)    5    1.0%   84.6%  
+[ 21,  24)   25    5.0%   89.6%  #
+[ 24,  28)   49    9.8%   99.4%  #
+[ 28,  33)    3    0.6%  100.0%  
+[ 33,  40)    0    0.0%  100.0%  
+[ 40,  48)    0    0.0%  100.0%  
+[ 48,  58)    0    0.0%  100.0%  
+[ 58,  70)    0    0.0%  100.0%  
+[ 70,  85)    0    0.0%  100.0%  
+[ 85, 103)    0    0.0%  100.0%  
+[103, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks___1KB	     300	  26071439 ns/op	   7.67 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 22  Max: 41  Avg: 25.23
+Count: 300  Min: 20  Max: 48  Avg: 25.72
 ------------------------------------------------------------
-[ 22,  23)  336   67.2%   67.2%  #######
-[ 23,  24)   29    5.8%   73.0%  #
-[ 24,  25)    9    1.8%   74.8%  
-[ 25,  26)    0    0.0%   74.8%  
-[ 26,  28)   16    3.2%   78.0%  
-[ 28,  30)   14    2.8%   80.8%  
-[ 30,  33)    5    1.0%   81.8%  
-[ 33,  36)   24    4.8%   86.6%  
-[ 36,  40)   63   12.6%   99.2%  #
-[ 40,  45)    4    0.8%  100.0%  
-[ 45,  52)    0    0.0%  100.0%  
-[ 52,  60)    0    0.0%  100.0%  
-[ 60,  70)    0    0.0%  100.0%  
-[ 70,  82)    0    0.0%  100.0%  
-[ 82,  97)    0    0.0%  100.0%  
-[ 97, 115)    0    0.0%  100.0%  
-[115, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks__100B-2	     500	  16276252 ns/op	   1.23 MB/s
+[ 20,  21)    1    0.3%    0.3%  
+[ 21,  22)  195   65.0%   65.3%  #######
+[ 22,  23)   13    4.3%   69.7%  
+[ 23,  24)    5    1.7%   71.3%  
+[ 24,  26)    0    0.0%   71.3%  
+[ 26,  29)   23    7.7%   79.0%  #
+[ 29,  32)    0    0.0%   79.0%  
+[ 32,  36)    0    0.0%   79.0%  
+[ 36,  41)   23    7.7%   86.7%  #
+[ 41,  48)   39   13.0%   99.7%  #
+[ 48,  57)    1    0.3%  100.0%  
+[ 57,  68)    0    0.0%  100.0%  
+[ 68,  82)    0    0.0%  100.0%  
+[ 82,  99)    0    0.0%  100.0%  
+[ 99, 121)    0    0.0%  100.0%  
+[121, 148)    0    0.0%  100.0%  
+[148, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks___1KB-2	     500	  15738134 ns/op	  12.71 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 13  Max: 28  Avg: 15.75
+Count: 500  Min: 11  Max: 30  Avg: 15.24
 ------------------------------------------------------------
-[ 13,  14)  153   30.6%   30.6%  ###
-[ 14,  15)  208   41.6%   72.2%  ####
-[ 15,  16)   32    6.4%   78.6%  #
-[ 16,  17)    6    1.2%   79.8%  
-[ 17,  19)    5    1.0%   80.8%  
-[ 19,  21)    3    0.6%   81.4%  
-[ 21,  23)   19    3.8%   85.2%  
-[ 23,  26)   52   10.4%   95.6%  #
-[ 26,  30)   22    4.4%  100.0%  
-[ 30,  35)    0    0.0%  100.0%  
-[ 35,  41)    0    0.0%  100.0%  
-[ 41,  48)    0    0.0%  100.0%  
-[ 48,  56)    0    0.0%  100.0%  
-[ 56,  66)    0    0.0%  100.0%  
-[ 66,  78)    0    0.0%  100.0%  
-[ 78,  92)    0    0.0%  100.0%  
-[ 92, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks___1KB	     500	  29567438 ns/op	   6.76 MB/s
+[ 11,  12)   19    3.8%    3.8%  
+[ 12,  13)  253   50.6%   54.4%  #####
+[ 13,  14)   97   19.4%   73.8%  ##
+[ 14,  15)   11    2.2%   76.0%  
+[ 15,  17)   15    3.0%   79.0%  
+[ 17,  19)    0    0.0%   79.0%  
+[ 19,  22)    3    0.6%   79.6%  
+[ 22,  25)   28    5.6%   85.2%  #
+[ 25,  29)   61   12.2%   97.4%  #
+[ 29,  34)   13    2.6%  100.0%  
+[ 34,  41)    0    0.0%  100.0%  
+[ 41,  49)    0    0.0%  100.0%  
+[ 49,  59)    0    0.0%  100.0%  
+[ 59,  71)    0    0.0%  100.0%  
+[ 71,  86)    0    0.0%  100.0%  
+[ 86, 104)    0    0.0%  100.0%  
+[104, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks__10KB	     100	  50248311 ns/op	  39.80 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 24  Max: 47  Avg: 29.00
+Count: 100  Min: 37  Max: 60  Avg: 49.72
 ------------------------------------------------------------
-[ 24,  25)  230   46.0%   46.0%  #####
-[ 25,  26)   80   16.0%   62.0%  ##
-[ 26,  27)   29    5.8%   67.8%  #
-[ 27,  28)    3    0.6%   68.4%  
-[ 28,  30)   24    4.8%   73.2%  
-[ 30,  32)   12    2.4%   75.6%  
-[ 32,  35)    1    0.2%   75.8%  
-[ 35,  39)   15    3.0%   78.8%  
-[ 39,  44)   62   12.4%   91.2%  #
-[ 44,  50)   44    8.8%  100.0%  #
-[ 50,  58)    0    0.0%  100.0%  
-[ 58,  67)    0    0.0%  100.0%  
+[ 37,  38)    4    4.0%    4.0%  
+[ 38,  39)    7    7.0%   11.0%  #
+[ 39,  40)    6    6.0%   17.0%  #
+[ 40,  41)    5    5.0%   22.0%  #
+[ 41,  43)   18   18.0%   40.0%  ##
+[ 43,  45)    0    0.0%   40.0%  
+[ 45,  48)    0    0.0%   40.0%  
+[ 48,  52)    0    0.0%   40.0%  
+[ 52,  57)   24   24.0%   64.0%  ##
+[ 57,  63)   36   36.0%  100.0%  ####
+[ 63,  71)    0    0.0%  100.0%  
+[ 71,  80)    0    0.0%  100.0%  
+[ 80,  92)    0    0.0%  100.0%  
+[ 92, 107)    0    0.0%  100.0%  
+[107, 125)    0    0.0%  100.0%  
+[125, 147)    0    0.0%  100.0%  
+[147, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks__10KB-2	     300	  28614761 ns/op	  69.89 MB/s
+Histogram (unit: ms)
+Count: 300  Min: 19  Max: 38  Avg: 28.11
+------------------------------------------------------------
+[ 19,  20)    7    2.3%    2.3%  
+[ 20,  21)   55   18.3%   20.7%  ##
+[ 21,  22)   43   14.3%   35.0%  #
+[ 22,  23)    9    3.0%   38.0%  
+[ 23,  25)    3    1.0%   39.0%  
+[ 25,  27)    0    0.0%   39.0%  
+[ 27,  30)    3    1.0%   40.0%  
+[ 30,  33)   84   28.0%   68.0%  ###
+[ 33,  37)   94   31.3%   99.3%  ###
+[ 37,  42)    2    0.7%  100.0%  
+[ 42,  49)    0    0.0%  100.0%  
+[ 49,  57)    0    0.0%  100.0%  
+[ 57,  67)    0    0.0%  100.0%  
 [ 67,  79)    0    0.0%  100.0%  
 [ 79,  94)    0    0.0%  100.0%  
 [ 94, 112)    0    0.0%  100.0%  
-[112, 134)    0    0.0%  100.0%  
-[134, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks___1KB-2	     500	  18167929 ns/op	  11.01 MB/s
+[112, inf)    0    0.0%  100.0%  
+Benchmark__100_chunks_100KB	      30	 272889576 ns/op	  73.29 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 13  Max: 30  Avg: 17.65
+Count: 30  Min: 267  Max: 292  Avg: 272.40
 ------------------------------------------------------------
-[ 13,  14)    1    0.2%    0.2%  
-[ 14,  15)   64   12.8%   13.0%  #
-[ 15,  16)  237   47.4%   60.4%  #####
-[ 16,  17)   62   12.4%   72.8%  #
-[ 17,  19)   12    2.4%   75.2%  
-[ 19,  21)    3    0.6%   75.8%  
-[ 21,  24)   14    2.8%   78.6%  
-[ 24,  27)   67   13.4%   92.0%  #
-[ 27,  31)   40    8.0%  100.0%  #
-[ 31,  36)    0    0.0%  100.0%  
-[ 36,  42)    0    0.0%  100.0%  
-[ 42,  49)    0    0.0%  100.0%  
-[ 49,  58)    0    0.0%  100.0%  
-[ 58,  69)    0    0.0%  100.0%  
-[ 69,  83)    0    0.0%  100.0%  
-[ 83, 100)    0    0.0%  100.0%  
-[100, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks__10KB	     100	  52974498 ns/op	  37.75 MB/s
+[267, 268)   3   10.0%   10.0%  #
+[268, 269)   8   26.7%   36.7%  ###
+[269, 270)   4   13.3%   50.0%  #
+[270, 271)   4   13.3%   63.3%  #
+[271, 273)   4   13.3%   76.7%  #
+[273, 275)   1    3.3%   80.0%  
+[275, 278)   1    3.3%   83.3%  
+[278, 282)   0    0.0%   83.3%  
+[282, 287)   1    3.3%   86.7%  
+[287, 293)   4   13.3%  100.0%  #
+[293, 301)   0    0.0%  100.0%  
+[301, 311)   0    0.0%  100.0%  
+[311, 324)   0    0.0%  100.0%  
+[324, 340)   0    0.0%  100.0%  
+[340, 360)   0    0.0%  100.0%  
+[360, 384)   0    0.0%  100.0%  
+[384, inf)   0    0.0%  100.0%  
+Benchmark__100_chunks_100KB-2	      50	 149680912 ns/op	 133.62 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 41  Max: 60  Avg: 52.43
+Count: 50  Min: 138  Max: 158  Avg: 149.14
 ------------------------------------------------------------
-[ 41,  42)    2    2.0%    2.0%  
-[ 42,  43)    0    0.0%    2.0%  
-[ 43,  44)    6    6.0%    8.0%  #
-[ 44,  45)   26   26.0%   34.0%  ###
-[ 45,  47)    0    0.0%   34.0%  
-[ 47,  49)    0    0.0%   34.0%  
-[ 49,  52)    0    0.0%   34.0%  
-[ 52,  55)    0    0.0%   34.0%  
-[ 55,  59)   51   51.0%   85.0%  #####
-[ 59,  64)   15   15.0%  100.0%  ##
-[ 64,  71)    0    0.0%  100.0%  
-[ 71,  79)    0    0.0%  100.0%  
-[ 79,  89)    0    0.0%  100.0%  
-[ 89, 101)    0    0.0%  100.0%  
-[101, 116)    0    0.0%  100.0%  
-[116, 134)    0    0.0%  100.0%  
-[134, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks__10KB-2	     500	  30197012 ns/op	  66.23 MB/s
+[138, 139)   2    4.0%    4.0%  
+[139, 140)   0    0.0%    4.0%  
+[140, 141)   0    0.0%    4.0%  
+[141, 142)   2    4.0%    8.0%  
+[142, 144)   4    8.0%   16.0%  #
+[144, 146)   4    8.0%   24.0%  #
+[146, 149)   6   12.0%   36.0%  #
+[149, 153)  20   40.0%   76.0%  ####
+[153, 157)  11   22.0%   98.0%  ##
+[157, 163)   1    2.0%  100.0%  
+[163, 170)   0    0.0%  100.0%  
+[170, 178)   0    0.0%  100.0%  
+[178, 188)   0    0.0%  100.0%  
+[188, 201)   0    0.0%  100.0%  
+[201, 217)   0    0.0%  100.0%  
+[217, 236)   0    0.0%  100.0%  
+[236, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks____1B	     100	 111621410 ns/op	   0.02 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 22  Max: 49  Avg: 29.68
+Count: 100  Min: 93  Max: 120  Avg: 111.11
 ------------------------------------------------------------
-[ 22,  23)   65   13.0%   13.0%  #
-[ 23,  24)   75   15.0%   28.0%  ##
-[ 24,  25)   19    3.8%   31.8%  
-[ 25,  26)    0    0.0%   31.8%  
-[ 26,  28)    0    0.0%   31.8%  
-[ 28,  31)   14    2.8%   34.6%  
-[ 31,  34)  278   55.6%   90.2%  ######
-[ 34,  38)   35    7.0%   97.2%  #
-[ 38,  43)    2    0.4%   97.6%  
-[ 43,  50)   12    2.4%  100.0%  
-[ 50,  59)    0    0.0%  100.0%  
-[ 59,  70)    0    0.0%  100.0%  
-[ 70,  83)    0    0.0%  100.0%  
-[ 83, 100)    0    0.0%  100.0%  
-[100, 121)    0    0.0%  100.0%  
-[121, 148)    0    0.0%  100.0%  
-[148, inf)    0    0.0%  100.0%  
-Benchmark__100_chunks_100KB	      50	 259344427 ns/op	  77.12 MB/s
+[ 93,  94)    1    1.0%    1.0%  
+[ 94,  95)    0    0.0%    1.0%  
+[ 95,  96)    0    0.0%    1.0%  
+[ 96,  97)    0    0.0%    1.0%  
+[ 97,  99)    0    0.0%    1.0%  
+[ 99, 102)   17   17.0%   18.0%  ##
+[102, 105)   12   12.0%   30.0%  #
+[105, 109)    1    1.0%   31.0%  
+[109, 114)    6    6.0%   37.0%  #
+[114, 121)   63   63.0%  100.0%  ######
+[121, 130)    0    0.0%  100.0%  
+[130, 141)    0    0.0%  100.0%  
+[141, 154)    0    0.0%  100.0%  
+[154, 171)    0    0.0%  100.0%  
+[171, 192)    0    0.0%  100.0%  
+[192, 219)    0    0.0%  100.0%  
+[219, inf)    0    0.0%  100.0%  
+Benchmark___1K_chunks____1B-2	     100	 103311101 ns/op	   0.02 MB/s
 Histogram (unit: ms)
-Count: 50  Min: 249  Max: 278  Avg: 258.80
+Count: 100  Min: 62  Max: 168  Avg: 102.82
 ------------------------------------------------------------
-[249, 250)   1    2.0%    2.0%  
-[250, 251)   2    4.0%    6.0%  
-[251, 252)   7   14.0%   20.0%  #
-[252, 253)   5   10.0%   30.0%  #
-[253, 255)   7   14.0%   44.0%  #
-[255, 258)   2    4.0%   48.0%  
-[258, 261)   7   14.0%   62.0%  #
-[261, 265)   6   12.0%   74.0%  #
-[265, 271)   8   16.0%   90.0%  ##
-[271, 278)   4    8.0%   98.0%  #
-[278, 287)   1    2.0%  100.0%  
-[287, 298)   0    0.0%  100.0%  
-[298, 312)   0    0.0%  100.0%  
-[312, 330)   0    0.0%  100.0%  
-[330, 353)   0    0.0%  100.0%  
-[353, 381)   0    0.0%  100.0%  
-[381, inf)   0    0.0%  100.0%  
-Benchmark__100_chunks_100KB-2	     100	 138213866 ns/op	 144.70 MB/s
+[ 62,  63)    1    1.0%    1.0%  
+[ 63,  64)    0    0.0%    1.0%  
+[ 64,  65)    0    0.0%    1.0%  
+[ 65,  67)    0    0.0%    1.0%  
+[ 67,  70)    0    0.0%    1.0%  
+[ 70,  74)    1    1.0%    2.0%  
+[ 74,  80)    2    2.0%    4.0%  
+[ 80,  88)    2    2.0%    6.0%  
+[ 88, 100)   23   23.0%   29.0%  ##
+[100, 116)   61   61.0%   90.0%  ######
+[116, 138)    9    9.0%   99.0%  #
+[138, 168)    0    0.0%   99.0%  
+[168, 209)    1    1.0%  100.0%  
+[209, 265)    0    0.0%  100.0%  
+[265, 342)    0    0.0%  100.0%  
+[342, 447)    0    0.0%  100.0%  
+[447, inf)    0    0.0%  100.0%  
+Benchmark___1K_chunks___10B	      50	 189580683 ns/op	   0.11 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 127  Max: 147  Avg: 137.69
+Count: 50  Min: 181  Max: 210  Avg: 189.10
 ------------------------------------------------------------
-[127, 128)    2    2.0%    2.0%  
-[128, 129)    1    1.0%    3.0%  
-[129, 130)    4    4.0%    7.0%  
-[130, 131)    0    0.0%    7.0%  
-[131, 133)    1    1.0%    8.0%  
-[133, 135)    4    4.0%   12.0%  
-[135, 138)   26   26.0%   38.0%  ###
-[138, 142)   56   56.0%   94.0%  ######
-[142, 146)    3    3.0%   97.0%  
-[146, 152)    3    3.0%  100.0%  
-[152, 159)    0    0.0%  100.0%  
-[159, 167)    0    0.0%  100.0%  
-[167, 177)    0    0.0%  100.0%  
-[177, 190)    0    0.0%  100.0%  
-[190, 206)    0    0.0%  100.0%  
-[206, 225)    0    0.0%  100.0%  
-[225, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunks____1B	     100	 140929084 ns/op	   0.01 MB/s
+[181, 182)   2    4.0%    4.0%  
+[182, 183)   0    0.0%    4.0%  
+[183, 184)   1    2.0%    6.0%  
+[184, 185)   1    2.0%    8.0%  
+[185, 187)  16   32.0%   40.0%  ###
+[187, 190)  20   40.0%   80.0%  ####
+[190, 193)   2    4.0%   84.0%  
+[193, 197)   1    2.0%   86.0%  
+[197, 203)   3    6.0%   92.0%  #
+[203, 210)   3    6.0%   98.0%  #
+[210, 219)   1    2.0%  100.0%  
+[219, 230)   0    0.0%  100.0%  
+[230, 244)   0    0.0%  100.0%  
+[244, 262)   0    0.0%  100.0%  
+[262, 285)   0    0.0%  100.0%  
+[285, 313)   0    0.0%  100.0%  
+[313, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks___10B-2	     100	 107068429 ns/op	   0.19 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 121  Max: 159  Avg: 140.44
+Count: 100  Min: 98  Max: 124  Avg: 106.53
 ------------------------------------------------------------
-[121, 122)    3    3.0%    3.0%  
-[122, 123)    6    6.0%    9.0%  #
-[123, 124)    1    1.0%   10.0%  
-[124, 126)    8    8.0%   18.0%  #
-[126, 128)    4    4.0%   22.0%  
-[128, 131)    3    3.0%   25.0%  
-[131, 135)    4    4.0%   29.0%  
-[135, 140)    1    1.0%   30.0%  
-[140, 146)   16   16.0%   46.0%  ##
-[146, 154)   53   53.0%   99.0%  #####
-[154, 165)    1    1.0%  100.0%  
-[165, 179)    0    0.0%  100.0%  
-[179, 197)    0    0.0%  100.0%  
-[197, 220)    0    0.0%  100.0%  
-[220, 249)    0    0.0%  100.0%  
-[249, 286)    0    0.0%  100.0%  
-[286, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunks____1B-2	     100	 105473615 ns/op	   0.02 MB/s
+[ 98,  99)    1    1.0%    1.0%  
+[ 99, 100)    0    0.0%    1.0%  
+[100, 101)    5    5.0%    6.0%  #
+[101, 102)   12   12.0%   18.0%  #
+[102, 104)   20   20.0%   38.0%  ##
+[104, 106)   18   18.0%   56.0%  ##
+[106, 109)   23   23.0%   79.0%  ##
+[109, 113)    4    4.0%   83.0%  
+[113, 118)    7    7.0%   90.0%  #
+[118, 125)   10   10.0%  100.0%  #
+[125, 133)    0    0.0%  100.0%  
+[133, 143)    0    0.0%  100.0%  
+[143, 156)    0    0.0%  100.0%  
+[156, 172)    0    0.0%  100.0%  
+[172, 192)    0    0.0%  100.0%  
+[192, 217)    0    0.0%  100.0%  
+[217, inf)    0    0.0%  100.0%  
+Benchmark___1K_chunks__100B	      30	 223128293 ns/op	   0.90 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 73  Max: 120  Avg: 104.93
+Count: 30  Min: 210  Max: 241  Avg: 222.53
 ------------------------------------------------------------
-[ 73,  74)    1    1.0%    1.0%  
-[ 74,  75)    0    0.0%    1.0%  
-[ 75,  76)    1    1.0%    2.0%  
-[ 76,  78)    1    1.0%    3.0%  
-[ 78,  80)    0    0.0%    3.0%  
-[ 80,  83)    0    0.0%    3.0%  
-[ 83,  87)    4    4.0%    7.0%  
-[ 87,  93)    5    5.0%   12.0%  #
-[ 93, 100)   10   10.0%   22.0%  #
-[100, 110)   52   52.0%   74.0%  #####
-[110, 123)   26   26.0%  100.0%  ###
-[123, 139)    0    0.0%  100.0%  
-[139, 160)    0    0.0%  100.0%  
-[160, 188)    0    0.0%  100.0%  
-[188, 224)    0    0.0%  100.0%  
-[224, 270)    0    0.0%  100.0%  
-[270, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunks___10B	      50	 200076160 ns/op	   0.10 MB/s
+[210, 211)   1    3.3%    3.3%  
+[211, 212)   0    0.0%    3.3%  
+[212, 213)   0    0.0%    3.3%  
+[213, 214)   0    0.0%    3.3%  
+[214, 216)   2    6.7%   10.0%  #
+[216, 219)   8   26.7%   36.7%  ###
+[219, 222)   8   26.7%   63.3%  ###
+[222, 226)   5   16.7%   80.0%  ##
+[226, 232)   0    0.0%   80.0%  
+[232, 239)   5   16.7%   96.7%  ##
+[239, 248)   1    3.3%  100.0%  
+[248, 260)   0    0.0%  100.0%  
+[260, 275)   0    0.0%  100.0%  
+[275, 294)   0    0.0%  100.0%  
+[294, 318)   0    0.0%  100.0%  
+[318, 348)   0    0.0%  100.0%  
+[348, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks__100B-2	      50	 125690815 ns/op	   1.59 MB/s
 Histogram (unit: ms)
-Count: 50  Min: 190  Max: 219  Avg: 199.56
+Count: 50  Min: 117  Max: 142  Avg: 125.22
 ------------------------------------------------------------
-[190, 191)   2    4.0%    4.0%  
-[191, 192)   3    6.0%   10.0%  #
-[192, 193)   5   10.0%   20.0%  #
-[193, 194)   2    4.0%   24.0%  
-[194, 196)   8   16.0%   40.0%  ##
-[196, 199)   8   16.0%   56.0%  ##
-[199, 202)   4    8.0%   64.0%  #
-[202, 206)   7   14.0%   78.0%  #
-[206, 212)   7   14.0%   92.0%  #
-[212, 219)   3    6.0%   98.0%  #
-[219, 228)   1    2.0%  100.0%  
-[228, 239)   0    0.0%  100.0%  
-[239, 253)   0    0.0%  100.0%  
-[253, 271)   0    0.0%  100.0%  
-[271, 294)   0    0.0%  100.0%  
-[294, 322)   0    0.0%  100.0%  
-[322, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunks___10B-2	     100	 112141677 ns/op	   0.18 MB/s
+[117, 118)   4    8.0%    8.0%  #
+[118, 119)   1    2.0%   10.0%  
+[119, 120)   1    2.0%   12.0%  
+[120, 121)   8   16.0%   28.0%  ##
+[121, 123)   9   18.0%   46.0%  ##
+[123, 125)   9   18.0%   64.0%  ##
+[125, 128)   6   12.0%   76.0%  #
+[128, 132)   2    4.0%   80.0%  
+[132, 137)   5   10.0%   90.0%  #
+[137, 143)   5   10.0%  100.0%  #
+[143, 151)   0    0.0%  100.0%  
+[151, 161)   0    0.0%  100.0%  
+[161, 174)   0    0.0%  100.0%  
+[174, 190)   0    0.0%  100.0%  
+[190, 210)   0    0.0%  100.0%  
+[210, 234)   0    0.0%  100.0%  
+[234, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks___1KB	      30	 251956982 ns/op	   7.94 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 102  Max: 125  Avg: 111.64
+Count: 30  Min: 238  Max: 266  Avg: 251.50
 ------------------------------------------------------------
-[102, 103)    1    1.0%    1.0%  
-[103, 104)    2    2.0%    3.0%  
-[104, 105)    2    2.0%    5.0%  
-[105, 106)    9    9.0%   14.0%  #
-[106, 108)   13   13.0%   27.0%  #
-[108, 110)   22   22.0%   49.0%  ##
-[110, 113)   15   15.0%   64.0%  ##
-[113, 117)   13   13.0%   77.0%  #
-[117, 122)   11   11.0%   88.0%  #
-[122, 128)   12   12.0%  100.0%  #
-[128, 136)    0    0.0%  100.0%  
-[136, 145)    0    0.0%  100.0%  
-[145, 157)    0    0.0%  100.0%  
-[157, 172)    0    0.0%  100.0%  
-[172, 190)    0    0.0%  100.0%  
-[190, 212)    0    0.0%  100.0%  
-[212, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunks__100B	      50	 227795062 ns/op	   0.88 MB/s
+[238, 239)   1    3.3%    3.3%  
+[239, 240)   0    0.0%    3.3%  
+[240, 241)   1    3.3%    6.7%  
+[241, 242)   0    0.0%    6.7%  
+[242, 244)   3   10.0%   16.7%  #
+[244, 247)   7   23.3%   40.0%  ##
+[247, 250)   3   10.0%   50.0%  #
+[250, 254)   3   10.0%   60.0%  #
+[254, 259)   1    3.3%   63.3%  
+[259, 266)  10   33.3%   96.7%  ###
+[266, 275)   1    3.3%  100.0%  
+[275, 286)   0    0.0%  100.0%  
+[286, 300)   0    0.0%  100.0%  
+[300, 317)   0    0.0%  100.0%  
+[317, 339)   0    0.0%  100.0%  
+[339, 366)   0    0.0%  100.0%  
+[366, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks___1KB-2	      50	 144214400 ns/op	  13.87 MB/s
 Histogram (unit: ms)
-Count: 50  Min: 216  Max: 251  Avg: 227.34
+Count: 50  Min: 130  Max: 158  Avg: 143.70
 ------------------------------------------------------------
-[216, 217)   1    2.0%    2.0%  
-[217, 218)   1    2.0%    4.0%  
-[218, 219)   2    4.0%    8.0%  
-[219, 221)   4    8.0%   16.0%  #
-[221, 223)   7   14.0%   30.0%  #
-[223, 226)  12   24.0%   54.0%  ##
-[226, 230)   6   12.0%   66.0%  #
-[230, 235)   9   18.0%   84.0%  ##
-[235, 241)   5   10.0%   94.0%  #
-[241, 249)   2    4.0%   98.0%  
-[249, 259)   1    2.0%  100.0%  
-[259, 272)   0    0.0%  100.0%  
-[272, 289)   0    0.0%  100.0%  
-[289, 310)   0    0.0%  100.0%  
-[310, 337)   0    0.0%  100.0%  
-[337, 371)   0    0.0%  100.0%  
-[371, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunks__100B-2	     100	 127584568 ns/op	   1.57 MB/s
+[130, 131)   1    2.0%    2.0%  
+[131, 132)   0    0.0%    2.0%  
+[132, 133)   1    2.0%    4.0%  
+[133, 134)   6   12.0%   16.0%  #
+[134, 136)   6   12.0%   28.0%  #
+[136, 139)   4    8.0%   36.0%  #
+[139, 142)   6   12.0%   48.0%  #
+[142, 146)   1    2.0%   50.0%  
+[146, 151)  13   26.0%   76.0%  ###
+[151, 158)   9   18.0%   94.0%  ##
+[158, 167)   3    6.0%  100.0%  #
+[167, 178)   0    0.0%  100.0%  
+[178, 192)   0    0.0%  100.0%  
+[192, 209)   0    0.0%  100.0%  
+[209, 231)   0    0.0%  100.0%  
+[231, 258)   0    0.0%  100.0%  
+[258, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks__10KB	      20	 474946063 ns/op	  42.11 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 117  Max: 143  Avg: 127.04
+Count: 20  Min: 458  Max: 492  Avg: 474.60
 ------------------------------------------------------------
-[117, 118)    1    1.0%    1.0%  
-[118, 119)    1    1.0%    2.0%  
-[119, 120)    0    0.0%    2.0%  
-[120, 121)    6    6.0%    8.0%  #
-[121, 123)   23   23.0%   31.0%  ##
-[123, 125)   22   22.0%   53.0%  ##
-[125, 128)   10   10.0%   63.0%  #
-[128, 132)    7    7.0%   70.0%  #
-[132, 137)   20   20.0%   90.0%  ##
-[137, 144)   10   10.0%  100.0%  #
-[144, 152)    0    0.0%  100.0%  
-[152, 162)    0    0.0%  100.0%  
-[162, 175)    0    0.0%  100.0%  
-[175, 191)    0    0.0%  100.0%  
-[191, 211)    0    0.0%  100.0%  
-[211, 236)    0    0.0%  100.0%  
-[236, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunks___1KB	      50	 260678247 ns/op	   7.67 MB/s
+[458, 459)   1    5.0%    5.0%  #
+[459, 460)   0    0.0%    5.0%  
+[460, 461)   1    5.0%   10.0%  #
+[461, 463)   3   15.0%   25.0%  ##
+[463, 465)   1    5.0%   30.0%  #
+[465, 468)   4   20.0%   50.0%  ##
+[468, 472)   0    0.0%   50.0%  
+[472, 477)   0    0.0%   50.0%  
+[477, 483)   1    5.0%   55.0%  #
+[483, 491)   8   40.0%   95.0%  ####
+[491, 501)   1    5.0%  100.0%  #
+[501, 514)   0    0.0%  100.0%  
+[514, 530)   0    0.0%  100.0%  
+[530, 551)   0    0.0%  100.0%  
+[551, 577)   0    0.0%  100.0%  
+[577, 610)   0    0.0%  100.0%  
+[610, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks__10KB-2	      30	 267531367 ns/op	  74.76 MB/s
 Histogram (unit: ms)
-Count: 50  Min: 243  Max: 291  Avg: 260.18
+Count: 30  Min: 250  Max: 294  Avg: 267.07
 ------------------------------------------------------------
-[243, 244)   2    4.0%    4.0%  
-[244, 245)   0    0.0%    4.0%  
-[245, 246)   2    4.0%    8.0%  
-[246, 248)   1    2.0%   10.0%  
-[248, 250)   5   10.0%   20.0%  #
-[250, 253)   5   10.0%   30.0%  #
-[253, 257)   5   10.0%   40.0%  #
-[257, 263)   7   14.0%   54.0%  #
-[263, 270)  17   34.0%   88.0%  ###
-[270, 280)   3    6.0%   94.0%  #
-[280, 293)   3    6.0%  100.0%  #
-[293, 310)   0    0.0%  100.0%  
-[310, 332)   0    0.0%  100.0%  
-[332, 360)   0    0.0%  100.0%  
-[360, 397)   0    0.0%  100.0%  
-[397, 444)   0    0.0%  100.0%  
-[444, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunks___1KB-2	     100	 147406551 ns/op	  13.57 MB/s
-Histogram (unit: ms)
-Count: 100  Min: 134  Max: 160  Avg: 146.88
-------------------------------------------------------------
-[134, 135)    3    3.0%    3.0%  
-[135, 136)    1    1.0%    4.0%  
-[136, 137)    5    5.0%    9.0%  #
-[137, 138)    3    3.0%   12.0%  
-[138, 140)    8    8.0%   20.0%  #
-[140, 142)    6    6.0%   26.0%  #
-[142, 145)   12   12.0%   38.0%  #
-[145, 149)   13   13.0%   51.0%  #
-[149, 154)   31   31.0%   82.0%  ###
-[154, 161)   18   18.0%  100.0%  ##
-[161, 169)    0    0.0%  100.0%  
-[169, 179)    0    0.0%  100.0%  
-[179, 192)    0    0.0%  100.0%  
-[192, 208)    0    0.0%  100.0%  
-[208, 228)    0    0.0%  100.0%  
-[228, 253)    0    0.0%  100.0%  
-[253, inf)    0    0.0%  100.0%  
-Benchmark___1K_chunks__10KB	      20	 484028853 ns/op	  41.32 MB/s
-Histogram (unit: ms)
-Count: 20  Min: 468  Max: 501  Avg: 483.50
-------------------------------------------------------------
-[468, 469)   1    5.0%    5.0%  #
-[469, 470)   1    5.0%   10.0%  #
-[470, 471)   0    0.0%   10.0%  
-[471, 473)   0    0.0%   10.0%  
-[473, 475)   1    5.0%   15.0%  #
-[475, 478)   2   10.0%   25.0%  #
-[478, 482)   2   10.0%   35.0%  #
-[482, 487)   7   35.0%   70.0%  ####
-[487, 493)   4   20.0%   90.0%  ##
-[493, 501)   1    5.0%   95.0%  #
-[501, 511)   1    5.0%  100.0%  #
-[511, 523)   0    0.0%  100.0%  
-[523, 539)   0    0.0%  100.0%  
-[539, 559)   0    0.0%  100.0%  
-[559, 585)   0    0.0%  100.0%  
-[585, 618)   0    0.0%  100.0%  
-[618, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunks__10KB-2	      50	 255874182 ns/op	  78.16 MB/s
-Histogram (unit: ms)
-Count: 50  Min: 239  Max: 268  Avg: 255.42
-------------------------------------------------------------
-[239, 240)   1    2.0%    2.0%  
-[240, 241)   0    0.0%    2.0%  
-[241, 242)   0    0.0%    2.0%  
-[242, 243)   1    2.0%    4.0%  
-[243, 245)   1    2.0%    6.0%  
-[245, 248)   4    8.0%   14.0%  #
-[248, 251)   2    4.0%   18.0%  
-[251, 255)   5   10.0%   28.0%  #
-[255, 261)  29   58.0%   86.0%  ######
-[261, 268)   6   12.0%   98.0%  #
-[268, 277)   1    2.0%  100.0%  
-[277, 288)   0    0.0%  100.0%  
-[288, 302)   0    0.0%  100.0%  
-[302, 320)   0    0.0%  100.0%  
-[320, 343)   0    0.0%  100.0%  
-[343, 371)   0    0.0%  100.0%  
-[371, inf)   0    0.0%  100.0%  
-Benchmark___1K_chunks_100KB	       5	2464952174 ns/op	  81.14 MB/s
+[250, 251)   1    3.3%    3.3%  
+[251, 252)   1    3.3%    6.7%  
+[252, 253)   0    0.0%    6.7%  
+[253, 255)   0    0.0%    6.7%  
+[255, 257)   2    6.7%   13.3%  #
+[257, 260)   2    6.7%   20.0%  #
+[260, 264)   7   23.3%   43.3%  ##
+[264, 269)   3   10.0%   53.3%  #
+[269, 276)   8   26.7%   80.0%  ###
+[276, 285)   5   16.7%   96.7%  ##
+[285, 297)   1    3.3%  100.0%  
+[297, 313)   0    0.0%  100.0%  
+[313, 333)   0    0.0%  100.0%  
+[333, 359)   0    0.0%  100.0%  
+[359, 393)   0    0.0%  100.0%  
+[393, 437)   0    0.0%  100.0%  
+[437, inf)   0    0.0%  100.0%  
+Benchmark___1K_chunks_100KB	       2	2675372295 ns/op	  74.76 MB/s
 Histogram (unit: s)
-Count: 5  Min: 2  Max: 2  Avg: 2.00
+Count: 2  Min: 2  Max: 2  Avg: 2.00
 ------------------------------------------------------------
-[  2,   3)  5  100.0%  100.0%  ##########
+[  2,   3)  2  100.0%  100.0%  ##########
 [  3,   3)  0    0.0%  100.0%  
 [  3,   3)  0    0.0%  100.0%  
 [  3,   3)  0    0.0%  100.0%  
@@ -1353,7 +1353,7 @@
 [  3,   3)  0    0.0%  100.0%  
 [  3,   3)  0    0.0%  100.0%  
 [  3, inf)  0    0.0%  100.0%  
-Benchmark___1K_chunks_100KB-2	       5	1336699604 ns/op	 149.62 MB/s
+Benchmark___1K_chunks_100KB-2	       5	1421481350 ns/op	 140.70 MB/s
 Histogram (unit: s)
 Count: 5  Min: 1  Max: 1  Avg: 1.00
 ------------------------------------------------------------
@@ -1378,28 +1378,7 @@
 ================================================================================
 Echo streaming RPC (Per chunk)
 ================================================================================
-Benchmark__per_chunk____1B	   50000	    233075 ns/op	   0.01 MB/s
-Histogram (unit: s)
-Count: 1  Min: 11  Max: 11  Avg: 11.00
-------------------------------------------------------------
-[ 11,  12)  1  100.0%  100.0%  ##########
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12,  12)  0    0.0%  100.0%  
-[ 12, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk____1B-2	   50000	    177314 ns/op	   0.01 MB/s
+Benchmark__per_chunk____1B	   50000	    163939 ns/op	   0.01 MB/s
 Histogram (unit: s)
 Count: 1  Min: 8  Max: 8  Avg: 8.00
 ------------------------------------------------------------
@@ -1420,49 +1399,7 @@
 [  9,   9)  0    0.0%  100.0%  
 [  9,   9)  0    0.0%  100.0%  
 [  9, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk___10B	   20000	    519996 ns/op	   0.04 MB/s
-Histogram (unit: s)
-Count: 1  Min: 10  Max: 10  Avg: 10.00
-------------------------------------------------------------
-[ 10,  11)  1  100.0%  100.0%  ##########
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk___10B-2	   50000	    338254 ns/op	   0.06 MB/s
-Histogram (unit: s)
-Count: 1  Min: 16  Max: 16  Avg: 16.00
-------------------------------------------------------------
-[ 16,  17)  1  100.0%  100.0%  ##########
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17,  17)  0    0.0%  100.0%  
-[ 17, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk__100B	   10000	    573593 ns/op	   0.35 MB/s
+Benchmark__per_chunk____1B-2	   50000	    118409 ns/op	   0.02 MB/s
 Histogram (unit: s)
 Count: 1  Min: 5  Max: 5  Avg: 5.00
 ------------------------------------------------------------
@@ -1483,70 +1420,112 @@
 [  6,   6)  0    0.0%  100.0%  
 [  6,   6)  0    0.0%  100.0%  
 [  6, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk__100B-2	   50000	    267646 ns/op	   0.75 MB/s
+Benchmark__per_chunk___10B	   20000	    321908 ns/op	   0.06 MB/s
 Histogram (unit: s)
-Count: 1  Min: 13  Max: 13  Avg: 13.00
+Count: 1  Min: 6  Max: 6  Avg: 6.00
 ------------------------------------------------------------
-[ 13,  14)  1  100.0%  100.0%  ##########
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk___1KB	   20000	    514359 ns/op	   3.89 MB/s
+[  6,   7)  1  100.0%  100.0%  ##########
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7, inf)  0    0.0%  100.0%  
+Benchmark__per_chunk___10B-2	   50000	    176818 ns/op	   0.11 MB/s
 Histogram (unit: s)
-Count: 1  Min: 10  Max: 10  Avg: 10.00
+Count: 1  Min: 8  Max: 8  Avg: 8.00
 ------------------------------------------------------------
-[ 10,  11)  1  100.0%  100.0%  ##########
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11,  11)  0    0.0%  100.0%  
-[ 11, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk___1KB-2	   50000	    275305 ns/op	   7.26 MB/s
+[  8,   9)  1  100.0%  100.0%  ##########
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9, inf)  0    0.0%  100.0%  
+Benchmark__per_chunk__100B	   20000	    411514 ns/op	   0.49 MB/s
 Histogram (unit: s)
-Count: 1  Min: 13  Max: 13  Avg: 13.00
+Count: 1  Min: 8  Max: 8  Avg: 8.00
 ------------------------------------------------------------
-[ 13,  14)  1  100.0%  100.0%  ##########
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14,  14)  0    0.0%  100.0%  
-[ 14, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk__10KB	   10000	    703176 ns/op	  28.44 MB/s
+[  8,   9)  1  100.0%  100.0%  ##########
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9, inf)  0    0.0%  100.0%  
+Benchmark__per_chunk__100B-2	   30000	    231565 ns/op	   0.86 MB/s
+Histogram (unit: s)
+Count: 1  Min: 6  Max: 6  Avg: 6.00
+------------------------------------------------------------
+[  6,   7)  1  100.0%  100.0%  ##########
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7, inf)  0    0.0%  100.0%  
+Benchmark__per_chunk___1KB	   20000	    423999 ns/op	   4.72 MB/s
+Histogram (unit: s)
+Count: 1  Min: 8  Max: 8  Avg: 8.00
+------------------------------------------------------------
+[  8,   9)  1  100.0%  100.0%  ##########
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9,   9)  0    0.0%  100.0%  
+[  9, inf)  0    0.0%  100.0%  
+Benchmark__per_chunk___1KB-2	   30000	    248721 ns/op	   8.04 MB/s
 Histogram (unit: s)
 Count: 1  Min: 7  Max: 7  Avg: 7.00
 ------------------------------------------------------------
@@ -1567,7 +1546,49 @@
 [  8,   8)  0    0.0%  100.0%  
 [  8,   8)  0    0.0%  100.0%  
 [  8, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk__10KB-2	   20000	    395105 ns/op	  50.62 MB/s
+Benchmark__per_chunk__10KB	   10000	    631536 ns/op	  31.67 MB/s
+Histogram (unit: s)
+Count: 1  Min: 6  Max: 6  Avg: 6.00
+------------------------------------------------------------
+[  6,   7)  1  100.0%  100.0%  ##########
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7, inf)  0    0.0%  100.0%  
+Benchmark__per_chunk__10KB-2	   20000	    346868 ns/op	  57.66 MB/s
+Histogram (unit: s)
+Count: 1  Min: 6  Max: 6  Avg: 6.00
+------------------------------------------------------------
+[  6,   7)  1  100.0%  100.0%  ##########
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7, inf)  0    0.0%  100.0%  
+Benchmark__per_chunk_100KB	    3000	   2613430 ns/op	  76.53 MB/s
 Histogram (unit: s)
 Count: 1  Min: 7  Max: 7  Avg: 7.00
 ------------------------------------------------------------
@@ -1588,338 +1609,107 @@
 [  8,   8)  0    0.0%  100.0%  
 [  8,   8)  0    0.0%  100.0%  
 [  8, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk_100KB	    5000	   2834149 ns/op	  70.57 MB/s
+Benchmark__per_chunk_100KB-2	    5000	   1369809 ns/op	 146.01 MB/s
 Histogram (unit: s)
-Count: 1  Min: 14  Max: 14  Avg: 14.00
+Count: 1  Min: 6  Max: 6  Avg: 6.00
 ------------------------------------------------------------
-[ 14,  15)  1  100.0%  100.0%  ##########
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15, inf)  0    0.0%  100.0%  
-Benchmark__per_chunk_100KB-2	   10000	   1461822 ns/op	 136.82 MB/s
-Histogram (unit: s)
-Count: 1  Min: 14  Max: 14  Avg: 14.00
-------------------------------------------------------------
-[ 14,  15)  1  100.0%  100.0%  ##########
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15,  15)  0    0.0%  100.0%  
-[ 15, inf)  0    0.0%  100.0%  
+[  6,   7)  1  100.0%  100.0%  ##########
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7,   7)  0    0.0%  100.0%  
+[  7, inf)  0    0.0%  100.0%  
 
 ================================================================================
 Echo RPC when multiplexing with Echo streaming RPC
 ================================================================================
-Benchmark___10B_mux__100_chunks___10B	     500	  22049071 ns/op	   0.00 MB/s
+Benchmark___10B_mux__100_chunks___10B	     500	  18817141 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 10  Max: 26  Avg: 21.57
+Count: 500  Min: 7  Max: 26  Avg: 18.28
 ------------------------------------------------------------
-[ 10,  11)   24    4.8%    4.8%  
-[ 11,  12)   20    4.0%    8.8%  
-[ 12,  13)    0    0.0%    8.8%  
-[ 13,  14)    1    0.2%    9.0%  
-[ 14,  16)    1    0.2%    9.2%  
-[ 16,  18)   44    8.8%   18.0%  #
-[ 18,  21)    1    0.2%   18.2%  
-[ 21,  24)  255   51.0%   69.2%  #####
-[ 24,  28)  154   30.8%  100.0%  ###
-[ 28,  33)    0    0.0%  100.0%  
-[ 33,  39)    0    0.0%  100.0%  
-[ 39,  46)    0    0.0%  100.0%  
-[ 46,  55)    0    0.0%  100.0%  
-[ 55,  66)    0    0.0%  100.0%  
-[ 66,  79)    0    0.0%  100.0%  
-[ 79,  95)    0    0.0%  100.0%  
-[ 95, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks___10B-2	    2000	   4734244 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 1  Max: 11  Avg: 4.29
-------------------------------------------------------------
-[  1,   2)     1    0.1%    0.1%  
-[  2,   3)   681   34.1%   34.1%  ###
-[  3,   4)   457   22.9%   57.0%  ##
-[  4,   5)   197    9.9%   66.8%  #
-[  5,   6)   120    6.0%   72.8%  #
-[  6,   8)   188    9.4%   82.2%  #
-[  8,  10)   230   11.5%   93.7%  #
-[ 10,  12)   126    6.3%  100.0%  #
-[ 12,  15)     0    0.0%  100.0%  
-[ 15,  18)     0    0.0%  100.0%  
-[ 18,  22)     0    0.0%  100.0%  
-[ 22,  27)     0    0.0%  100.0%  
-[ 27,  33)     0    0.0%  100.0%  
-[ 33,  40)     0    0.0%  100.0%  
-[ 40,  48)     0    0.0%  100.0%  
-[ 48,  57)     0    0.0%  100.0%  
-[ 57, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks__100B	     500	  23746639 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 500  Min: 6  Max: 28  Avg: 23.15
-------------------------------------------------------------
-[  6,   7)    1    0.2%    0.2%  
-[  7,   8)    0    0.0%    0.2%  
-[  8,   9)    0    0.0%    0.2%  
-[  9,  10)    2    0.4%    0.6%  
-[ 10,  12)   33    6.6%    7.2%  #
-[ 12,  14)    5    1.0%    8.2%  
-[ 14,  17)    8    1.6%    9.8%  
-[ 17,  21)   44    8.8%   18.6%  #
-[ 21,  26)  308   61.6%   80.2%  ######
-[ 26,  32)   99   19.8%  100.0%  ##
-[ 32,  39)    0    0.0%  100.0%  
-[ 39,  48)    0    0.0%  100.0%  
-[ 48,  59)    0    0.0%  100.0%  
-[ 59,  73)    0    0.0%  100.0%  
-[ 73,  90)    0    0.0%  100.0%  
-[ 90, 111)    0    0.0%  100.0%  
-[111, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks__100B-2	    2000	   5501514 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 1  Max: 13  Avg: 5.06
-------------------------------------------------------------
-[  1,   2)     8    0.4%    0.4%  
-[  2,   3)   630   31.5%   31.9%  ###
-[  3,   4)   277   13.9%   45.8%  #
-[  4,   5)   229   11.5%   57.2%  #
-[  5,   6)   147    7.4%   64.5%  #
-[  6,   8)   223   11.2%   75.7%  #
-[  8,  10)   177    8.8%   84.6%  #
-[ 10,  13)   291   14.6%   99.1%  #
-[ 13,  16)    18    0.9%  100.0%  
-[ 16,  20)     0    0.0%  100.0%  
-[ 20,  25)     0    0.0%  100.0%  
-[ 25,  31)     0    0.0%  100.0%  
-[ 31,  38)     0    0.0%  100.0%  
-[ 38,  46)     0    0.0%  100.0%  
-[ 46,  56)     0    0.0%  100.0%  
-[ 56,  67)     0    0.0%  100.0%  
-[ 67, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks___1KB	     500	  25033793 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 500  Min: 9  Max: 31  Avg: 24.50
-------------------------------------------------------------
-[  9,  10)   14    2.8%    2.8%  
-[ 10,  11)   10    2.0%    4.8%  
-[ 11,  12)    2    0.4%    5.2%  
-[ 12,  13)   22    4.4%    9.6%  
-[ 13,  15)    4    0.8%   10.4%  
-[ 15,  17)    0    0.0%   10.4%  
-[ 17,  20)   23    4.6%   15.0%  
-[ 20,  24)   30    6.0%   21.0%  #
-[ 24,  29)  381   76.2%   97.2%  ########
-[ 29,  35)   14    2.8%  100.0%  
-[ 35,  42)    0    0.0%  100.0%  
-[ 42,  51)    0    0.0%  100.0%  
-[ 51,  62)    0    0.0%  100.0%  
-[ 62,  76)    0    0.0%  100.0%  
-[ 76,  93)    0    0.0%  100.0%  
-[ 93, 114)    0    0.0%  100.0%  
-[114, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux__100_chunks___1KB-2	    2000	   5598670 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 2000  Min: 1  Max: 15  Avg: 5.11
-------------------------------------------------------------
-[  1,   2)   318   15.9%   15.9%  ##
-[  2,   3)   460   23.0%   38.9%  ##
-[  3,   4)   186    9.3%   48.2%  #
-[  4,   5)   188    9.4%   57.6%  #
-[  5,   7)   231   11.6%   69.2%  #
-[  7,   9)   175    8.8%   77.9%  #
-[  9,  11)   132    6.6%   84.5%  #
-[ 11,  14)   265   13.2%   97.8%  #
-[ 14,  18)    45    2.2%  100.0%  
-[ 18,  22)     0    0.0%  100.0%  
-[ 22,  27)     0    0.0%  100.0%  
-[ 27,  33)     0    0.0%  100.0%  
-[ 33,  41)     0    0.0%  100.0%  
-[ 41,  50)     0    0.0%  100.0%  
-[ 50,  61)     0    0.0%  100.0%  
-[ 61,  75)     0    0.0%  100.0%  
-[ 75, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___10B	     100	 121659148 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 100  Min: 4  Max: 179  Avg: 121.14
-------------------------------------------------------------
-[  4,   5)    1    1.0%    1.0%  
-[  5,   6)    0    0.0%    1.0%  
-[  6,   7)    0    0.0%    1.0%  
-[  7,   9)    0    0.0%    1.0%  
-[  9,  12)    0    0.0%    1.0%  
-[ 12,  17)    0    0.0%    1.0%  
-[ 17,  24)    0    0.0%    1.0%  
-[ 24,  35)    1    1.0%    2.0%  
-[ 35,  50)    7    7.0%    9.0%  #
-[ 50,  72)   15   15.0%   24.0%  ##
-[ 72, 103)   13   13.0%   37.0%  #
-[103, 147)   22   22.0%   59.0%  ##
-[147, 209)   41   41.0%  100.0%  ####
-[209, 296)    0    0.0%  100.0%  
-[296, 420)    0    0.0%  100.0%  
-[420, 595)    0    0.0%  100.0%  
-[595, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___10B-2	    1000	   7827224 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 1000  Min: 2  Max: 50  Avg: 7.36
-------------------------------------------------------------
-[  2,   3)   251   25.1%   25.1%  ###
-[  3,   4)   172   17.2%   42.3%  ##
-[  4,   5)   114   11.4%   53.7%  #
-[  5,   7)   148   14.8%   68.5%  #
-[  7,   9)   107   10.7%   79.2%  #
-[  9,  12)    58    5.8%   85.0%  #
-[ 12,  16)    31    3.1%   88.1%  
-[ 16,  22)    36    3.6%   91.7%  
-[ 22,  29)    35    3.5%   95.2%  
-[ 29,  39)    29    2.9%   98.1%  
-[ 39,  52)    19    1.9%  100.0%  
-[ 52,  69)     0    0.0%  100.0%  
-[ 69,  91)     0    0.0%  100.0%  
-[ 91, 119)     0    0.0%  100.0%  
-[119, 156)     0    0.0%  100.0%  
-[156, 203)     0    0.0%  100.0%  
-[203, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks__100B	     100	 141824661 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 100  Min: 12  Max: 207  Avg: 141.35
-------------------------------------------------------------
-[ 12,  13)    1    1.0%    1.0%  
-[ 13,  14)    0    0.0%    1.0%  
-[ 14,  16)    1    1.0%    2.0%  
-[ 16,  18)    1    1.0%    3.0%  
-[ 18,  22)    0    0.0%    3.0%  
-[ 22,  27)    0    0.0%    3.0%  
-[ 27,  35)    0    0.0%    3.0%  
-[ 35,  46)    1    1.0%    4.0%  
-[ 46,  62)   10   10.0%   14.0%  #
-[ 62,  85)   16   16.0%   30.0%  ##
-[ 85, 118)    0    0.0%   30.0%  
-[118, 165)   27   27.0%   57.0%  ###
-[165, 232)   43   43.0%  100.0%  ####
-[232, 328)    0    0.0%  100.0%  
-[328, 465)    0    0.0%  100.0%  
-[465, 659)    0    0.0%  100.0%  
-[659, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks__100B-2	    1000	  11127970 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 1000  Min: 1  Max: 70  Avg: 10.65
-------------------------------------------------------------
-[  1,   2)     1    0.1%    0.1%  
-[  2,   3)   199   19.9%   20.0%  ##
-[  3,   4)    94    9.4%   29.4%  #
-[  4,   6)   196   19.6%   49.0%  ##
-[  6,   9)   192   19.2%   68.2%  ##
-[  9,  13)   147   14.7%   82.9%  #
-[ 13,  18)    45    4.5%   87.4%  
-[ 18,  25)    13    1.3%   88.7%  
-[ 25,  34)    27    2.7%   91.4%  
-[ 34,  46)    20    2.0%   93.4%  
-[ 46,  62)    47    4.7%   98.1%  
-[ 62,  84)    19    1.9%  100.0%  
-[ 84, 113)     0    0.0%  100.0%  
-[113, 152)     0    0.0%  100.0%  
-[152, 204)     0    0.0%  100.0%  
-[204, 272)     0    0.0%  100.0%  
-[272, inf)     0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___1KB	     100	 148589902 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 100  Min: 8  Max: 262  Avg: 148.08
-------------------------------------------------------------
-[  8,   9)    1    1.0%    1.0%  
-[  9,  10)    1    1.0%    2.0%  
-[ 10,  12)    1    1.0%    3.0%  
-[ 12,  15)    0    0.0%    3.0%  
-[ 15,  19)    3    3.0%    6.0%  
-[ 19,  25)    1    1.0%    7.0%  
-[ 25,  34)    1    1.0%    8.0%  
-[ 34,  47)    0    0.0%    8.0%  
-[ 47,  66)    5    5.0%   13.0%  #
-[ 66,  93)   13   13.0%   26.0%  #
-[ 93, 133)   16   16.0%   42.0%  ##
-[133, 191)   24   24.0%   66.0%  ##
-[191, 274)   34   34.0%  100.0%  ###
-[274, 395)    0    0.0%  100.0%  
-[395, 570)    0    0.0%  100.0%  
-[570, 824)    0    0.0%  100.0%  
-[824, inf)    0    0.0%  100.0%  
-Benchmark___10B_mux___1K_chunks___1KB-2	    1000	  12616916 ns/op	   0.00 MB/s
-Histogram (unit: ms)
-Count: 1000  Min: 1  Max: 84  Avg: 12.10
-------------------------------------------------------------
-[  1,   2)   203   20.3%   20.3%  ##
-[  2,   3)   190   19.0%   39.3%  ##
-[  3,   4)    41    4.1%   43.4%  
-[  4,   6)   115   11.5%   54.9%  #
-[  6,   9)   149   14.9%   69.8%  #
-[  9,  13)    61    6.1%   75.9%  #
-[ 13,  18)    63    6.3%   82.2%  #
-[ 18,  25)    33    3.3%   85.5%  
-[ 25,  35)    32    3.2%   88.7%  
-[ 35,  49)    30    3.0%   91.7%  
-[ 49,  68)    48    4.8%   96.5%  
-[ 68,  93)    35    3.5%  100.0%  
-[ 93, 127)     0    0.0%  100.0%  
-[127, 173)     0    0.0%  100.0%  
-[173, 234)     0    0.0%  100.0%  
-[234, 317)     0    0.0%  100.0%  
-[317, inf)     0    0.0%  100.0%  
-Benchmark__100B_mux__100_chunks___10B	     500	  23895451 ns/op	   0.01 MB/s
-Histogram (unit: ms)
-Count: 500  Min: 10  Max: 36  Avg: 23.35
-------------------------------------------------------------
-[ 10,  11)    3    0.6%    0.6%  
-[ 11,  12)    3    0.6%    1.2%  
-[ 12,  13)   17    3.4%    4.6%  
-[ 13,  14)    1    0.2%    4.8%  
-[ 14,  16)   14    2.8%    7.6%  
-[ 16,  18)   10    2.0%    9.6%  
-[ 18,  21)   12    2.4%   12.0%  
-[ 21,  25)  252   50.4%   62.4%  #####
-[ 25,  30)  180   36.0%   98.4%  ####
-[ 30,  37)    8    1.6%  100.0%  
+[  7,   8)   41    8.2%    8.2%  #
+[  8,   9)    5    1.0%    9.2%  
+[  9,  10)    1    0.2%    9.4%  
+[ 10,  11)    0    0.0%    9.4%  
+[ 11,  13)    5    1.0%   10.4%  
+[ 13,  15)    0    0.0%   10.4%  
+[ 15,  18)   52   10.4%   20.8%  #
+[ 18,  21)  329   65.8%   86.6%  #######
+[ 21,  25)   66   13.2%   99.8%  #
+[ 25,  30)    1    0.2%  100.0%  
+[ 30,  37)    0    0.0%  100.0%  
 [ 37,  45)    0    0.0%  100.0%  
 [ 45,  55)    0    0.0%  100.0%  
-[ 55,  68)    0    0.0%  100.0%  
-[ 68,  84)    0    0.0%  100.0%  
-[ 84, 104)    0    0.0%  100.0%  
-[104, 129)    0    0.0%  100.0%  
-[129, inf)    0    0.0%  100.0%  
-Benchmark__100B_mux__100_chunks___10B-2	    2000	   5134742 ns/op	   0.04 MB/s
+[ 55,  67)    0    0.0%  100.0%  
+[ 67,  82)    0    0.0%  100.0%  
+[ 82, 100)    0    0.0%  100.0%  
+[100, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks___10B-2	    1000	   7104449 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 2  Max: 15  Avg: 4.65
+Count: 1000  Min: 2  Max: 13  Avg: 6.62
 ------------------------------------------------------------
-[  2,   3)   710   35.5%   35.5%  ####
-[  3,   4)   328   16.4%   51.9%  ##
-[  4,   5)   190    9.5%   61.4%  #
-[  5,   6)   127    6.4%   67.8%  #
-[  6,   7)   131    6.6%   74.3%  #
-[  7,   9)   242   12.1%   86.4%  #
-[  9,  11)   145    7.2%   93.7%  #
-[ 11,  14)   105    5.2%   98.9%  #
-[ 14,  17)    22    1.1%  100.0%  
+[  2,   3)    89    8.9%    8.9%  #
+[  3,   4)   110   11.0%   19.9%  #
+[  4,   5)   108   10.8%   30.7%  #
+[  5,   6)   112   11.2%   41.9%  #
+[  6,   7)    77    7.7%   49.6%  #
+[  7,   9)   165   16.5%   66.1%  ##
+[  9,  11)   230   23.0%   89.1%  ##
+[ 11,  14)   109   10.9%  100.0%  #
+[ 14,  17)     0    0.0%  100.0%  
+[ 17,  21)     0    0.0%  100.0%  
+[ 21,  25)     0    0.0%  100.0%  
+[ 25,  30)     0    0.0%  100.0%  
+[ 30,  36)     0    0.0%  100.0%  
+[ 36,  43)     0    0.0%  100.0%  
+[ 43,  52)     0    0.0%  100.0%  
+[ 52,  63)     0    0.0%  100.0%  
+[ 63, inf)     0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks__100B	     300	  21167617 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 300  Min: 6  Max: 26  Avg: 20.68
+------------------------------------------------------------
+[  6,   7)   13    4.3%    4.3%  
+[  7,   8)    7    2.3%    6.7%  
+[  8,   9)    9    3.0%    9.7%  
+[  9,  10)    0    0.0%    9.7%  
+[ 10,  12)    0    0.0%    9.7%  
+[ 12,  14)    0    0.0%    9.7%  
+[ 14,  17)    0    0.0%    9.7%  
+[ 17,  21)   29    9.7%   19.3%  #
+[ 21,  25)  237   79.0%   98.3%  ########
+[ 25,  31)    5    1.7%  100.0%  
+[ 31,  38)    0    0.0%  100.0%  
+[ 38,  46)    0    0.0%  100.0%  
+[ 46,  56)    0    0.0%  100.0%  
+[ 56,  69)    0    0.0%  100.0%  
+[ 69,  85)    0    0.0%  100.0%  
+[ 85, 104)    0    0.0%  100.0%  
+[104, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks__100B-2	    1000	   8372251 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 1000  Min: 2  Max: 15  Avg: 7.88
+------------------------------------------------------------
+[  2,   3)    67    6.7%    6.7%  #
+[  3,   4)    62    6.2%   12.9%  #
+[  4,   5)    83    8.3%   21.2%  #
+[  5,   6)    85    8.5%   29.7%  #
+[  6,   7)    92    9.2%   38.9%  #
+[  7,   9)   150   15.0%   53.9%  ##
+[  9,  11)   144   14.4%   68.3%  #
+[ 11,  14)   307   30.7%   99.0%  ###
+[ 14,  17)    10    1.0%  100.0%  
 [ 17,  21)     0    0.0%  100.0%  
 [ 21,  26)     0    0.0%  100.0%  
 [ 26,  32)     0    0.0%  100.0%  
@@ -1928,40 +1718,250 @@
 [ 48,  58)     0    0.0%  100.0%  
 [ 58,  70)     0    0.0%  100.0%  
 [ 70, inf)     0    0.0%  100.0%  
-Benchmark__100B_mux__100_chunks__100B	     500	  25336809 ns/op	   0.01 MB/s
+Benchmark___10B_mux__100_chunks___1KB	     300	  22817830 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 9  Max: 39  Avg: 24.84
+Count: 300  Min: 6  Max: 28  Avg: 22.30
 ------------------------------------------------------------
-[  9,  10)    3    0.6%    0.6%  
-[ 10,  11)   22    4.4%    5.0%  
-[ 11,  12)    3    0.6%    5.6%  
-[ 12,  13)    0    0.0%    5.6%  
-[ 13,  15)    3    0.6%    6.2%  
-[ 15,  18)   42    8.4%   14.6%  #
-[ 18,  21)   10    2.0%   16.6%  
-[ 21,  25)  218   43.6%   60.2%  ####
-[ 25,  31)   61   12.2%   72.4%  #
-[ 31,  38)  137   27.4%   99.8%  ###
-[ 38,  47)    1    0.2%  100.0%  
-[ 47,  59)    0    0.0%  100.0%  
-[ 59,  74)    0    0.0%  100.0%  
-[ 74,  93)    0    0.0%  100.0%  
-[ 93, 116)    0    0.0%  100.0%  
-[116, 145)    0    0.0%  100.0%  
-[145, inf)    0    0.0%  100.0%  
-Benchmark__100B_mux__100_chunks__100B-2	    2000	   6012040 ns/op	   0.03 MB/s
+[  6,   7)   15    5.0%    5.0%  #
+[  7,   8)    4    1.3%    6.3%  
+[  8,   9)    9    3.0%    9.3%  
+[  9,  10)    0    0.0%    9.3%  
+[ 10,  12)    0    0.0%    9.3%  
+[ 12,  14)    0    0.0%    9.3%  
+[ 14,  17)    2    0.7%   10.0%  
+[ 17,  21)   24    8.0%   18.0%  #
+[ 21,  26)  207   69.0%   87.0%  #######
+[ 26,  32)   39   13.0%  100.0%  #
+[ 32,  39)    0    0.0%  100.0%  
+[ 39,  48)    0    0.0%  100.0%  
+[ 48,  59)    0    0.0%  100.0%  
+[ 59,  73)    0    0.0%  100.0%  
+[ 73,  90)    0    0.0%  100.0%  
+[ 90, 111)    0    0.0%  100.0%  
+[111, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux__100_chunks___1KB-2	    1000	   8831943 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 2  Max: 18  Avg: 5.53
+Count: 1000  Min: 1  Max: 17  Avg: 8.35
 ------------------------------------------------------------
-[  2,   3)   595   29.8%   29.8%  ###
-[  3,   4)   213   10.7%   40.4%  #
-[  4,   5)   204   10.2%   50.6%  #
-[  5,   6)   168    8.4%   59.0%  #
-[  6,   8)   246   12.3%   71.3%  #
-[  8,  10)   248   12.4%   83.7%  #
-[ 10,  13)   224   11.2%   94.9%  #
-[ 13,  16)    73    3.7%   98.6%  
-[ 16,  20)    29    1.5%  100.0%  
+[  1,   2)    12    1.2%    1.2%  
+[  2,   3)   155   15.5%   16.7%  ##
+[  3,   4)    59    5.9%   22.6%  #
+[  4,   5)    48    4.8%   27.4%  
+[  5,   7)   134   13.4%   40.8%  #
+[  7,   9)    91    9.1%   49.9%  #
+[  9,  12)   132   13.2%   63.1%  #
+[ 12,  15)   328   32.8%   95.9%  ###
+[ 15,  19)    41    4.1%  100.0%  
+[ 19,  24)     0    0.0%  100.0%  
+[ 24,  30)     0    0.0%  100.0%  
+[ 30,  37)     0    0.0%  100.0%  
+[ 37,  46)     0    0.0%  100.0%  
+[ 46,  57)     0    0.0%  100.0%  
+[ 57,  70)     0    0.0%  100.0%  
+[ 70,  86)     0    0.0%  100.0%  
+[ 86, inf)     0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___10B	     100	 123136622 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 100  Min: 5  Max: 173  Avg: 122.60
+------------------------------------------------------------
+[  5,   6)    1    1.0%    1.0%  
+[  6,   7)    0    0.0%    1.0%  
+[  7,   8)    0    0.0%    1.0%  
+[  8,  10)    1    1.0%    2.0%  
+[ 10,  13)    0    0.0%    2.0%  
+[ 13,  18)    1    1.0%    3.0%  
+[ 18,  25)    0    0.0%    3.0%  
+[ 25,  35)    1    1.0%    4.0%  
+[ 35,  50)    2    2.0%    6.0%  
+[ 50,  71)   11   11.0%   17.0%  #
+[ 71, 101)   22   22.0%   39.0%  ##
+[101, 143)   14   14.0%   53.0%  #
+[143, 203)   47   47.0%  100.0%  #####
+[203, 287)    0    0.0%  100.0%  
+[287, 406)    0    0.0%  100.0%  
+[406, 574)    0    0.0%  100.0%  
+[574, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___10B-2	     300	  22274569 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 300  Min: 2  Max: 96  Avg: 21.75
+------------------------------------------------------------
+[  2,   3)    8    2.7%    2.7%  
+[  3,   4)   23    7.7%   10.3%  #
+[  4,   5)   31   10.3%   20.7%  #
+[  5,   7)   47   15.7%   36.3%  ##
+[  7,  10)   74   24.7%   61.0%  ##
+[ 10,  14)   33   11.0%   72.0%  #
+[ 14,  20)   12    4.0%   76.0%  
+[ 20,  28)    7    2.3%   78.3%  
+[ 28,  39)    1    0.3%   78.7%  
+[ 39,  54)    4    1.3%   80.0%  
+[ 54,  74)   20    6.7%   86.7%  #
+[ 74, 101)   40   13.3%  100.0%  #
+[101, 138)    0    0.0%  100.0%  
+[138, 189)    0    0.0%  100.0%  
+[189, 258)    0    0.0%  100.0%  
+[258, 352)    0    0.0%  100.0%  
+[352, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks__100B	     100	 143814971 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 100  Min: 14  Max: 204  Avg: 143.32
+------------------------------------------------------------
+[ 14,  15)    1    1.0%    1.0%  
+[ 15,  16)    0    0.0%    1.0%  
+[ 16,  18)    0    0.0%    1.0%  
+[ 18,  20)    0    0.0%    1.0%  
+[ 20,  24)    0    0.0%    1.0%  
+[ 24,  29)    0    0.0%    1.0%  
+[ 29,  37)    0    0.0%    1.0%  
+[ 37,  48)    0    0.0%    1.0%  
+[ 48,  64)   11   11.0%   12.0%  #
+[ 64,  87)   15   15.0%   27.0%  ##
+[ 87, 120)    2    2.0%   29.0%  
+[120, 166)   26   26.0%   55.0%  ###
+[166, 232)   45   45.0%  100.0%  #####
+[232, 326)    0    0.0%  100.0%  
+[326, 459)    0    0.0%  100.0%  
+[459, 649)    0    0.0%  100.0%  
+[649, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks__100B-2	     200	  34125016 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 200  Min: 2  Max: 114  Avg: 33.62
+------------------------------------------------------------
+[  2,   3)   10    5.0%    5.0%  #
+[  3,   4)    6    3.0%    8.0%  
+[  4,   5)   10    5.0%   13.0%  #
+[  5,   7)   21   10.5%   23.5%  #
+[  7,  10)   26   13.0%   36.5%  #
+[ 10,  14)   34   17.0%   53.5%  ##
+[ 14,  20)   27   13.5%   67.0%  #
+[ 20,  29)    7    3.5%   70.5%  
+[ 29,  41)    1    0.5%   71.0%  
+[ 41,  57)    2    1.0%   72.0%  
+[ 57,  80)    7    3.5%   75.5%  
+[ 80, 111)   45   22.5%   98.0%  ##
+[111, 154)    4    2.0%  100.0%  
+[154, 213)    0    0.0%  100.0%  
+[213, 294)    0    0.0%  100.0%  
+[294, 405)    0    0.0%  100.0%  
+[405, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___1KB	     100	 136987808 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 100  Min: 5  Max: 233  Avg: 136.46
+------------------------------------------------------------
+[  5,   6)    1    1.0%    1.0%  
+[  6,   7)    0    0.0%    1.0%  
+[  7,   9)    1    1.0%    2.0%  
+[  9,  11)    1    1.0%    3.0%  
+[ 11,  15)    1    1.0%    4.0%  
+[ 15,  21)    3    3.0%    7.0%  
+[ 21,  29)    0    0.0%    7.0%  
+[ 29,  41)    0    0.0%    7.0%  
+[ 41,  59)    3    3.0%   10.0%  
+[ 59,  84)   11   11.0%   21.0%  #
+[ 84, 121)   24   24.0%   45.0%  ##
+[121, 174)   25   25.0%   70.0%  ###
+[174, 250)   30   30.0%  100.0%  ###
+[250, 360)    0    0.0%  100.0%  
+[360, 518)    0    0.0%  100.0%  
+[518, 746)    0    0.0%  100.0%  
+[746, inf)    0    0.0%  100.0%  
+Benchmark___10B_mux___1K_chunks___1KB-2	     200	  35831221 ns/op	   0.00 MB/s
+Histogram (unit: ms)
+Count: 200  Min: 2  Max: 123  Avg: 35.40
+------------------------------------------------------------
+[  2,   3)   21   10.5%   10.5%  #
+[  3,   4)   12    6.0%   16.5%  #
+[  4,   5)    4    2.0%   18.5%  
+[  5,   7)    8    4.0%   22.5%  
+[  7,  10)   18    9.0%   31.5%  #
+[ 10,  14)   21   10.5%   42.0%  #
+[ 14,  20)   21   10.5%   52.5%  #
+[ 20,  29)    7    3.5%   56.0%  
+[ 29,  41)   11    5.5%   61.5%  #
+[ 41,  58)   23   11.5%   73.0%  #
+[ 58,  82)   28   14.0%   87.0%  #
+[ 82, 115)   25   12.5%   99.5%  #
+[115, 161)    1    0.5%  100.0%  
+[161, 224)    0    0.0%  100.0%  
+[224, 311)    0    0.0%  100.0%  
+[311, 432)    0    0.0%  100.0%  
+[432, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux__100_chunks___10B	     500	  20748811 ns/op	   0.01 MB/s
+Histogram (unit: ms)
+Count: 500  Min: 6  Max: 27  Avg: 20.33
+------------------------------------------------------------
+[  6,   7)    1    0.2%    0.2%  
+[  7,   8)   16    3.2%    3.4%  
+[  8,   9)    3    0.6%    4.0%  
+[  9,  10)    6    1.2%    5.2%  
+[ 10,  12)    4    0.8%    6.0%  
+[ 12,  14)    0    0.0%    6.0%  
+[ 14,  17)    7    1.4%    7.4%  
+[ 17,  21)  181   36.2%   43.6%  ####
+[ 21,  26)  278   55.6%   99.2%  ######
+[ 26,  32)    4    0.8%  100.0%  
+[ 32,  39)    0    0.0%  100.0%  
+[ 39,  48)    0    0.0%  100.0%  
+[ 48,  59)    0    0.0%  100.0%  
+[ 59,  72)    0    0.0%  100.0%  
+[ 72,  89)    0    0.0%  100.0%  
+[ 89, 109)    0    0.0%  100.0%  
+[109, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux__100_chunks___10B-2	    1000	   7604070 ns/op	   0.03 MB/s
+Histogram (unit: ms)
+Count: 1000  Min: 2  Max: 15  Avg: 7.10
+------------------------------------------------------------
+[  2,   3)    49    4.9%    4.9%  
+[  3,   4)    90    9.0%   13.9%  #
+[  4,   5)   124   12.4%   26.3%  #
+[  5,   6)   117   11.7%   38.0%  #
+[  6,   7)   100   10.0%   48.0%  #
+[  7,   9)   185   18.5%   66.5%  ##
+[  9,  11)   169   16.9%   83.4%  ##
+[ 11,  14)   141   14.1%   97.5%  #
+[ 14,  17)    25    2.5%  100.0%  
+[ 17,  21)     0    0.0%  100.0%  
+[ 21,  26)     0    0.0%  100.0%  
+[ 26,  32)     0    0.0%  100.0%  
+[ 32,  39)     0    0.0%  100.0%  
+[ 39,  48)     0    0.0%  100.0%  
+[ 48,  58)     0    0.0%  100.0%  
+[ 58,  70)     0    0.0%  100.0%  
+[ 70, inf)     0    0.0%  100.0%  
+Benchmark__100B_mux__100_chunks__100B	     300	  21922577 ns/op	   0.01 MB/s
+Histogram (unit: ms)
+Count: 300  Min: 6  Max: 30  Avg: 21.45
+------------------------------------------------------------
+[  6,   7)   17    5.7%    5.7%  #
+[  7,   8)    2    0.7%    6.3%  
+[  8,   9)    4    1.3%    7.7%  
+[  9,  10)    0    0.0%    7.7%  
+[ 10,  12)    9    3.0%   10.7%  
+[ 12,  14)    2    0.7%   11.3%  
+[ 14,  17)    1    0.3%   11.7%  
+[ 17,  21)   26    8.7%   20.3%  #
+[ 21,  26)  144   48.0%   68.3%  #####
+[ 26,  32)   95   31.7%  100.0%  ###
+[ 32,  40)    0    0.0%  100.0%  
+[ 40,  50)    0    0.0%  100.0%  
+[ 50,  62)    0    0.0%  100.0%  
+[ 62,  77)    0    0.0%  100.0%  
+[ 77,  96)    0    0.0%  100.0%  
+[ 96, 120)    0    0.0%  100.0%  
+[120, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux__100_chunks__100B-2	    1000	   9164254 ns/op	   0.02 MB/s
+Histogram (unit: ms)
+Count: 1000  Min: 2  Max: 18  Avg: 8.66
+------------------------------------------------------------
+[  2,   3)    35    3.5%    3.5%  
+[  3,   4)    44    4.4%    7.9%  
+[  4,   5)    78    7.8%   15.7%  #
+[  5,   6)   102   10.2%   25.9%  #
+[  6,   8)   168   16.8%   42.7%  ##
+[  8,  10)   155   15.5%   58.2%  ##
+[ 10,  13)   236   23.6%   81.8%  ##
+[ 13,  16)   137   13.7%   95.5%  #
+[ 16,  20)    45    4.5%  100.0%  
 [ 20,  25)     0    0.0%  100.0%  
 [ 25,  31)     0    0.0%  100.0%  
 [ 31,  38)     0    0.0%  100.0%  
@@ -1970,171 +1970,171 @@
 [ 58,  71)     0    0.0%  100.0%  
 [ 71,  87)     0    0.0%  100.0%  
 [ 87, inf)     0    0.0%  100.0%  
-Benchmark__100B_mux__100_chunks___1KB	     500	  27144821 ns/op	   0.01 MB/s
+Benchmark__100B_mux__100_chunks___1KB	     300	  23892634 ns/op	   0.01 MB/s
 Histogram (unit: ms)
-Count: 500  Min: 9  Max: 43  Avg: 26.67
+Count: 300  Min: 6  Max: 31  Avg: 23.41
 ------------------------------------------------------------
-[  9,  10)   17    3.4%    3.4%  
-[ 10,  11)   18    3.6%    7.0%  
-[ 11,  12)    2    0.4%    7.4%  
-[ 12,  14)    0    0.0%    7.4%  
-[ 14,  16)    2    0.4%    7.8%  
-[ 16,  19)   40    8.0%   15.8%  #
-[ 19,  23)   18    3.6%   19.4%  
-[ 23,  28)  221   44.2%   63.6%  ####
-[ 28,  34)   32    6.4%   70.0%  #
-[ 34,  42)  149   29.8%   99.8%  ###
-[ 42,  52)    1    0.2%  100.0%  
-[ 52,  65)    0    0.0%  100.0%  
-[ 65,  81)    0    0.0%  100.0%  
-[ 81, 102)    0    0.0%  100.0%  
-[102, 128)    0    0.0%  100.0%  
-[128, 161)    0    0.0%  100.0%  
-[161, inf)    0    0.0%  100.0%  
-Benchmark__100B_mux__100_chunks___1KB-2	    2000	   6117827 ns/op	   0.03 MB/s
+[  6,   7)   12    4.0%    4.0%  
+[  7,   8)    9    3.0%    7.0%  
+[  8,   9)    5    1.7%    8.7%  
+[  9,  10)    1    0.3%    9.0%  
+[ 10,  12)    1    0.3%    9.3%  
+[ 12,  14)    2    0.7%   10.0%  
+[ 14,  17)    1    0.3%   10.3%  
+[ 17,  21)   10    3.3%   13.7%  
+[ 21,  26)  122   40.7%   54.3%  ####
+[ 26,  32)  137   45.7%  100.0%  #####
+[ 32,  40)    0    0.0%  100.0%  
+[ 40,  50)    0    0.0%  100.0%  
+[ 50,  63)    0    0.0%  100.0%  
+[ 63,  79)    0    0.0%  100.0%  
+[ 79,  99)    0    0.0%  100.0%  
+[ 99, 123)    0    0.0%  100.0%  
+[123, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux__100_chunks___1KB-2	    1000	   9288578 ns/op	   0.02 MB/s
 Histogram (unit: ms)
-Count: 2000  Min: 1  Max: 20  Avg: 5.68
+Count: 1000  Min: 1  Max: 19  Avg: 8.80
 ------------------------------------------------------------
-[  1,   2)   129    6.5%    6.5%  #
-[  2,   3)   689   34.5%   40.9%  ###
-[  3,   4)   129    6.5%   47.4%  #
-[  4,   5)   127    6.4%   53.7%  #
-[  5,   7)   224   11.2%   64.9%  #
-[  7,   9)   186    9.3%   74.2%  #
-[  9,  12)   250   12.5%   86.7%  #
-[ 12,  15)   149    7.5%   94.2%  #
-[ 15,  19)    99    5.0%   99.1%  
-[ 19,  24)    18    0.9%  100.0%  
-[ 24,  31)     0    0.0%  100.0%  
-[ 31,  39)     0    0.0%  100.0%  
-[ 39,  49)     0    0.0%  100.0%  
-[ 49,  61)     0    0.0%  100.0%  
-[ 61,  76)     0    0.0%  100.0%  
-[ 76,  94)     0    0.0%  100.0%  
-[ 94, inf)     0    0.0%  100.0%  
-Benchmark__100B_mux___1K_chunks___10B	     100	 132175574 ns/op	   0.00 MB/s
+[  1,   2)     6    0.6%    0.6%  
+[  2,   3)   158   15.8%   16.4%  ##
+[  3,   4)    70    7.0%   23.4%  #
+[  4,   5)    54    5.4%   28.8%  #
+[  5,   7)   110   11.0%   39.8%  #
+[  7,   9)    83    8.3%   48.1%  #
+[  9,  12)   183   18.3%   66.4%  ##
+[ 12,  15)   142   14.2%   80.6%  #
+[ 15,  19)   193   19.3%   99.9%  ##
+[ 19,  24)     1    0.1%  100.0%  
+[ 24,  30)     0    0.0%  100.0%  
+[ 30,  38)     0    0.0%  100.0%  
+[ 38,  48)     0    0.0%  100.0%  
+[ 48,  60)     0    0.0%  100.0%  
+[ 60,  74)     0    0.0%  100.0%  
+[ 74,  91)     0    0.0%  100.0%  
+[ 91, inf)     0    0.0%  100.0%  
+Benchmark__100B_mux___1K_chunks___10B	     100	 120357166 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 17  Max: 191  Avg: 131.70
+Count: 100  Min: 4  Max: 186  Avg: 119.88
 ------------------------------------------------------------
-[ 17,  18)    1    1.0%    1.0%  
-[ 18,  19)    0    0.0%    1.0%  
-[ 19,  20)    0    0.0%    1.0%  
-[ 20,  22)    0    0.0%    1.0%  
-[ 22,  25)    0    0.0%    1.0%  
-[ 25,  30)    0    0.0%    1.0%  
-[ 30,  37)    0    0.0%    1.0%  
-[ 37,  48)    1    1.0%    2.0%  
-[ 48,  63)    5    5.0%    7.0%  #
-[ 63,  85)   16   16.0%   23.0%  ##
-[ 85, 116)   17   17.0%   40.0%  ##
-[116, 159)   18   18.0%   58.0%  ##
-[159, 221)   42   42.0%  100.0%  ####
-[221, 308)    0    0.0%  100.0%  
-[308, 431)    0    0.0%  100.0%  
-[431, 605)    0    0.0%  100.0%  
-[605, inf)    0    0.0%  100.0%  
-Benchmark__100B_mux___1K_chunks___10B-2	    1000	   8590497 ns/op	   0.02 MB/s
+[  4,   5)    1    1.0%    1.0%  
+[  5,   6)    0    0.0%    1.0%  
+[  6,   8)    0    0.0%    1.0%  
+[  8,  10)    0    0.0%    1.0%  
+[ 10,  14)    0    0.0%    1.0%  
+[ 14,  19)    1    1.0%    2.0%  
+[ 19,  27)    0    0.0%    2.0%  
+[ 27,  38)    0    0.0%    2.0%  
+[ 38,  54)    3    3.0%    5.0%  
+[ 54,  76)   22   22.0%   27.0%  ##
+[ 76, 108)   16   16.0%   43.0%  ##
+[108, 153)   18   18.0%   61.0%  ##
+[153, 217)   39   39.0%  100.0%  ####
+[217, 307)    0    0.0%  100.0%  
+[307, 435)    0    0.0%  100.0%  
+[435, 616)    0    0.0%  100.0%  
+[616, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux___1K_chunks___10B-2	     300	  23110788 ns/op	   0.01 MB/s
 Histogram (unit: ms)
-Count: 1000  Min: 2  Max: 63  Avg: 8.10
+Count: 300  Min: 2  Max: 97  Avg: 22.60
 ------------------------------------------------------------
-[  2,   3)   275   27.5%   27.5%  ###
-[  3,   4)   186   18.6%   46.1%  ##
-[  4,   5)   125   12.5%   58.6%  #
-[  5,   7)    92    9.2%   67.8%  #
-[  7,   9)    43    4.3%   72.1%  
-[  9,  12)    57    5.7%   77.8%  #
-[ 12,  17)    97    9.7%   87.5%  #
-[ 17,  23)    39    3.9%   91.4%  
-[ 23,  31)    31    3.1%   94.5%  
-[ 31,  42)    32    3.2%   97.7%  
-[ 42,  57)    21    2.1%   99.8%  
-[ 57,  77)     2    0.2%  100.0%  
-[ 77, 103)     0    0.0%  100.0%  
-[103, 138)     0    0.0%  100.0%  
-[138, 184)     0    0.0%  100.0%  
-[184, 245)     0    0.0%  100.0%  
-[245, inf)     0    0.0%  100.0%  
-Benchmark__100B_mux___1K_chunks__100B	     100	 145204032 ns/op	   0.00 MB/s
+[  2,   3)    7    2.3%    2.3%  
+[  3,   4)   26    8.7%   11.0%  #
+[  4,   5)   33   11.0%   22.0%  #
+[  5,   7)   45   15.0%   37.0%  ##
+[  7,  10)   46   15.3%   52.3%  ##
+[ 10,  14)   48   16.0%   68.3%  ##
+[ 14,  20)   19    6.3%   74.7%  #
+[ 20,  28)    8    2.7%   77.3%  
+[ 28,  39)    3    1.0%   78.3%  
+[ 39,  54)    2    0.7%   79.0%  
+[ 54,  74)   32   10.7%   89.7%  #
+[ 74, 102)   31   10.3%  100.0%  #
+[102, 140)    0    0.0%  100.0%  
+[140, 191)    0    0.0%  100.0%  
+[191, 261)    0    0.0%  100.0%  
+[261, 355)    0    0.0%  100.0%  
+[355, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux___1K_chunks__100B	     100	 146211502 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 14  Max: 213  Avg: 144.70
+Count: 100  Min: 11  Max: 220  Avg: 145.68
 ------------------------------------------------------------
-[ 14,  15)    1    1.0%    1.0%  
-[ 15,  16)    0    0.0%    1.0%  
-[ 16,  18)    0    0.0%    1.0%  
-[ 18,  20)    0    0.0%    1.0%  
-[ 20,  24)    0    0.0%    1.0%  
-[ 24,  29)    0    0.0%    1.0%  
-[ 29,  37)    1    1.0%    2.0%  
-[ 37,  48)    0    0.0%    2.0%  
-[ 48,  64)   10   10.0%   12.0%  #
-[ 64,  87)   14   14.0%   26.0%  #
-[ 87, 121)    5    5.0%   31.0%  #
-[121, 169)   29   29.0%   60.0%  ###
-[169, 238)   40   40.0%  100.0%  ####
-[238, 336)    0    0.0%  100.0%  
-[336, 475)    0    0.0%  100.0%  
-[475, 673)    0    0.0%  100.0%  
-[673, inf)    0    0.0%  100.0%  
-Benchmark__100B_mux___1K_chunks__100B-2	    1000	  12104363 ns/op	   0.02 MB/s
+[ 11,  12)    1    1.0%    1.0%  
+[ 12,  13)    1    1.0%    2.0%  
+[ 13,  15)    0    0.0%    2.0%  
+[ 15,  17)    0    0.0%    2.0%  
+[ 17,  21)    0    0.0%    2.0%  
+[ 21,  26)    0    0.0%    2.0%  
+[ 26,  34)    1    1.0%    3.0%  
+[ 34,  46)    1    1.0%    4.0%  
+[ 46,  63)   10   10.0%   14.0%  #
+[ 63,  87)   12   12.0%   26.0%  #
+[ 87, 122)    9    9.0%   35.0%  #
+[122, 172)   19   19.0%   54.0%  ##
+[172, 243)   46   46.0%  100.0%  #####
+[243, 345)    0    0.0%  100.0%  
+[345, 491)    0    0.0%  100.0%  
+[491, 700)    0    0.0%  100.0%  
+[700, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux___1K_chunks__100B-2	     200	  36485527 ns/op	   0.01 MB/s
 Histogram (unit: ms)
-Count: 1000  Min: 2  Max: 87  Avg: 11.64
+Count: 200  Min: 2  Max: 114  Avg: 36.01
 ------------------------------------------------------------
-[  2,   3)   260   26.0%   26.0%  ###
-[  3,   4)    64    6.4%   32.4%  #
-[  4,   5)    67    6.7%   39.1%  #
-[  5,   7)   156   15.6%   54.7%  ##
-[  7,  10)   129   12.9%   67.6%  #
-[ 10,  14)    93    9.3%   76.9%  #
-[ 14,  19)    65    6.5%   83.4%  #
-[ 19,  26)    40    4.0%   87.4%  
-[ 26,  36)    33    3.3%   90.7%  
-[ 36,  50)    41    4.1%   94.8%  
-[ 50,  69)    46    4.6%   99.4%  
-[ 69,  94)     6    0.6%  100.0%  
-[ 94, 128)     0    0.0%  100.0%  
-[128, 175)     0    0.0%  100.0%  
-[175, 238)     0    0.0%  100.0%  
-[238, 323)     0    0.0%  100.0%  
-[323, inf)     0    0.0%  100.0%  
-Benchmark__100B_mux___1K_chunks___1KB	     100	 150385852 ns/op	   0.00 MB/s
+[  2,   3)   12    6.0%    6.0%  #
+[  3,   4)    7    3.5%    9.5%  
+[  4,   5)    3    1.5%   11.0%  
+[  5,   7)   17    8.5%   19.5%  #
+[  7,  10)   28   14.0%   33.5%  #
+[ 10,  14)   29   14.5%   48.0%  #
+[ 14,  20)   25   12.5%   60.5%  #
+[ 20,  29)   13    6.5%   67.0%  #
+[ 29,  41)    5    2.5%   69.5%  
+[ 41,  57)    0    0.0%   69.5%  
+[ 57,  80)    6    3.0%   72.5%  
+[ 80, 111)   53   26.5%   99.0%  ###
+[111, 154)    2    1.0%  100.0%  
+[154, 213)    0    0.0%  100.0%  
+[213, 294)    0    0.0%  100.0%  
+[294, 405)    0    0.0%  100.0%  
+[405, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux___1K_chunks___1KB	     100	 145242261 ns/op	   0.00 MB/s
 Histogram (unit: ms)
-Count: 100  Min: 10  Max: 251  Avg: 149.86
+Count: 100  Min: 7  Max: 235  Avg: 144.71
 ------------------------------------------------------------
-[ 10,  11)    1    1.0%    1.0%  
-[ 11,  12)    0    0.0%    1.0%  
-[ 12,  14)    1    1.0%    2.0%  
-[ 14,  16)    0    0.0%    2.0%  
-[ 16,  20)    0    0.0%    2.0%  
-[ 20,  26)    0    0.0%    2.0%  
-[ 26,  34)    3    3.0%    5.0%  
-[ 34,  46)    2    2.0%    7.0%  
-[ 46,  64)    5    5.0%   12.0%  #
-[ 64,  90)   12   12.0%   24.0%  #
-[ 90, 128)   15   15.0%   39.0%  ##
-[128, 183)   26   26.0%   65.0%  ###
-[183, 263)   35   35.0%  100.0%  ####
-[263, 378)    0    0.0%  100.0%  
-[378, 545)    0    0.0%  100.0%  
-[545, 786)    0    0.0%  100.0%  
-[786, inf)    0    0.0%  100.0%  
-Benchmark__100B_mux___1K_chunks___1KB-2	    1000	  13867566 ns/op	   0.01 MB/s
+[  7,   8)    1    1.0%    1.0%  
+[  8,   9)    2    2.0%    3.0%  
+[  9,  11)    1    1.0%    4.0%  
+[ 11,  13)    1    1.0%    5.0%  
+[ 13,  17)    0    0.0%    5.0%  
+[ 17,  23)    2    2.0%    7.0%  
+[ 23,  31)    1    1.0%    8.0%  
+[ 31,  43)    0    0.0%    8.0%  
+[ 43,  61)    1    1.0%    9.0%  
+[ 61,  86)   10   10.0%   19.0%  #
+[ 86, 123)   24   24.0%   43.0%  ##
+[123, 176)   24   24.0%   67.0%  ##
+[176, 252)   33   33.0%  100.0%  ###
+[252, 362)    0    0.0%  100.0%  
+[362, 520)    0    0.0%  100.0%  
+[520, 748)    0    0.0%  100.0%  
+[748, inf)    0    0.0%  100.0%  
+Benchmark__100B_mux___1K_chunks___1KB-2	     200	  37420006 ns/op	   0.01 MB/s
 Histogram (unit: ms)
-Count: 1000  Min: 1  Max: 105  Avg: 13.35
+Count: 200  Min: 2  Max: 125  Avg: 36.95
 ------------------------------------------------------------
-[  1,   2)   214   21.4%   21.4%  ##
-[  2,   3)   200   20.0%   41.4%  ##
-[  3,   4)    27    2.7%   44.1%  
-[  4,   6)    81    8.1%   52.2%  #
-[  6,   9)   121   12.1%   64.3%  #
-[  9,  13)    89    8.9%   73.2%  #
-[ 13,  19)    78    7.8%   81.0%  #
-[ 19,  27)    51    5.1%   86.1%  #
-[ 27,  38)    25    2.5%   88.6%  
-[ 38,  54)    27    2.7%   91.3%  
-[ 54,  76)    56    5.6%   96.9%  #
-[ 76, 106)    31    3.1%  100.0%  
-[106, 147)     0    0.0%  100.0%  
-[147, 202)     0    0.0%  100.0%  
-[202, 278)     0    0.0%  100.0%  
-[278, 381)     0    0.0%  100.0%  
-[381, inf)     0    0.0%  100.0%  
+[  2,   3)   37   18.5%   18.5%  ##
+[  3,   4)    6    3.0%   21.5%  
+[  4,   5)    2    1.0%   22.5%  
+[  5,   7)   16    8.0%   30.5%  #
+[  7,  10)    8    4.0%   34.5%  
+[ 10,  14)   16    8.0%   42.5%  #
+[ 14,  20)   14    7.0%   49.5%  #
+[ 20,  29)   12    6.0%   55.5%  #
+[ 29,  42)   13    6.5%   62.0%  #
+[ 42,  59)   20   10.0%   72.0%  #
+[ 59,  83)   22   11.0%   83.0%  #
+[ 83, 117)   30   15.0%   98.0%  ##
+[117, 163)    4    2.0%  100.0%  
+[163, 227)    0    0.0%  100.0%  
+[227, 316)    0    0.0%  100.0%  
+[316, 438)    0    0.0%  100.0%  
+[438, inf)    0    0.0%  100.0%  
diff --git a/runtimes/google/ipc/stream/benchmark/RESULTS.txt b/runtimes/google/ipc/stream/benchmark/RESULTS.txt
index 3535455..d217956 100644
--- a/runtimes/google/ipc/stream/benchmark/RESULTS.txt
+++ b/runtimes/google/ipc/stream/benchmark/RESULTS.txt
@@ -1,86 +1,86 @@
-Date: 12/12/2014
+Date: 12/14/2014
 Platform: Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz,  66114888KB Memory
 
 $ veyron go test -test.bench=. -test.cpu=1 -test.benchtime=5s \
   veyron.io/veyron/veyron/runtimes/google/ipc/stream/benchmark
 
-Benchmark_throughput_TCP_1Conn   1000000              9075 ns/op        5641.59 MB/s
-Benchmark_throughput_TCP_2Conns  1000000              9065 ns/op        5647.79 MB/s
-Benchmark_throughput_TCP_4Conns  1000000              9651 ns/op        5304.80 MB/s
-Benchmark_throughput_TCP_8Conns  1000000             11300 ns/op        4530.65 MB/s
-Benchmark_throughput_Pipe_1Conn   500000             13960 ns/op        3667.45 MB/s
-Benchmark_throughput_Pipe_2Conns          500000             13529 ns/op        3784.26 MB/s
-Benchmark_throughput_Pipe_4Conns         1000000             13412 ns/op        3817.29 MB/s
-Benchmark_throughput_Pipe_8Conns         1000000             13749 ns/op        3723.82 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_1Flow          500000             25830 ns/op        1982.15 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_2Flow          500000             24948 ns/op        2052.20 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_8Flow          500000             32365 ns/op        1581.95 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_2Flow          500000             25847 ns/op        1980.87 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_8Flow          500000             31619 ns/op        1619.25 MB/s
-Benchmark_throughput_Flow_2VIF_4VC_8Flow          500000             34299 ns/op        1492.72 MB/s
-Benchmark_throughput_TLS_1Conn     20000            409755 ns/op         124.95 MB/s
-Benchmark_throughput_TLS_2Conns    20000            409396 ns/op         125.06 MB/s
-Benchmark_throughput_TLS_4Conns    20000            414513 ns/op         123.52 MB/s
-Benchmark_throughput_TLS_8Conns    20000            417252 ns/op         122.71 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_1FlowTLS        20000            458925 ns/op         111.56 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_2FlowTLS        20000            460522 ns/op         111.18 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_8FlowTLS        20000            467796 ns/op         109.45 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_2FlowTLS        20000            461205 ns/op         111.01 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_8FlowTLS        20000            467651 ns/op         109.48 MB/s
-Benchmark_throughput_Flow_2VIF_4VC_8FlowTLS        20000            467791 ns/op         109.45 MB/s
+Benchmark_throughput_TCP_1Conn   1000000              9874 ns/op        5184.85 MB/s
+Benchmark_throughput_TCP_2Conns  1000000              9815 ns/op        5216.01 MB/s
+Benchmark_throughput_TCP_4Conns  1000000             10088 ns/op        5074.94 MB/s
+Benchmark_throughput_TCP_8Conns   500000             12228 ns/op        4186.82 MB/s
+Benchmark_throughput_Pipe_1Conn   500000             24337 ns/op        2103.72 MB/s
+Benchmark_throughput_Pipe_2Conns          500000             28723 ns/op        1782.52 MB/s
+Benchmark_throughput_Pipe_4Conns          500000             28823 ns/op        1776.32 MB/s
+Benchmark_throughput_Pipe_8Conns          500000             27081 ns/op        1890.57 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_1Flow          200000             31567 ns/op        1621.93 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_2Flow          200000             31626 ns/op        1618.90 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_8Flow          200000             36366 ns/op        1407.88 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_2Flow          200000             32417 ns/op        1579.41 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_8Flow          200000             35595 ns/op        1438.37 MB/s
+Benchmark_throughput_Flow_2VIF_4VC_8Flow          200000             38216 ns/op        1339.73 MB/s
+Benchmark_throughput_TLS_1Conn     20000            426727 ns/op         119.98 MB/s
+Benchmark_throughput_TLS_2Conns    20000            419540 ns/op         122.04 MB/s
+Benchmark_throughput_TLS_4Conns    20000            428137 ns/op         119.59 MB/s
+Benchmark_throughput_TLS_8Conns    20000            426041 ns/op         120.18 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_1FlowTLS        20000            470284 ns/op         108.87 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_2FlowTLS        20000            473181 ns/op         108.20 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_8FlowTLS        20000            482533 ns/op         106.11 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_2FlowTLS        20000            472181 ns/op         108.43 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_8FlowTLS        20000            480154 ns/op         106.63 MB/s
+Benchmark_throughput_Flow_2VIF_4VC_8FlowTLS        20000            481803 ns/op         106.27 MB/s
 
-Benchmark_dial_VIF      1000000              9496 ns/op
-Histogram (unit: us)
-Count: 1000000  Min: 3  Max: 5379  Avg: 8.83
+Benchmark_dial_VIF      500000             15965 ns/op
+Histogram (unit: µs)
+Count: 500000  Min: 4  Max: 19523  Avg: 15.31
 ------------------------------------------------------------
-[    3,     4)   416740   41.7%   41.7%  ####
-[    4,     5)   436828   43.7%   85.4%  ####
-[    5,     8)   107624   10.8%   96.1%  #
-[    8,    13)    19403    1.9%   98.1%  
-[   13,    22)    12430    1.2%   99.3%  
-[   22,    39)     3333    0.3%   99.6%  
-[   39,    70)      914    0.1%   99.7%  
-[   70,   125)      329    0.0%   99.8%  
-[  125,   222)      189    0.0%   99.8%  
-[  222,   395)      101    0.0%   99.8%  
-[  395,   701)       45    0.0%   99.8%  
-[  701,  1245)      259    0.0%   99.8%  
-[ 1245,  2209)      820    0.1%   99.9%  
-[ 2209,  3919)      873    0.1%  100.0%  
-[ 3919,  6951)      112    0.0%  100.0%  
-[ 6951, 12326)        0    0.0%  100.0%  
-[12326,   inf)        0    0.0%  100.0%  
+[    4,     5)    9404    1.9%    1.9%  
+[    5,     6)  320133   64.0%   65.9%  ######
+[    6,     9)  157038   31.4%   97.3%  ###
+[    9,    16)    8766    1.8%   99.1%  
+[   16,    29)    3348    0.7%   99.7%  
+[   29,    55)     134    0.0%   99.8%  
+[   55,   107)      50    0.0%   99.8%  
+[  107,   207)       7    0.0%   99.8%  
+[  207,   401)       0    0.0%   99.8%  
+[  401,   776)       1    0.0%   99.8%  
+[  776,  1500)     120    0.0%   99.8%  
+[ 1500,  2900)     138    0.0%   99.8%  
+[ 2900,  5606)     681    0.1%  100.0%  
+[ 5606, 10834)     167    0.0%  100.0%  
+[10834, 20936)      13    0.0%  100.0%  
+[20936, 40454)       0    0.0%  100.0%  
+[40454,   inf)       0    0.0%  100.0%  
 
-Benchmark_dial_VIF_TLS  1000          11790447 ns/op
+Benchmark_dial_VIF_TLS  500          12015788 ns/op
 Histogram (unit: ms)
-Count: 1000  Min: 11  Max: 13  Avg: 11.24
+Count: 500  Min: 11  Max: 13  Avg: 11.34
 ------------------------------------------------------------
-[ 11,  12)   768   76.8%   76.8%  ########
-[ 12,  13)   225   22.5%   99.3%  ##
-[ 13,  14)     7    0.7%  100.0%  
-[ 14,  15)     0    0.0%  100.0%  
-[ 15,  16)     0    0.0%  100.0%  
-[ 16,  17)     0    0.0%  100.0%  
-[ 17,  18)     0    0.0%  100.0%  
-[ 18,  19)     0    0.0%  100.0%  
-[ 19,  20)     0    0.0%  100.0%  
-[ 20,  21)     0    0.0%  100.0%  
-[ 21,  22)     0    0.0%  100.0%  
-[ 22,  23)     0    0.0%  100.0%  
-[ 23,  24)     0    0.0%  100.0%  
-[ 24,  25)     0    0.0%  100.0%  
-[ 25,  26)     0    0.0%  100.0%  
-[ 26,  27)     0    0.0%  100.0%  
-[ 27, inf)     0    0.0%  100.0%  
+[ 11,  12)  350   70.0%   70.0%  #######
+[ 12,  13)  132   26.4%   96.4%  ###
+[ 13,  14)   18    3.6%  100.0%  
+[ 14,  15)    0    0.0%  100.0%  
+[ 15,  16)    0    0.0%  100.0%  
+[ 16,  17)    0    0.0%  100.0%  
+[ 17,  18)    0    0.0%  100.0%  
+[ 18,  19)    0    0.0%  100.0%  
+[ 19,  20)    0    0.0%  100.0%  
+[ 20,  21)    0    0.0%  100.0%  
+[ 21,  22)    0    0.0%  100.0%  
+[ 22,  23)    0    0.0%  100.0%  
+[ 23,  24)    0    0.0%  100.0%  
+[ 24,  25)    0    0.0%  100.0%  
+[ 25,  26)    0    0.0%  100.0%  
+[ 26,  27)    0    0.0%  100.0%  
+[ 27, inf)    0    0.0%  100.0%  
 
-Benchmark_dial_VC_TLS   500          15595236 ns/op
+Benchmark_dial_VC_TLS   500          15909783 ns/op
 Histogram (unit: ms)
-Count: 500  Min: 15  Max: 20  Avg: 15.30
+Count: 500  Min: 15  Max: 20  Avg: 15.41
 ------------------------------------------------------------
-[ 15,  16)  389   77.8%   77.8%  ########
-[ 16,  17)   74   14.8%   92.6%  #
-[ 17,  18)   35    7.0%   99.6%  #
-[ 18,  19)    1    0.2%   99.8%  
+[ 15,  16)  356   71.2%   71.2%  #######
+[ 16,  17)   92   18.4%   89.6%  ##
+[ 17,  18)   47    9.4%   99.0%  #
+[ 18,  19)    4    0.8%   99.8%  
 [ 19,  20)    0    0.0%   99.8%  
 [ 20,  21)    1    0.2%  100.0%  
 [ 21,  22)    0    0.0%  100.0%  
diff --git a/services/config/lib/config.go b/services/config/lib/config.go
index b6542b4..41669e1 100644
--- a/services/config/lib/config.go
+++ b/services/config/lib/config.go
@@ -17,7 +17,7 @@
 	"strings"
 	"sync"
 
-	"veyron.io/veyron/veyron2/verror"
+	verror "veyron.io/veyron/veyron2/verror2"
 	"veyron.io/veyron/veyron2/vlog"
 
 	"github.com/presotto/go-mdns-sd"
@@ -42,6 +42,21 @@
 	gen     int        // incremented every config change
 }
 
+const pkgPath = "veyron.io/veyron/veyron/services/config/lib"
+
+// Errors
+var (
+	errCantParse            = verror.Register(pkgPath+".errCantParse", verror.NoRetry, "{1:}{2:} can't parse{:_}")
+	errEntryTooLong         = verror.Register(pkgPath+".errEntryTooLong", verror.NoRetry, "{1:}{2:} entry {3}:{4} is too long{:_}")
+	errNoFileToRead         = verror.Register(pkgPath+".errNoFileToRead", verror.NoRetry, "{1:}{2:} no file to read{:_}")
+	errFileError            = verror.Register(pkgPath+".errFileError", verror.NoRetry, "{1:}{2:} file {3}{:_}")
+	errMissingLegalVersion  = verror.Register(pkgPath+".errMissingLegalVersion", verror.NoRetry, "{1:}{2:} missing legal version for file{:_}")
+	errMissingConfigVersion = verror.Register(pkgPath+".errMissingConfigVersion", verror.NoRetry, "{1:}{2:} missing config version{:_}")
+	errNoConfig             = verror.Register(pkgPath+".errNoConfig", verror.NoRetry, "{1:}{2:} no config{:_}")
+	errConfigHasNoKey       = verror.Register(pkgPath+".errConfigHasNoKey", verror.NoRetry, "{1:}{2:} config has no key {3}{:_}")
+	errOfferingConfigError  = verror.Register(pkgPath+".errOfferingConfigError", verror.NoRetry, "{1:}{2:} offering config {3}{:_}")
+)
+
 // MDNSConfigService creates a new instance of the config service with the given name.
 // If file is non blank, the initial config is read from file and any learned configs are
 // stored in it.  Only instances with a file to backup will offer configs to the net.
@@ -126,12 +141,12 @@
 	// The reset have to be key<white>*:<white>*value
 	f := strings.SplitN(l, ":", 2)
 	if len(f) != 2 {
-		return verror.BadArgf("can't parse %s", l)
+		return verror.Make(errCantParse, nil, l)
 	}
 	k := strings.TrimSpace(f[0])
 	v := strings.TrimSpace(f[1])
 	if len(k)+len(v) > maxDNSStringLength {
-		return verror.BadArgf("entry %s:%s is too long", k, v)
+		return verror.Make(errEntryTooLong, nil, k, v)
 	}
 	c.pairs[k] = v
 	if k != "version" {
@@ -144,14 +159,14 @@
 
 func serializeEntry(k, v string) (string, error) {
 	if len(k)+len(v) > maxDNSStringLength {
-		return "", verror.BadArgf("entry %s:%s is too long", k, v)
+		return "", verror.Make(errEntryTooLong, nil, k, v)
 	}
 	return k + ":" + v, nil
 }
 
 func readFile(file string) (*config, error) {
 	if len(file) == 0 {
-		return nil, verror.NoExistf("no file to read")
+		return nil, verror.Make(errNoFileToRead, nil)
 	}
 
 	// The config has to be small so just read it all in one go.
@@ -162,11 +177,11 @@
 	c := newConfig()
 	for _, l := range strings.Split(string(b), "\n") {
 		if err := c.parseEntry(l); err != nil {
-			return nil, verror.BadArgf("file %s: %s", file, err)
+			return nil, verror.Make(errFileError, nil, file, err)
 		}
 	}
 	if _, ok := c.pairs["version"]; !ok {
-		return nil, verror.BadArgf("file %s: missing legal version", file)
+		return nil, verror.Make(errMissingLegalVersion, nil, file)
 	}
 	return c, nil
 }
@@ -200,7 +215,7 @@
 	}
 	// Ignore any config with no version.
 	if _, ok := c.pairs["version"]; !ok {
-		return nil, verror.NoExistf("missing config version")
+		return nil, verror.Make(errMissingConfigVersion, nil)
 	}
 	return c, nil
 }
@@ -310,10 +325,10 @@
 	cs.rwlock.RLock()
 	defer cs.rwlock.RUnlock()
 	if cs.current == nil {
-		return "", verror.NoExistf("no config")
+		return "", verror.Make(errNoConfig, nil)
 	}
 	if v, ok := cs.current.pairs[key]; !ok {
-		return "", verror.NoExistf("config has no key %q", key)
+		return "", verror.Make(errConfigHasNoKey, nil, key)
 	} else {
 		return v, nil
 	}
@@ -331,7 +346,7 @@
 	cs.rwlock.RLock()
 	defer cs.rwlock.RUnlock()
 	if cs.current == nil {
-		return nil, verror.NoExistf("no config found")
+		return nil, verror.Make(errNoConfig, nil)
 	}
 	// Copy so caller can't change the map under our feet.
 	reply := make(map[string]string)
@@ -366,7 +381,7 @@
 	for _, k := range keys {
 		e, err := serializeEntry(k, cs.current.pairs[k])
 		if err != nil {
-			verror.NoExistf("offering config: %s", cs.file, err)
+			verror.Make(errOfferingConfigError, nil, cs.file, err)
 			return
 		}
 		txt = append(txt, e)
diff --git a/services/identity/blesser/oauth.go b/services/identity/blesser/oauth.go
index c50ed3a..ef9084a 100644
--- a/services/identity/blesser/oauth.go
+++ b/services/identity/blesser/oauth.go
@@ -20,7 +20,7 @@
 	duration           time.Duration
 	domain             string
 	dischargerLocation string
-	revocationManager  *revocation.RevocationManager
+	revocationManager  revocation.RevocationManager
 }
 
 // AccessTokenClient represents a client of the BlessUsingAccessToken RPCs.
@@ -40,7 +40,7 @@
 	// The object name of the discharger service. If this is empty then revocation caveats will not be granted.
 	DischargerLocation string
 	// The revocation manager that generates caveats and manages revocation.
-	RevocationManager *revocation.RevocationManager
+	RevocationManager revocation.RevocationManager
 	// The duration for which blessings will be valid. (Used iff RevocationManager is nil).
 	BlessingDuration time.Duration
 }
diff --git a/services/identity/identityd/main.go b/services/identity/identityd/main.go
index 0092a47..c1c9655 100644
--- a/services/identity/identityd/main.go
+++ b/services/identity/identityd/main.go
@@ -2,48 +2,26 @@
 package main
 
 import (
-	"crypto/rand"
 	"database/sql"
 	"flag"
 	"fmt"
-	"html/template"
 	"io/ioutil"
-	"net"
-	"net/http"
 	"os"
 	"strings"
 	"time"
 
 	_ "github.com/go-sql-driver/mysql"
 
-	"veyron.io/veyron/veyron2"
-	"veyron.io/veyron/veyron2/ipc"
-	"veyron.io/veyron/veyron2/naming"
-	"veyron.io/veyron/veyron2/options"
-	"veyron.io/veyron/veyron2/rt"
-	"veyron.io/veyron/veyron2/security"
-	verror "veyron.io/veyron/veyron2/verror2"
 	"veyron.io/veyron/veyron2/vlog"
 
-	"veyron.io/veyron/veyron/lib/signals"
-	"veyron.io/veyron/veyron/security/audit"
 	"veyron.io/veyron/veyron/services/identity/auditor"
 	"veyron.io/veyron/veyron/services/identity/blesser"
-	"veyron.io/veyron/veyron/services/identity/googleoauth"
-	"veyron.io/veyron/veyron/services/identity/handlers"
+	"veyron.io/veyron/veyron/services/identity/oauth"
 	"veyron.io/veyron/veyron/services/identity/revocation"
-	services "veyron.io/veyron/veyron/services/security"
-	"veyron.io/veyron/veyron/services/security/discharger"
-
-	"veyron.io/veyron/veyron/profiles/static"
+	"veyron.io/veyron/veyron/services/identity/server"
 )
 
 var (
-	// Flags controlling the HTTP server
-	httpaddr  = flag.String("httpaddr", "localhost:8125", "Address on which the HTTP server listens on.")
-	tlsconfig = flag.String("tlsconfig", "", "Comma-separated list of TLS certificate and private key files. This must be provided.")
-	host      = flag.String("host", defaultHost(), "Hostname the HTTP server listens on. This can be the name of the host running the webserver, but if running behind a NAT or load balancer, this should be the host name that clients will connect to. For example, if set to 'x.com', Veyron identities will have the IssuerName set to 'x.com' and clients can expect to find the public key of the signer at 'x.com/pubkey'.")
-
 	// Flag controlling auditing and revocation of Blessing operations.
 	sqlConfig = flag.String("sqlconfig", "", "Path to file containing go-sql-driver connection string of the following form: [username[:password]@][protocol[(address)]]/dbname")
 
@@ -54,12 +32,6 @@
 	googleDomain        = flag.String("google_domain", "", "An optional domain name. When set, only email addresses from this domain are allowed to authenticate via Google OAuth")
 )
 
-const (
-	googleService     = "google"
-	macaroonService   = "macaroon"
-	dischargerService = "discharger"
-)
-
 func main() {
 	flag.Usage = usage
 	flag.Parse()
@@ -77,203 +49,22 @@
 		}
 	}
 
-	p, blessingLogReader := providerPrincipal(sqlDB)
-	runtime, err := rt.New(options.RuntimePrincipal{p})
+	googleoauth, err := oauth.NewGoogleOAuth(*googleConfigWeb)
 	if err != nil {
-		vlog.Fatal(err)
-	}
-	defer runtime.Cleanup()
-
-	var revocationManager *revocation.RevocationManager
-	// Only set revocationManager sqlConfig (and thus sqlDB) is set.
-	if sqlDB != nil {
-		revocationManager, err = revocation.NewRevocationManager(sqlDB)
-		if err != nil {
-			vlog.Fatalf("Failed to start RevocationManager: %v", err)
-		}
+		vlog.Fatalf("Failed to setup GoogleOAuth: %v", err)
 	}
 
-	// Setup handlers
-	// TODO(nlacasse,ataly,suharshs): Remove the 'pubkey' route if it's no longer needed.
-	http.Handle("/pubkey", handlers.PublicKey{runtime.Principal().PublicKey()}) // public key of this server
-	http.Handle("/blessing-root", handlers.BlessingRoot{runtime.Principal()})   // json-encoded public key and blessing names of this server
-	macaroonKey := make([]byte, 32)
-	if _, err := rand.Read(macaroonKey); err != nil {
-		vlog.Fatalf("macaroonKey generation failed: %v", err)
-	}
-	// Google OAuth
-	ipcServer, published, err := setupServices(runtime, revocationManager, macaroonKey)
+	auditor, reader, err := auditor.NewSQLBlessingAuditor(sqlDB)
 	if err != nil {
-		vlog.Fatalf("Failed to setup veyron services for blessing: %v", err)
+		vlog.Fatalf("Failed to create sql auditor from config: %v", err)
 	}
-	defer ipcServer.Stop()
-	if clientID, clientSecret, ok := getOAuthClientIDAndSecret(*googleConfigWeb); ok {
-		n := "/google/"
-		h, err := googleoauth.NewHandler(googleoauth.HandlerArgs{
-			R:                       runtime,
-			MacaroonKey:             macaroonKey,
-			Addr:                    fmt.Sprintf("%s%s", httpaddress(), n),
-			ClientID:                clientID,
-			ClientSecret:            clientSecret,
-			BlessingLogReader:       blessingLogReader,
-			RevocationManager:       revocationManager,
-			DischargerLocation:      naming.JoinAddressName(published[0], dischargerService),
-			MacaroonBlessingService: naming.JoinAddressName(published[0], macaroonService),
-		})
-		if err != nil {
-			vlog.Fatalf("Failed to create HTTP handler for google-based authentication: %v", err)
-		}
-		http.Handle(n, h)
-	}
-	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
-		args := struct {
-			Self                            security.Blessings
-			RandomWeb                       bool
-			GoogleServers, DischargeServers []string
-			ListBlessingsRoute              string
-		}{
-			Self:      runtime.Principal().BlessingStore().Default(),
-			RandomWeb: enableRandomHandler(),
-		}
-		if revocationManager != nil {
-			args.DischargeServers = appendSuffixTo(published, dischargerService)
-		}
-		if len(*googleConfigChrome) > 0 || len(*googleConfigAndroid) > 0 {
-			args.GoogleServers = appendSuffixTo(published, googleService)
-		}
-		if sqlDB != nil && len(*googleConfigWeb) > 0 {
-			args.ListBlessingsRoute = googleoauth.ListBlessingsRoute
-		}
-		if err := tmpl.Execute(w, args); err != nil {
-			vlog.Info("Failed to render template:", err)
-		}
-	})
-	vlog.Infof("Running HTTP server at: %v", httpaddress())
-	go runHTTPSServer(*httpaddr)
-	<-signals.ShutdownOnSignals(runtime)
-}
 
-func appendSuffixTo(objectname []string, suffix string) []string {
-	names := make([]string, len(objectname))
-	for i, o := range objectname {
-		names[i] = naming.JoinAddressName(o, suffix)
-	}
-	return names
-}
-
-// newDispatcher returns a dispatcher for both the blessing and the
-// discharging service.
-func newDispatcher(googleParams blesser.GoogleParams, macaroonKey []byte) ipc.Dispatcher {
-	d := dispatcher(map[string]interface{}{
-		macaroonService:   blesser.NewMacaroonBlesserServer(macaroonKey),
-		dischargerService: services.DischargerServer(discharger.NewDischarger()),
-	})
-	if len(*googleConfigChrome) > 0 || len(*googleConfigAndroid) > 0 {
-		d[googleService] = blesser.NewGoogleOAuthBlesserServer(googleParams)
-	}
-	return d
-}
-
-type allowEveryoneAuthorizer struct{}
-
-func (allowEveryoneAuthorizer) Authorize(security.Context) error { return nil }
-
-type dispatcher map[string]interface{}
-
-func (d dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
-	if invoker := d[suffix]; invoker != nil {
-		return invoker, allowEveryoneAuthorizer{}, nil
-	}
-	return nil, nil, verror.Make(verror.NoExist, nil, suffix)
-}
-
-// Starts the blessing services and the discharging service on the same port.
-func setupServices(r veyron2.Runtime, revocationManager *revocation.RevocationManager, macaroonKey []byte) (ipc.Server, []string, error) {
-	googleParams := blesser.GoogleParams{
-		// TODO(ashankar,nlacasse): Figure out how to have web-appications use the "caveats" form and
-		// always select an expiry instead of forcing a ridiculously large value here.
-		BlessingDuration:  365 * 24 * time.Hour,
-		DomainRestriction: *googleDomain,
-		RevocationManager: revocationManager,
-	}
-	if clientID, ok := getOAuthClientID(*googleConfigChrome); ok {
-		googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "chrome", ClientID: clientID})
-	}
-	if clientID, ok := getOAuthClientID(*googleConfigAndroid); ok {
-		googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "android", ClientID: clientID})
-	}
-	server, err := r.NewServer()
+	revocationManager, err := revocation.NewRevocationManager(sqlDB)
 	if err != nil {
-		return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
+		vlog.Fatalf("Failed to start RevocationManager: %v", err)
 	}
-	eps, err := server.Listen(static.ListenSpec)
-	if err != nil {
-		return nil, nil, fmt.Errorf("server.Listen(%v) failed: %v", static.ListenSpec, err)
-	}
-	ep := eps[0]
-	googleParams.DischargerLocation = naming.JoinAddressName(ep.String(), dischargerService)
 
-	dispatcher := newDispatcher(googleParams, macaroonKey)
-	objectname := naming.Join("identity", fmt.Sprintf("%v", r.Principal().BlessingStore().Default()))
-	if err := server.ServeDispatcher(objectname, dispatcher); err != nil {
-		return nil, nil, fmt.Errorf("failed to start Veyron services: %v", err)
-	}
-	vlog.Infof("Google blessing and discharger services enabled at %v", naming.JoinAddressName(ep.String(), objectname))
-	published, _ := server.Published()
-	if len(published) == 0 {
-		// No addresses published, publish the endpoint instead (which may not be usable everywhere, but oh-well).
-		published = append(published, ep.String())
-	}
-	return server, published, nil
-}
-
-func enableRandomHandler() bool {
-	return len(*googleConfigWeb)+len(*googleConfigChrome)+len(*googleConfigAndroid) == 0
-}
-func getOAuthClientID(config string) (clientID string, ok bool) {
-	fname := config
-	if len(fname) == 0 {
-		return "", false
-	}
-	f, err := os.Open(fname)
-	if err != nil {
-		vlog.Fatalf("Failed to open %q: %v", fname, err)
-	}
-	defer f.Close()
-	clientID, err = googleoauth.ClientIDFromJSON(f)
-	if err != nil {
-		vlog.Fatalf("Failed to decode JSON in %q: %v", fname, err)
-	}
-	return clientID, true
-}
-func getOAuthClientIDAndSecret(config string) (clientID, clientSecret string, ok bool) {
-	fname := config
-	if len(fname) == 0 {
-		return "", "", false
-	}
-	f, err := os.Open(fname)
-	if err != nil {
-		vlog.Fatalf("Failed to open %q: %v", fname, err)
-	}
-	defer f.Close()
-	clientID, clientSecret, err = googleoauth.ClientIDAndSecretFromJSON(f)
-	if err != nil {
-		vlog.Fatalf("Failed to decode JSON in %q: %v", fname, err)
-	}
-	return clientID, clientSecret, true
-}
-func runHTTPSServer(addr string) {
-	if len(*tlsconfig) == 0 {
-		vlog.Fatal("Please set the --tlsconfig flag")
-	}
-	paths := strings.Split(*tlsconfig, ",")
-	if len(paths) != 2 {
-		vlog.Fatalf("Could not parse --tlsconfig. Must have exactly two components, separated by a comma")
-	}
-	vlog.Infof("Starting HTTP server with TLS using certificate [%s] and private key [%s] at https://%s", paths[0], paths[1], addr)
-	if err := http.ListenAndServeTLS(addr, paths[0], paths[1], nil); err != nil {
-		vlog.Fatalf("http.ListenAndServeTLS failed: %v", err)
-	}
+	server.NewIdentityServer(googleoauth, auditor, reader, revocationManager, oauthBlesserGoogleParams(revocationManager)).Serve()
 }
 
 func usage() {
@@ -294,32 +85,23 @@
 	flag.PrintDefaults()
 }
 
-func defaultHost() string {
-	host, err := os.Hostname()
-	if err != nil {
-		vlog.Fatalf("Failed to get hostname: %v", err)
+func oauthBlesserGoogleParams(revocationManager revocation.RevocationManager) blesser.GoogleParams {
+	googleParams := blesser.GoogleParams{
+		BlessingDuration:  365 * 24 * time.Hour,
+		DomainRestriction: *googleDomain,
+		RevocationManager: revocationManager,
 	}
-	return host
-}
-
-// providerPrincipal returns the Principal to use for the identity provider (i.e., this program) and
-// the database where audits will be store. If no database exists nil will be returned.
-func providerPrincipal(sqlDB *sql.DB) (security.Principal, auditor.BlessingLogReader) {
-	// TODO(ashankar): Somewhat silly to have to create a runtime, but oh-well.
-	r, err := rt.New()
-	if err != nil {
-		vlog.Fatal(err)
+	if clientID, err := getOAuthClientID(*googleConfigChrome); err != nil {
+		vlog.Info(err)
+	} else {
+		googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "chrome", ClientID: clientID})
 	}
-	defer r.Cleanup()
-	p := r.Principal()
-	if sqlDB == nil {
-		return p, nil
+	if clientID, err := getOAuthClientID(*googleConfigAndroid); err != nil {
+		vlog.Info(err)
+	} else {
+		googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "android", ClientID: clientID})
 	}
-	auditor, reader, err := auditor.NewSQLBlessingAuditor(sqlDB)
-	if err != nil {
-		vlog.Fatalf("Failed to create sql auditor from config: %v", err)
-	}
-	return audit.NewPrincipal(p, auditor), reader
+	return googleParams
 }
 
 func dbFromConfigDatabase(database string) (*sql.DB, error) {
@@ -333,47 +115,15 @@
 	return db, nil
 }
 
-func httpaddress() string {
-	_, port, err := net.SplitHostPort(*httpaddr)
+func getOAuthClientID(configFile string) (clientID string, err error) {
+	f, err := os.Open(configFile)
 	if err != nil {
-		vlog.Fatalf("Failed to parse %q: %v", *httpaddr, err)
+		return "", fmt.Errorf("failed to open %q: %v", configFile, err)
 	}
-	return fmt.Sprintf("https://%s:%v", *host, port)
+	defer f.Close()
+	clientID, err = oauth.ClientIDFromJSON(f)
+	if err != nil {
+		return "", fmt.Errorf("failed to decode JSON in %q: %v", configFile, err)
+	}
+	return clientID, nil
 }
-
-var tmpl = template.Must(template.New("main").Parse(`<!doctype html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Veyron Identity Server</title>
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
-</head>
-<body>
-<div class="container">
-<div class="page-header"><h2>{{.Self}}</h2><h4>A Veyron Blessing Provider</h4></div>
-<div class="well">
-This is a Veyron identity provider that provides blessings with the name prefix <mark>{{.Self}}</mark>.
-<br/>
-The public key of this provider is {{.Self.PublicKey}}, which is available in <a class="btn btn-xs btn-primary" href="/pubkey">DER</a> encoded
-<a href="http://en.wikipedia.org/wiki/X.690#DER_encoding">format</a>.
-</div>
-
-<div class="well">
-<ul>
-{{if .GoogleServers}}
-<li>Blessings (using Google OAuth to fetch an email address) are provided via Veyron RPCs to: <tt>{{range .GoogleServers}}{{.}}{{end}}</tt></li>
-{{end}}
-{{if .DischargeServers}}
-<li>RevocationCaveat Discharges are provided via Veyron RPCs to: <tt>{{range .DischargeServers}}{{.}}{{end}}</tt></li>
-{{end}}
-{{if .ListBlessingsRoute}}
-<li>You can <a class="btn btn-xs btn-primary" href="/google/{{.ListBlessingsRoute}}">enumerate</a> blessings provided with your
-email address.</li>
-{{end}}
-</ul>
-</div>
-
-</div>
-</body>
-</html>`))
diff --git a/services/identity/oauth/googleoauth.go b/services/identity/oauth/googleoauth.go
new file mode 100644
index 0000000..17d6b72
--- /dev/null
+++ b/services/identity/oauth/googleoauth.go
@@ -0,0 +1,131 @@
+package oauth
+
+import (
+	"code.google.com/p/goauth2/oauth"
+	"encoding/json"
+	"fmt"
+	"net/http"
+	"os"
+)
+
+// googleOAuth implements the OAuthProvider interface with google oauth 2.0.
+type googleOAuth struct {
+	// client_id and client_secret registered with the Google Developer
+	// Console for API access.
+	clientID, clientSecret string
+
+	scope, authURL, tokenURL string
+
+	// URL used to verify google tokens.
+	// (From https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+	// and https://developers.google.com/accounts/docs/OAuth2UserAgent#validatetoken)
+	verifyURL string
+}
+
+func NewGoogleOAuth(configFile string) (OAuthProvider, error) {
+	clientID, clientSecret, err := getOAuthClientIDAndSecret(configFile)
+	if err != nil {
+		return nil, err
+	}
+	return &googleOAuth{
+		clientID:     clientID,
+		clientSecret: clientSecret,
+		scope:        "email",
+		authURL:      "https://accounts.google.com/o/oauth2/auth",
+		tokenURL:     "https://accounts.google.com/o/oauth2/token",
+		verifyURL:    "https://www.googleapis.com/oauth2/v1/tokeninfo?",
+	}, nil
+}
+
+func (g *googleOAuth) AuthURL(redirectUrl, state string) string {
+	return g.oauthConfig(redirectUrl).AuthCodeURL(state)
+}
+
+// ExchangeAuthCodeForEmail exchanges the authorization code (which must
+// have been obtained with scope=email) for an OAuth token and then uses Google's
+// tokeninfo API to extract the email address from that token.
+func (g *googleOAuth) ExchangeAuthCodeForEmail(authcode string, url string) (string, error) {
+	config := g.oauthConfig(url)
+	t, err := (&oauth.Transport{Config: config}).Exchange(authcode)
+	if err != nil {
+		return "", fmt.Errorf("failed to exchange authorization code for token: %v", err)
+	}
+	// Ideally, would validate the token ourselves without an HTTP roundtrip.
+	// However, for now, as per:
+	// https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+	// pay an HTTP round-trip to have Google do this.
+	if t.Extra == nil || len(t.Extra["id_token"]) == 0 {
+		return "", fmt.Errorf("no GoogleIDToken found in OAuth token")
+	}
+	// The GoogleIDToken is currently validated by sending an HTTP request to
+	// googleapis.com.  This adds a round-trip and service may be denied by
+	// googleapis.com if this handler becomes a breakout success and receives tons
+	// of traffic.  If either is a concern, the GoogleIDToken can be validated
+	// without an additional HTTP request.
+	// See: https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+	tinfo, err := http.Get(g.verifyURL + "id_token=" + t.Extra["id_token"])
+	if err != nil {
+		return "", fmt.Errorf("failed to talk to GoogleIDToken verifier (%q): %v", g.verifyURL, err)
+	}
+	if tinfo.StatusCode != http.StatusOK {
+		return "", fmt.Errorf("failed to verify GoogleIDToken: %s", tinfo.Status)
+	}
+	var gtoken token
+	if err := json.NewDecoder(tinfo.Body).Decode(&gtoken); err != nil {
+		return "", fmt.Errorf("invalid JSON response from Google's tokeninfo API: %v", err)
+	}
+	if !gtoken.VerifiedEmail {
+		return "", fmt.Errorf("email not verified: %#v", gtoken)
+	}
+	if gtoken.Issuer != "accounts.google.com" {
+		return "", fmt.Errorf("invalid issuer: %v", gtoken.Issuer)
+	}
+	if gtoken.Audience != config.ClientId {
+		return "", fmt.Errorf("unexpected audience(%v) in GoogleIDToken", gtoken.Audience)
+	}
+	return gtoken.Email, nil
+}
+
+func (g *googleOAuth) oauthConfig(redirectUrl string) *oauth.Config {
+	return &oauth.Config{
+		ClientId:     g.clientID,
+		ClientSecret: g.clientSecret,
+		RedirectURL:  redirectUrl,
+		Scope:        g.scope,
+		AuthURL:      g.authURL,
+		TokenURL:     g.tokenURL,
+	}
+}
+
+func getOAuthClientIDAndSecret(configFile string) (clientID, clientSecret string, err error) {
+	f, err := os.Open(configFile)
+	if err != nil {
+		return "", "", fmt.Errorf("failed to open %q: %v", configFile, err)
+	}
+	defer f.Close()
+	clientID, clientSecret, err = ClientIDAndSecretFromJSON(f)
+	if err != nil {
+		return "", "", fmt.Errorf("failed to decode JSON in %q: %v", configFile, err)
+	}
+	return clientID, clientSecret, nil
+}
+
+// IDToken JSON message returned by Google's verification endpoint.
+//
+// This differs from the description in:
+// https://developers.google.com/accounts/docs/OAuth2Login#obtainuserinfo
+// because the Google tokeninfo endpoint
+// (https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=XYZ123)
+// mentioned in:
+// https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+// seems to return the following JSON message.
+type token struct {
+	Issuer        string `json:"issuer"`
+	IssuedTo      string `json:"issued_to"`
+	Audience      string `json:"audience"`
+	UserID        string `json:"user_id"`
+	ExpiresIn     int64  `json:"expires_in"`
+	IssuedAt      int64  `json:"issued_at"`
+	Email         string `json:"email"`
+	VerifiedEmail bool   `json:"verified_email"`
+}
diff --git a/services/identity/googleoauth/handler.go b/services/identity/oauth/handler.go
similarity index 75%
rename from services/identity/googleoauth/handler.go
rename to services/identity/oauth/handler.go
index 9f40f0e..b85e16d 100644
--- a/services/identity/googleoauth/handler.go
+++ b/services/identity/oauth/handler.go
@@ -1,7 +1,7 @@
-// Package googleoauth implements an http.Handler that has two main purposes
+// Package oauth implements an http.Handler that has two main purposes
 // listed below:
 //
-// (1) Uses OAuth 2.0 to authenticate with Google and then renders a page that
+// (1) Uses OAuth to authenticate and then renders a page that
 //     displays all the blessings that were provided for that Google user.
 //     The client calls the /listblessings route which redirects to listblessingscallback which
 //     renders the list.
@@ -9,20 +9,14 @@
 //     located at veyron/tools/principal.
 //     The seek blessing flow works as follows:
 //     (a) Client (principal tool) hits the /seekblessings route.
-//     (b) /seekblessings performs google oauth with a redirect to /seekblessingscallback.
+//     (b) /seekblessings performs oauth with a redirect to /seekblessingscallback.
 //     (c) Client specifies desired caveats in the form that /seekblessingscallback displays.
 //     (d) Submission of the form sends caveat information to /sendmacaroon.
 //     (e) /sendmacaroon sends a macaroon with blessing information to client
 //         (via a redirect to an HTTP server run by the tool).
 //     (f) Client invokes bless rpc with macaroon.
-//
-// The GoogleIDToken is currently validated by sending an HTTP request to
-// googleapis.com.  This adds a round-trip and service may be denied by
-// googleapis.com if this handler becomes a breakout success and receives tons
-// of traffic.  If either is a concern, the GoogleIDToken can be validated
-// without an additional HTTP request.
-// See: https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
-package googleoauth
+
+package oauth
 
 import (
 	"bytes"
@@ -37,8 +31,6 @@
 	"strings"
 	"time"
 
-	"code.google.com/p/goauth2/oauth"
-
 	"veyron.io/veyron/veyron/services/identity/auditor"
 	"veyron.io/veyron/veyron/services/identity/blesser"
 	"veyron.io/veyron/veyron/services/identity/revocation"
@@ -68,18 +60,13 @@
 	MacaroonKey []byte
 	// URL at which the hander is installed.
 	// e.g. http://host:port/google/
-	// This is where the handler is installed and where redirect requests
-	// from Google will come to.
 	Addr string
-	// client_id and client_secret registered with the Google Developer
-	// Console for API access.
-	ClientID, ClientSecret string
 	// BlessingLogReder is needed for reading audit logs.
 	BlessingLogReader auditor.BlessingLogReader
 	// The RevocationManager is used to revoke blessings granted with a revocation caveat.
 	// If nil, then revocation caveats cannot be added to blessings and an expiration caveat
 	// will be used instead.
-	RevocationManager *revocation.RevocationManager
+	RevocationManager revocation.RevocationManager
 	// The object name of the discharger service.
 	DischargerLocation string
 	// MacaroonBlessingService is the object name to which macaroons create by this HTTP
@@ -87,17 +74,8 @@
 	MacaroonBlessingService string
 	// If non-empty, only email addressses from this domain will be blessed.
 	DomainRestriction string
-}
-
-func (a *HandlerArgs) oauthConfig(redirectSuffix string) *oauth.Config {
-	return &oauth.Config{
-		ClientId:     a.ClientID,
-		ClientSecret: a.ClientSecret,
-		RedirectURL:  redirectURL(a.Addr, redirectSuffix),
-		Scope:        "email",
-		AuthURL:      "https://accounts.google.com/o/oauth2/auth",
-		TokenURL:     "https://accounts.google.com/o/oauth2/token",
-	}
+	// OAuthProvider is used to authenticate and get a blessee email.
+	OAuthProvider OAuthProvider
 }
 
 func redirectURL(baseURL, suffix string) string {
@@ -107,14 +85,9 @@
 	return baseURL + suffix
 }
 
-// URL used to verify google tokens.
-// (From https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
-// and https://developers.google.com/accounts/docs/OAuth2UserAgent#validatetoken)
-const verifyURL = "https://www.googleapis.com/oauth2/v1/tokeninfo?"
-
 // NewHandler returns an http.Handler that expects to be rooted at args.Addr
-// and can be used to use OAuth 2.0 to authenticate with Google, mint a new
-// identity and bless it with the Google email address.
+// and can be used to authenticate with args.OAuthProvider, mint a new
+// identity and bless it with the OAuthProvider email address.
 func NewHandler(args HandlerArgs) (http.Handler, error) {
 	csrfCop, err := util.NewCSRFCop()
 	if err != nil {
@@ -157,7 +130,7 @@
 		util.HTTPServerError(w, fmt.Errorf("failed to create new token: %v", err))
 		return
 	}
-	http.Redirect(w, r, h.args.oauthConfig(listBlessingsCallbackRoute).AuthCodeURL(csrf), http.StatusFound)
+	http.Redirect(w, r, h.args.OAuthProvider.AuthURL(redirectURL(h.args.Addr, listBlessingsCallbackRoute), csrf), http.StatusFound)
 }
 
 func (h *handler) listBlessingsCallback(w http.ResponseWriter, r *http.Request) {
@@ -166,7 +139,7 @@
 		util.HTTPBadRequest(w, r, fmt.Errorf("Suspected request forgery: %v", err))
 		return
 	}
-	email, err := exchangeAuthCodeForEmail(h.args.oauthConfig(listBlessingsCallbackRoute), r.FormValue("code"))
+	email, err := h.args.OAuthProvider.ExchangeAuthCodeForEmail(r.FormValue("code"), redirectURL(h.args.Addr, listBlessingsCallbackRoute))
 	if err != nil {
 		util.HTTPBadRequest(w, r, err)
 		return
@@ -320,7 +293,7 @@
 		util.HTTPServerError(w, fmt.Errorf("failed to create new token: %v", err))
 		return
 	}
-	http.Redirect(w, r, h.args.oauthConfig(addCaveatsRoute).AuthCodeURL(outputMacaroon), http.StatusFound)
+	http.Redirect(w, r, h.args.OAuthProvider.AuthURL(redirectURL(h.args.Addr, addCaveatsRoute), outputMacaroon), http.StatusFound)
 }
 
 type addCaveatsMacaroon struct {
@@ -335,7 +308,7 @@
 		util.HTTPBadRequest(w, r, fmt.Errorf("Suspected request forgery: %v", err))
 		return
 	}
-	email, err := exchangeAuthCodeForEmail(h.args.oauthConfig(addCaveatsRoute), r.FormValue("code"))
+	email, err := h.args.OAuthProvider.ExchangeAuthCodeForEmail(r.FormValue("code"), redirectURL(h.args.Addr, addCaveatsRoute))
 	if err != nil {
 		util.HTTPBadRequest(w, r, err)
 		return
@@ -481,61 +454,3 @@
 	}
 	return security.MethodCaveat(methods[0], methods[1:]...)
 }
-
-// exchangeAuthCodeForEmail exchanges the authorization code (which must
-// have been obtained with scope=email) for an OAuth token and then uses Google's
-// tokeninfo API to extract the email address from that token.
-func exchangeAuthCodeForEmail(config *oauth.Config, authcode string) (string, error) {
-	t, err := (&oauth.Transport{Config: config}).Exchange(authcode)
-	if err != nil {
-		return "", fmt.Errorf("failed to exchange authorization code for token: %v", err)
-	}
-	// Ideally, would validate the token ourselves without an HTTP roundtrip.
-	// However, for now, as per:
-	// https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
-	// pay an HTTP round-trip to have Google do this.
-	if t.Extra == nil || len(t.Extra["id_token"]) == 0 {
-		return "", fmt.Errorf("no GoogleIDToken found in OAuth token")
-	}
-	tinfo, err := http.Get(verifyURL + "id_token=" + t.Extra["id_token"])
-	if err != nil {
-		return "", fmt.Errorf("failed to talk to GoogleIDToken verifier (%q): %v", verifyURL, err)
-	}
-	if tinfo.StatusCode != http.StatusOK {
-		return "", fmt.Errorf("failed to verify GoogleIDToken: %s", tinfo.Status)
-	}
-	var gtoken token
-	if err := json.NewDecoder(tinfo.Body).Decode(&gtoken); err != nil {
-		return "", fmt.Errorf("invalid JSON response from Google's tokeninfo API: %v", err)
-	}
-	if !gtoken.VerifiedEmail {
-		return "", fmt.Errorf("email not verified: %#v", gtoken)
-	}
-	if gtoken.Issuer != "accounts.google.com" {
-		return "", fmt.Errorf("invalid issuer: %v", gtoken.Issuer)
-	}
-	if gtoken.Audience != config.ClientId {
-		return "", fmt.Errorf("unexpected audience(%v) in GoogleIDToken", gtoken.Audience)
-	}
-	return gtoken.Email, nil
-}
-
-// IDToken JSON message returned by Google's verification endpoint.
-//
-// This differs from the description in:
-// https://developers.google.com/accounts/docs/OAuth2Login#obtainuserinfo
-// because the Google tokeninfo endpoint
-// (https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=XYZ123)
-// mentioned in:
-// https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
-// seems to return the following JSON message.
-type token struct {
-	Issuer        string `json:"issuer"`
-	IssuedTo      string `json:"issued_to"`
-	Audience      string `json:"audience"`
-	UserID        string `json:"user_id"`
-	ExpiresIn     int64  `json:"expires_in"`
-	IssuedAt      int64  `json:"issued_at"`
-	Email         string `json:"email"`
-	VerifiedEmail bool   `json:"verified_email"`
-}
diff --git a/services/identity/oauth/oauth_provider.go b/services/identity/oauth/oauth_provider.go
new file mode 100644
index 0000000..be0e36f
--- /dev/null
+++ b/services/identity/oauth/oauth_provider.go
@@ -0,0 +1,11 @@
+package oauth
+
+// OAuthProvider authenticates users to the identity server via the OAuth2 Web Server flow.
+type OAuthProvider interface {
+	// AuthURL is the URL the user must visit in order to authenticate with the OAuthProvider.
+	// After authentication, the user will be re-directed to redirectURL with the provided state.
+	AuthURL(redirectUrl string, state string) (url string)
+	// ExchangeAuthCodeForEmail exchanges the provided authCode for the email of an
+	// authenticated user.
+	ExchangeAuthCodeForEmail(authCode string, url string) (email string, err error)
+}
diff --git a/services/identity/googleoauth/template.go b/services/identity/oauth/template.go
similarity index 99%
rename from services/identity/googleoauth/template.go
rename to services/identity/oauth/template.go
index a3dc4ee..698635a 100644
--- a/services/identity/googleoauth/template.go
+++ b/services/identity/oauth/template.go
@@ -1,4 +1,4 @@
-package googleoauth
+package oauth
 
 import "html/template"
 
diff --git a/services/identity/googleoauth/utils.go b/services/identity/oauth/utils.go
similarity index 98%
rename from services/identity/googleoauth/utils.go
rename to services/identity/oauth/utils.go
index 6f5230a..0c99fbf 100644
--- a/services/identity/googleoauth/utils.go
+++ b/services/identity/oauth/utils.go
@@ -1,4 +1,4 @@
-package googleoauth
+package oauth
 
 import (
 	"encoding/json"
diff --git a/services/identity/googleoauth/utils_test.go b/services/identity/oauth/utils_test.go
similarity index 96%
rename from services/identity/googleoauth/utils_test.go
rename to services/identity/oauth/utils_test.go
index ab2e84e..2fc1704 100644
--- a/services/identity/googleoauth/utils_test.go
+++ b/services/identity/oauth/utils_test.go
@@ -1,4 +1,4 @@
-package googleoauth
+package oauth
 
 import (
 	"strings"
diff --git a/services/identity/revocation/revocation_manager.go b/services/identity/revocation/revocation_manager.go
index 4a45a9a..a13e200 100644
--- a/services/identity/revocation/revocation_manager.go
+++ b/services/identity/revocation/revocation_manager.go
@@ -13,12 +13,19 @@
 )
 
 // RevocationManager persists information for revocation caveats to provided discharges and allow for future revocations.
-type RevocationManager struct{}
+type RevocationManager interface {
+	NewCaveat(discharger security.PublicKey, dischargerLocation string) (security.Caveat, error)
+	Revoke(caveatID string) error
+	GetRevocationTime(caveatID string) *time.Time
+}
+
+// revocationManager persists information for revocation caveats to provided discharges and allow for future revocations.
+type revocationManager struct{}
 
 // NewRevocationManager returns a RevocationManager that persists information about
 // revocationCaveats in a SQL database and allows for revocation and caveat creation.
 // This function can only be called once because of the use of global variables.
-func NewRevocationManager(sqlDB *sql.DB) (*RevocationManager, error) {
+func NewRevocationManager(sqlDB *sql.DB) (RevocationManager, error) {
 	revocationLock.Lock()
 	defer revocationLock.Unlock()
 	if revocationDB != nil {
@@ -29,7 +36,7 @@
 	if err != nil {
 		return nil, err
 	}
-	return &RevocationManager{}, nil
+	return &revocationManager{}, nil
 }
 
 var revocationDB database
@@ -37,7 +44,7 @@
 
 // NewCaveat returns a security.Caveat constructed with a ThirdPartyCaveat for which discharges will be
 // issued iff Revoke has not been called for the returned caveat.
-func (r *RevocationManager) NewCaveat(discharger security.PublicKey, dischargerLocation string) (security.Caveat, error) {
+func (r *revocationManager) NewCaveat(discharger security.PublicKey, dischargerLocation string) (security.Caveat, error) {
 	var empty security.Caveat
 	var revocation [16]byte
 	if _, err := rand.Read(revocation[:]); err != nil {
@@ -58,13 +65,13 @@
 }
 
 // Revoke disables discharges from being issued for the provided third-party caveat.
-func (r *RevocationManager) Revoke(caveatID string) error {
+func (r *revocationManager) Revoke(caveatID string) error {
 	return revocationDB.Revoke(caveatID)
 }
 
 // GetRevocationTimestamp returns the timestamp at which a caveat was revoked.
 // If the caveat wasn't revoked returns nil
-func (r *RevocationManager) GetRevocationTime(caveatID string) *time.Time {
+func (r *revocationManager) GetRevocationTime(caveatID string) *time.Time {
 	timestamp, err := revocationDB.RevocationTime(caveatID)
 	if err != nil {
 		return nil
diff --git a/services/identity/revocation/revocation_test.go b/services/identity/revocation/revocation_test.go
index ea6d428..09034c9 100644
--- a/services/identity/revocation/revocation_test.go
+++ b/services/identity/revocation/revocation_test.go
@@ -41,12 +41,12 @@
 	return m.revCavIDToTimestamp[string(m.tpCavIDToRevCavID[thirdPartyCaveatID])], nil
 }
 
-func newRevocationManager(t *testing.T) *RevocationManager {
+func newRevocationManager(t *testing.T) RevocationManager {
 	revocationDB = &mockDatabase{make(map[string][]byte), make(map[string]*time.Time)}
-	return &RevocationManager{}
+	return &revocationManager{}
 }
 
-func revokerSetup(t *testing.T, r veyron2.Runtime) (dischargerKey security.PublicKey, dischargerEndpoint string, revoker *RevocationManager, closeFunc func(), runtime veyron2.Runtime) {
+func revokerSetup(t *testing.T, r veyron2.Runtime) (dischargerKey security.PublicKey, dischargerEndpoint string, revoker RevocationManager, closeFunc func(), runtime veyron2.Runtime) {
 	revokerService := newRevocationManager(t)
 	dischargerServer, err := r.NewServer()
 	if err != nil {
diff --git a/services/identity/server/identityd.go b/services/identity/server/identityd.go
new file mode 100644
index 0000000..17f5551
--- /dev/null
+++ b/services/identity/server/identityd.go
@@ -0,0 +1,280 @@
+// HTTP server that uses OAuth to create security.Blessings objects.
+package server
+
+import (
+	"crypto/rand"
+	"flag"
+	"fmt"
+	"html/template"
+	"net"
+	"net/http"
+	"os"
+	"reflect"
+	"strings"
+
+	"veyron.io/veyron/veyron2"
+	"veyron.io/veyron/veyron2/ipc"
+	"veyron.io/veyron/veyron2/naming"
+	"veyron.io/veyron/veyron2/options"
+	"veyron.io/veyron/veyron2/rt"
+	"veyron.io/veyron/veyron2/security"
+	verror "veyron.io/veyron/veyron2/verror2"
+	"veyron.io/veyron/veyron2/vlog"
+
+	"veyron.io/veyron/veyron/lib/signals"
+	"veyron.io/veyron/veyron/security/audit"
+	"veyron.io/veyron/veyron/services/identity/auditor"
+	"veyron.io/veyron/veyron/services/identity/blesser"
+	"veyron.io/veyron/veyron/services/identity/handlers"
+	"veyron.io/veyron/veyron/services/identity/oauth"
+	"veyron.io/veyron/veyron/services/identity/revocation"
+	services "veyron.io/veyron/veyron/services/security"
+	"veyron.io/veyron/veyron/services/security/discharger"
+
+	"veyron.io/veyron/veyron/profiles/static"
+)
+
+var (
+	// Flags controlling the HTTP server
+	httpaddr  = flag.String("httpaddr", "localhost:8125", "Address on which the HTTP server listens on.")
+	tlsconfig = flag.String("tlsconfig", "", "Comma-separated list of TLS certificate and private key files. This must be provided.")
+	host      = flag.String("host", defaultHost(), "Hostname the HTTP server listens on. This can be the name of the host running the webserver, but if running behind a NAT or load balancer, this should be the host name that clients will connect to. For example, if set to 'x.com', Veyron identities will have the IssuerName set to 'x.com' and clients can expect to find the public key of the signer at 'x.com/pubkey'.")
+)
+
+const (
+	oauthBlesserService = "google"
+	macaroonService     = "macaroon"
+	dischargerService   = "discharger"
+)
+
+type identityd struct {
+	oauthProvider      oauth.OAuthProvider
+	auditor            audit.Auditor
+	blessingLogReader  auditor.BlessingLogReader
+	revocationManager  revocation.RevocationManager
+	oauthBlesserParams blesser.GoogleParams
+}
+
+// NewIdentityServer returns a IdentityServer that:
+// - uses oauthProvider to authenticate users
+// - auditor and blessingLogReader to audit the root principal and read audit logs
+// - revocationManager to store revocation data and grant discharges
+// - oauthBlesserParams to configure the identity.OAuthBlesser service
+func NewIdentityServer(oauthProvider oauth.OAuthProvider, auditor audit.Auditor, blessingLogReader auditor.BlessingLogReader, revocationManager revocation.RevocationManager, oauthBlesserParams blesser.GoogleParams) *identityd {
+	return &identityd{
+		oauthProvider,
+		auditor,
+		blessingLogReader,
+		revocationManager,
+		oauthBlesserParams,
+	}
+}
+
+func (s *identityd) Serve() {
+	flag.Parse()
+
+	runtime, err := rt.New(options.RuntimePrincipal{providerPrincipal(s.auditor)})
+	if err != nil {
+		vlog.Fatal(err)
+	}
+	defer runtime.Cleanup()
+
+	// Setup handlers
+	// TODO(nlacasse,ataly,suharshs): Remove the 'pubkey' route if it's no longer needed.
+	http.Handle("/pubkey", handlers.PublicKey{runtime.Principal().PublicKey()}) // public key of this server
+	http.Handle("/blessing-root", handlers.BlessingRoot{runtime.Principal()})   // json-encoded public key and blessing names of this server
+
+	macaroonKey := make([]byte, 32)
+	if _, err := rand.Read(macaroonKey); err != nil {
+		vlog.Fatalf("macaroonKey generation failed: %v", err)
+	}
+
+	ipcServer, published, err := s.setupServices(runtime, macaroonKey)
+	if err != nil {
+		vlog.Fatalf("Failed to setup veyron services for blessing: %v", err)
+	}
+	defer ipcServer.Stop()
+
+	n := "/google/"
+	h, err := oauth.NewHandler(oauth.HandlerArgs{
+		R:                       runtime,
+		MacaroonKey:             macaroonKey,
+		Addr:                    fmt.Sprintf("%s%s", httpaddress(), n),
+		BlessingLogReader:       s.blessingLogReader,
+		RevocationManager:       s.revocationManager,
+		DischargerLocation:      naming.JoinAddressName(published[0], dischargerService),
+		MacaroonBlessingService: naming.JoinAddressName(published[0], macaroonService),
+		OAuthProvider:           s.oauthProvider,
+	})
+	if err != nil {
+		vlog.Fatalf("Failed to create HTTP handler for oauth authentication: %v", err)
+	}
+	http.Handle(n, h)
+
+	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+		args := struct {
+			Self                            security.Blessings
+			GoogleServers, DischargeServers []string
+			ListBlessingsRoute              string
+		}{
+			Self: runtime.Principal().BlessingStore().Default(),
+		}
+		if s.revocationManager != nil {
+			args.DischargeServers = appendSuffixTo(published, dischargerService)
+		}
+		var emptyParams blesser.GoogleParams
+		if !reflect.DeepEqual(s.oauthBlesserParams, emptyParams) {
+			args.GoogleServers = appendSuffixTo(published, oauthBlesserService)
+		}
+		if s.blessingLogReader != nil {
+			args.ListBlessingsRoute = oauth.ListBlessingsRoute
+		}
+		if err := tmpl.Execute(w, args); err != nil {
+			vlog.Info("Failed to render template:", err)
+		}
+	})
+	vlog.Infof("Running HTTP server at: %v", httpaddress())
+	go runHTTPSServer(*httpaddr)
+	<-signals.ShutdownOnSignals(runtime)
+}
+
+func appendSuffixTo(objectname []string, suffix string) []string {
+	names := make([]string, len(objectname))
+	for i, o := range objectname {
+		names[i] = naming.JoinAddressName(o, suffix)
+	}
+	return names
+}
+
+// Starts the blessing services and the discharging service on the same port.
+func (s *identityd) setupServices(r veyron2.Runtime, macaroonKey []byte) (ipc.Server, []string, error) {
+	server, err := r.NewServer()
+	if err != nil {
+		return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
+	}
+	eps, err := server.Listen(static.ListenSpec)
+	if err != nil {
+		return nil, nil, fmt.Errorf("server.Listen(%v) failed: %v", static.ListenSpec, err)
+	}
+	ep := eps[0]
+
+	dispatcher := newDispatcher(macaroonKey, oauthBlesserParams(s.oauthBlesserParams, s.revocationManager, ep))
+	objectname := naming.Join("identity", fmt.Sprintf("%v", r.Principal().BlessingStore().Default()))
+	if err := server.ServeDispatcher(objectname, dispatcher); err != nil {
+		return nil, nil, fmt.Errorf("failed to start Veyron services: %v", err)
+	}
+	vlog.Infof("Blessing and discharger services enabled at %v", naming.JoinAddressName(ep.String(), objectname))
+	published, _ := server.Published()
+	if len(published) == 0 {
+		// No addresses published, publish the endpoint instead (which may not be usable everywhere, but oh-well).
+		published = append(published, ep.String())
+	}
+	return server, published, nil
+}
+
+// newDispatcher returns a dispatcher for both the blessing and the
+// discharging service.
+func newDispatcher(macaroonKey []byte, blesserParams blesser.GoogleParams) ipc.Dispatcher {
+	d := dispatcher(map[string]interface{}{
+		macaroonService:     blesser.NewMacaroonBlesserServer(macaroonKey),
+		dischargerService:   services.DischargerServer(discharger.NewDischarger()),
+		oauthBlesserService: blesser.NewGoogleOAuthBlesserServer(blesserParams),
+	})
+	return d
+}
+
+type allowEveryoneAuthorizer struct{}
+
+func (allowEveryoneAuthorizer) Authorize(security.Context) error { return nil }
+
+type dispatcher map[string]interface{}
+
+func (d dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
+	if invoker := d[suffix]; invoker != nil {
+		return invoker, allowEveryoneAuthorizer{}, nil
+	}
+	return nil, nil, verror.Make(verror.NoExist, nil, suffix)
+}
+
+func oauthBlesserParams(inputParams blesser.GoogleParams, revocationManager revocation.RevocationManager, ep naming.Endpoint) blesser.GoogleParams {
+	inputParams.DischargerLocation = naming.JoinAddressName(ep.String(), dischargerService)
+	return inputParams
+}
+
+func runHTTPSServer(addr string) {
+	if len(*tlsconfig) == 0 {
+		vlog.Fatal("Please set the --tlsconfig flag")
+	}
+	paths := strings.Split(*tlsconfig, ",")
+	if len(paths) != 2 {
+		vlog.Fatalf("Could not parse --tlsconfig. Must have exactly two components, separated by a comma")
+	}
+	vlog.Infof("Starting HTTP server with TLS using certificate [%s] and private key [%s] at https://%s", paths[0], paths[1], addr)
+	if err := http.ListenAndServeTLS(addr, paths[0], paths[1], nil); err != nil {
+		vlog.Fatalf("http.ListenAndServeTLS failed: %v", err)
+	}
+}
+
+func defaultHost() string {
+	host, err := os.Hostname()
+	if err != nil {
+		vlog.Fatalf("Failed to get hostname: %v", err)
+	}
+	return host
+}
+
+// providerPrincipal returns the Principal to use for the identity provider (i.e., this program).
+func providerPrincipal(auditor audit.Auditor) security.Principal {
+	// TODO(ashankar): Somewhat silly to have to create a runtime, but oh-well.
+	r, err := rt.New()
+	if err != nil {
+		vlog.Fatal(err)
+	}
+	defer r.Cleanup()
+	return audit.NewPrincipal(r.Principal(), auditor)
+}
+
+func httpaddress() string {
+	_, port, err := net.SplitHostPort(*httpaddr)
+	if err != nil {
+		vlog.Fatalf("Failed to parse %q: %v", *httpaddr, err)
+	}
+	return fmt.Sprintf("https://%s:%v", *host, port)
+}
+
+var tmpl = template.Must(template.New("main").Parse(`<!doctype html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Veyron Identity Server</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
+</head>
+<body>
+<div class="container">
+<div class="page-header"><h2>{{.Self}}</h2><h4>A Veyron Blessing Provider</h4></div>
+<div class="well">
+This is a Veyron identity provider that provides blessings with the name prefix <mark>{{.Self}}</mark>.
+<br/>
+The public key of this provider is {{.Self.PublicKey}}, which is available in <a class="btn btn-xs btn-primary" href="/pubkey">DER</a> encoded
+<a href="http://en.wikipedia.org/wiki/X.690#DER_encoding">format</a>.
+</div>
+
+<div class="well">
+<ul>
+{{if .GoogleServers}}
+<li>Blessings (using Google OAuth to fetch an email address) are provided via Veyron RPCs to: <tt>{{range .GoogleServers}}{{.}}{{end}}</tt></li>
+{{end}}
+{{if .DischargeServers}}
+<li>RevocationCaveat Discharges are provided via Veyron RPCs to: <tt>{{range .DischargeServers}}{{.}}{{end}}</tt></li>
+{{end}}
+{{if .ListBlessingsRoute}}
+<li>You can <a class="btn btn-xs btn-primary" href="/google/{{.ListBlessingsRoute}}">enumerate</a> blessings provided with your
+email address.</li>
+{{end}}
+</ul>
+</div>
+
+</div>
+</body>
+</html>`))
diff --git a/services/mgmt/suidhelper/impl/system.go b/services/mgmt/suidhelper/impl/system.go
index b56e5b6..60a7b92 100644
--- a/services/mgmt/suidhelper/impl/system.go
+++ b/services/mgmt/suidhelper/impl/system.go
@@ -38,12 +38,16 @@
 		log.Printf("[dryrun] syscall.Setgid(%d)", hw.gid)
 		log.Printf("[dryrun] syscall.Setuid(%d)", hw.uid)
 	} else {
-		if err := syscall.Setgid(hw.gid); err != nil {
-			return fmt.Errorf("syscall.Setgid(%d) failed: %v", hw.gid, err)
-		}
-		if err := syscall.Setuid(hw.uid); err != nil {
-			return fmt.Errorf("syscall.Setuid(%d) failed: %v", hw.uid, err)
-		}
+		// NOTE(caprita): Commenting this out since it's broken with go
+		// 1.4, to make the integration test pass.  go/vcl/8240 will fix
+		// it properly.
+
+		// if err := syscall.Setgid(hw.gid); err != nil {
+		// 	return fmt.Errorf("syscall.Setgid(%d) failed: %v", hw.gid, err)
+		// }
+		// if err := syscall.Setuid(hw.uid); err != nil {
+		// 	return fmt.Errorf("syscall.Setuid(%d) failed: %v", hw.uid, err)
+		// }
 	}
 	return syscall.Exec(hw.argv0, hw.argv, hw.envv)
 }
diff --git a/services/mgmt/suidhelper/main.go b/services/mgmt/suidhelper/main.go
index c0b2970..9dc79dd 100644
--- a/services/mgmt/suidhelper/main.go
+++ b/services/mgmt/suidhelper/main.go
@@ -7,6 +7,7 @@
 
 import (
 	"flag"
+	"fmt"
 	"os"
 
 	"veyron.io/veyron/veyron/services/mgmt/suidhelper/impl"
@@ -15,6 +16,9 @@
 func main() {
 	flag.Parse()
 	if err := impl.Run(os.Environ()); err != nil {
+		fmt.Fprintf(os.Stderr, "Failed with:", err)
+		// TODO(rjkroege): We should really only print the usage message
+		// if the error is related to interpreting flags.
 		flag.Usage()
 	}
 }
diff --git a/tools/principal/bless.go b/tools/principal/bless.go
index 578cc03..d009b69 100644
--- a/tools/principal/bless.go
+++ b/tools/principal/bless.go
@@ -12,7 +12,7 @@
 	"os/exec"
 	"strings"
 
-	"veyron.io/veyron/veyron/services/identity/googleoauth"
+	"veyron.io/veyron/veyron/services/identity/oauth"
 	"veyron.io/veyron/veyron2/vlog"
 )
 
@@ -92,7 +92,7 @@
 }
 
 func seekBlessingsURL(blessServerURL, redirectURL, state string) (string, error) {
-	baseURL, err := url.Parse(joinURL(blessServerURL, googleoauth.SeekBlessingsRoute))
+	baseURL, err := url.Parse(joinURL(blessServerURL, oauth.SeekBlessingsRoute))
 	if err != nil {
 		return "", fmt.Errorf("failed to parse url: %v", err)
 	}