Module: Rainbows::XEpollThreadSpawn

Includes:
Base
Defined in:
lib/rainbows/xepoll_thread_spawn.rb

Overview

This is an edge-triggered epoll concurrency model with blocking accept() in a (hopefully) native thread. This is comparable to ThreadSpawn and CoolioThreadSpawn, but is Linux-only and able to exploit “wake one” accept() behavior of a blocking accept() call when used with native threads.

This supports streaming “rack.input” and allows :pool_size tuning independently of worker_connections

Disadvantages

This is only supported under Linux 2.6 and later kernels.

Compared to CoolioThreadSpawn

This does not buffer outgoing responses in userspace at all, meaning it can lower response latency to fast clients and also prevent starvation of other clients when reading slow disks for responses (when combined with native threads).

CoolioThreadSpawn is likely better for trickling large static files or proxying responses to slow clients, but this is likely better for fast clients.

Unlikely CoolioThreadSpawn, this supports streaming “rack.input” which is useful for reading large uploads from fast clients.

Compared to ThreadSpawn

This can maintain idle connections without the memory overhead of an idle Thread. The cost of handling/dispatching active connections is exactly the same for an equivalent number of active connections.

RubyGem Requirements

  • raindrops 0.6.0 or later

  • sleepy_penguin 3.0.1 or later

Instance Method Summary collapse

Methods included from Base

included, #process_client, #reopen_worker_logs, #sig_receiver

Instance Method Details

#init_worker_process(worker) ⇒ Object



47
48
49
50
51
# File 'lib/rainbows/xepoll_thread_spawn.rb', line 47

def init_worker_process(worker)
  super
  require "rainbows/xepoll_thread_spawn/client"
  Rainbows::Client.__send__ :include, Client
end

#worker_loop(worker) ⇒ Object

:nodoc:



53
54
55
56
# File 'lib/rainbows/xepoll_thread_spawn.rb', line 53

def worker_loop(worker) # :nodoc:
  init_worker_process(worker)
  Client.loop
end