zed.0xff.me
Rails streaming VS mongrel, thin, ebb and Passenger
С некоторых пор моим любимым веб-сервером для руби приложений является thin
.
Но сегодня он меня конкретно разочаровал. Как, впрочем и mongrel
.
Как нетрудно догадаться из заголовка, дело касается streaming
(про стриминг в рельсах читать тут, начиная с Streaming data and/or controlling the page generation)
((и почему они не автогенерят id для хидеров?? можно было бы ссылку сразу куда надо поставить..)
пример там приведен такой:
1 2 3 4 5 6 7 |
# Streams about 180 MB of generated data to the browser. render :text => proc { |response, output| 10_000_000.times do |i| output.write("This is line #{i}\n") output.flush end } |
так вот, что thin
, что mongrel
, оба тупо забивают на этот стриминг, и пытаются всосать в себя всё что им рельсы отдают, а потом выплюнуть юзеру единым куском..
thin
, например, делает так:
1 2 |
terminate called after throwing an instance of 'std::runtime_error' what(): no allocation for outbound data |
а mongrel
так:
1 2 |
Error calling Dispatcher.dispatch #<NoMemoryError: failed to allocate memory> /usr/lib64/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/cgi_process.rb:58:in `write' |
Еще хотел быстренько попробовать ebb, но не обнаружил в дистрибутиве внятных инструкций по его установке и настройке.. ладно, запустил через Ebb.start_server("/path/to/rails/app")
, но толку от этого оказалось мало – на порту он поднялся, но ни на один запрос отвечать не захотел.. тупо висел и думал о чем-то там своем..
And the winner is…
Passenger. Хоть я его раньше и не использовал, и довольно таки скептически к нему относился, но он успешно зарекомендовал себя в продакшене, легко поставился (потянув, естественно за собой апача, которого я тоже недолюбливаю..) (хмм.. хотя он есть и для nginx, это несколько меняет дело, на досуге поковыряю)
Так вот, Passenger легко отдал псевдофайлик размером 2 гига с локалхоста на локалхост со скоростью около 12 мегабайт в секунду. При этом не показав никакого значительного увеличения потребления памяти!
PS:
Linux zz 2.6.31-gentoo-r6-zz #1 SMP PREEMPT Tue Dec 22 01:38:46 YEKT 2009 x86_64 Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz GenuineIntel GNU/Linux
Rails 2.3.5
mongrel 1.1.5
thin 1.2.5
passenger 2.2.9