Ответ 1
Один сервер Nailgun
Возможно генерировать binstub для рельсов...
$ bundle binstubs rails
... и отредактируйте его, чтобы установить JRUBY_OPTS.
ENV['JRUBY_OPTS'] = '--1.9 --ng --nailgun-port 2113'
load Gem.bin_path('rails', 'rails')
Таким образом, только завернутая пакетом часть клиента выполняется на сервере nailgun-wrapped.
Так как nailgun не распространяет сигналы, вы можете использовать контроллер, чтобы остановить его:
class RailsController < ApplicationController
def stop
Process.kill :INT, 0
end
end
Benchmark:
$ time bin/rails -v # modified
Rails 3.0.11
real 0m3.737s
user 0m6.579s
sys 0m0.223s
$ time bin/rails -v # unmodified
Rails 3.0.11
real 0m5.547s
user 0m12.739s
sys 0m0.411s
$ time bundle exec rails -v
Rails 3.0.11
real 0m9.145s
user 0m20.708s
sys 0m0.682s
Два сервера Nailgun
Второй "сервер, не связанный с пакетом", может быть использован в теории. Чтобы избежать явных перезапусков, но разрешить убийство (с двумя нажатиями Ctrl-C), я бы предложил этот цикл:
$ while sleep 1; do jruby --ng-server 2112; done
Порт для второго экземпляра nailgun должен быть указан во внешнем клиенте:
$ JRUBY_OPTS='--1.9 --ng --nailgun-port 2112' bin/rails s
Я не видел улучшения производительности, и вывод, появляющийся в "неправильной" консоли, раздражает. Но, возможно, это происходит быстрее в других системах. И кто-то другой может увидеть способ улучшить этот подход?