performance considerations

I had heard reports from users of rack-queue-metrics that under high load, this gem causes the web server to grind to a halt. I began to better undersand what this gem was doing and came across some big performance concerns. In summary, making lots of syscalls for every web request is going to dramatically increase latency. Given that customers using this gem are **latency sensitive** I am proposing that we rethink our approach.

* Remove individual queue time
* Report queue depth every second.

Here is my performance review for a trivial rack app:

## System Information

```bash
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        64-bit
CPU(s):                8
Thread(s) per core:    1
Core(s) per socket:    1
CPU socket(s):         8
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 26
Stepping:              5
CPU MHz:               2133.408
Hypervisor vendor:     Xen
Virtualization type:   para
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              4096K

$ free
             total       used       free     shared    buffers     cached
Mem:       7362688     732928    6629760          0      49340     322892
-/+ buffers/cache:     360696    7001992
Swap:            0          0          0

$ ruby -v
ruby 1.9.3p392 (2013-02-22 revision 39386) [x86_64-linux]

$ unicorn -v
unicorn v4.6.2

$ rackup -v
Rack 1.2 (Release: 1.5)
```

## Without rack-queue-metrics

```bash
$ cat config.ru
run Proc.new {|env|
  [200, {'Content-Type' => 'text/plain'}, ["ok"]]
}

$ cat unicorn.rb
worker_processes Integer(ENV["UNICORN_WORKERS"] || 3)
timeout 15
preload_app true
```

```bash
$ bundle exec unicorn -p $PORT -c unicorn.rb &
$ ab -c 10 -n 10000 http://localhost:8000/

...

  50%      4
  66%      4
  75%      4
  80%      5
  90%      5
  95%      7
  98%     10
  99%     11
 100%     18 (longest request)
```

## With rack-queue-metrics

```bash
$ cat config.ru
require 'raindrops'
require 'rack-queue-metrics'
use Raindrops::Middleware
use Rack::QueueMetrics::Middleware
run Proc.new {|env|
  [200, {'Content-Type' => 'text/plain'}, ["ok"]]
}

$ cat unicorn.rb
worker_processes Integer(ENV["UNICORN_WORKERS"] || 3)
timeout 15
preload_app true
```

```bash
$ bundle exec unicorn -p $PORT -c unicorn.rb &
$ ab -c 10 -n 10000 http://localhost:8000/

...

  50%     26
  66%     27
  75%     28
  80%     29
  90%     31
  95%     33
  98%     35
  99%     37
 100%     90 (longest request)
```

## With included performance improvements

```bash
$ bundle exec unicorn -p $PORT -c unicorn.rb &
$ ab -c 10 -n 10000 http://localhost:8000/

...

  50%      4
  66%      4
  75%      5
  80%      5
  90%      5
  95%      7
  98%     11
  99%     12
 100%     14 (longest request)
```