Почему мой сайт синатра так медленно?

После запроса этого вопроса, я начал использовать Sinatra как способ обслуживания веб-страниц.

В этот вечер мой друг и я начали проверять скорость сервера.

Файл для входа выглядит следующим образом:

require 'rubygems'
require 'sinatra'
require 'haml'

enable :sessions #for cookies!

get '/' do 
  haml :index 
end

И index.haml выглядит так:

%title
  First Page

%header 
  %h2 First Page

Он сидит на недавнем ноутбуке, как и я, с маршрутизатором Apple 802.11n между двумя из нас. Мы оба запускаем Windows 7. Я также пробовал эти же файлы на ноутбуке под управлением Ubuntu 9.10 x64 с Sinatra и всеми соответствующими файлами, установленными с apt-get.

Sinatra занимает 7 секунд, чтобы обслуживать один запрос страницы, независимо от ОС сервера, Windows или Linux. Я вижу, что здесь автору удалось обработать более 400 запросов/секунду. Что дает? (или это должно быть на SuperUser или тому подобное?)

Ответ 1

Я остановлю любые мнения о том, когда вы должны оптимизировать свое веб-приложение.

Настройте различные конфигурации в приложении Sinatra для разработки и производства, потому что некоторые из этих предложений вы не всегда будете использовать. На самом деле вам следует, вероятно, пойти дальше, настроить и настроить среду, аналогичную тому, как вы будете развертываться в процессе производства. Вы не будете развертывать, просто запустив ruby app.rb. Вы хотите поставить apache или nginx перед своим Монгрелем. Mongrel будет обслуживать ваши статические файлы, но это действительно рекомендуется только для режима разработки. В развертывании веб-сервер собирается сделать для этого намного лучшую работу. Короче говоря, ваша развернутая среда будет быстрее, чем ваша автономная среда разработки.

В этот момент я не стал бы беспокоиться о Монгреле против Тин. Если Thin в два раза быстрее - это не так, то ваши 7 секунд станут 3.5. Будет ли это достаточно хорошо?

Некоторые вещи, которые нужно попробовать...

Я знаю, что я просто сказал вам настроить среду развертывания, но, возможно, это не серверная сторона. Вы пробовали использовать YSlow или PageSpeed ​​ на ваши страницы? Входы/выходы занимают больше этих 7 секунд (Отказ от ответственности: я предполагаю, что нет ничего плохого в настройке вашей сети), чем сервер. YSlow - Firebug на самом деле - расскажет вам, сколько времени займет каждая часть вашей страницы, чтобы добраться до браузера.

Одна из вещей, которую YSlow сказал мне сделать, - это поставить далеко вперед заголовок Expires на мои статические активы, о которых я знал, но я оставил оптимизацию до конца. Это, когда я понял, что было как минимум 3 разных места, которые я мог бы указать в этом заголовке. Я убеждаю себя, что делать это в nginx - это правильное место для его размещения.

Если вы довольны этими результатами, вы можете посмотреть на сервер. Сверху моей головы, так что не исчерпывающе

  • Включите ответы gzip.
  • Объедините свои таблицы стилей, чтобы там был только один запрос на страницу. Для этого может быть некоторое промежуточное ПО Rack, если вы не сделаете это вручную.
  • Cache. Я пытаюсь Rack:: Cache.
  • Используйте спрайты, чтобы уменьшить количество загружаемых изображений.
  • Измените свой Javascript. Опять же, возможно, через промежуточное ПО Rack.

Rack Middleware - это аккуратный, но он использует процессор. Таким образом, ручное сокращение вашего Javascript добавляет новый шаг к вашему рабочему процессу, но на сервере он быстрее, чем Middleware. Это компромисс.

Извините, если это было неистово.

Ответ 2

У меня была эта проблема при запуске Sinatra с дробовиком, но не при запуске моего приложения напрямую (т.е. ruby -rubygems app.rb). Это потому, что дробовик вилки и перезагружает приложение для каждого запроса.

Я нашел поток в списке рассылки Sinatra, в котором обсуждалась эта проблема, и люди там советовали использовать rerun вместо дробовика. Я рад сказать, что он решил эту проблему для меня.

Ответ 3

Попробуйте использовать Thin как сервер. Я заметил увеличение производительности по сравнению с WEBrick и Mongrel.

gem install thin

При запуске приложения с помощью ruby TestServer.rb вы увидите следующее:

Sinatra/0.10.1 вышла на этап 4567 для разработки с резервным копированием Thin

Ответ 4

Я запускаю Sinatra внутри VMWare Fusion с Vagrant. Мое приложение работало медленно (около десяти секунд для обслуживания запроса). Затем я нашел этот камень:

Webrick очень медленно реагирует. Как ускорить его?

Кажется, что WEBrick был (по умолчанию) настроен на обратный поиск dns на каждый запрос, и это замедляло его.