Ruby Application Server Experiments
Ruby Shell
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
bin
config
sample
server
Gemfile
README.md
config.ru

README.md

Ruby Application Server Experiments

How to Test?

First run:

./bin/slow-server.rb

This would simulate a slow remote server, which has two possible behaviours, one for responding very slowly, and another for responding a very large response. 4M data, to be precise. Then you can run the desired server to be tested. After you launched the desired server, you can siege it via:

http://localhost:8080/cpu

which is a CPU bound request.

http://localhost:8080/latency

which would try to get response from the slow remote server for slow response.

http://localhost:8080/through

which would try to get response from the slow remote server for large data.

TL;DR

  • Puma = Zbatery + ThreadPool
  • Thin = Zbatery + EventMachine
  • Thin cluster = Rainbows + EventMachine
  • Threaded Thin = Zbatery + EventMachine + ThreadPool
  • Threaded Thin cluster = Rainbows + EventMachine + ThreadPool

Recommendation

  • I/O heavy applications => Zbatery + EventMachine + FiberSpawn
  • CPU heavy applications => Rainbows + EventMachine + ThreadPool
  • Not sure? => Zbatery + EventMachine + ThreadPool
  • JRuby => Puma

What Server to Pick?

Thread pool based: (for fast clients (i.e. have nginx or so in front) and should setup pool size accordingly)

  • ./server/zbatery-thread-pool.sh
  • ./server/rainbows-thread-pool.sh
  • ./server/puma-thread-pool.sh

Thread spawn based: (for fast clients (i.e. have nginx or so in front))

  • ./server/zbatery-thread-spawn.sh
  • ./server/rainbows-thread-spawn.sh
  • ./server/webrick-thread-spawn.sh (not recommended, crashed)

Fiber pool based: (not recommended)

  • ./server/zbatery-fiber-pool.sh
  • ./server/rainbows-fiber-pool.sh

Fiber spawn based: (not recommended)

  • ./server/zbatery-fiber-spawn.sh
  • ./server/rainbows-fiber-spawn.sh

EventMachine based: (for slow clients (i.e. no nginx or so in front) and non-CPU bound apps)

  • ./server/rainbows-em.sh
  • ./server/zbatery-em.sh
  • ./server/thin-em.sh

EventMachine and thread pool based: (for slow clients (i.e. no nginx or so in front) and should setup pool size accordingly)

  • ./server/zbatery-em-thread-pool.sh
  • ./server/rainbows-em-thread-pool.sh
  • ./server/thin-em-thread-pool.sh

EventMachine and thread spawn based: (for slow clients (i.e. no nginx or so in front))

  • ./server/zbatery-em-thread-spawn.sh
  • ./server/rainbows-em-thread-spawn.sh
  • ./server/thin-em-thread-spawn.sh (not recommended, weird results)

EventMachine and fiber spawn based: (for slow clients (i.e. no nginx or so in front) and for non-CPU bound apps)

  • ./server/zbatery-em-fiber-spawn.sh
  • ./server/rainbows-em-fiber-spawn.sh
  • ./server/thin-em-fiber-spawn.sh