2015-10-27 2 views
6

В настоящее время я работаю над рубиновым приложением, но он работает очень (очень!) Медленно .. До сих пор я пробовал пару вещей, и я мог сузить это касается основной проблемы: Ruby пытается искать ее в каждом отдельном каталоге в $ LOAD_PATH.Запуск приложения Ruby ужасно медленно из-за необходимости от GEM_HOME

В основном, что я наблюдаю, это то, что рубин просматривает лот файлов, пытаясь выяснить, существует ли там необходимость. Если он их не найдет, он перейдет в следующий каталог. Самое приятное, что я вижу, как это происходит с strace. Существует много продукции, как это:

open("/boa_proj_build/nsteen/.gem/gems/i18n-0.7.0/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/thread_safe-0.3.5/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/tzinfo-1.2.2/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/minitest-5.8.2/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/activesupport-4.2.4/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/climate_control-0.0.3/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/cocaine-0.5.7/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/boa_loggable-0.2.2/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/ruby_expect-1.6.0/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/cctools-3.0.1/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/git-1.2.9.1/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/naught-1.1.0/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/symbolizer-0.0.1/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/settingslogic-2.0.9/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/memoist-0.12.0/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/highline-1.7.8/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/boa_proj_build/nsteen/.gem/gems/commander-4.3.5/lib/commander/help_formatters/base.rb", O_RDONLY|O_CLOEXEC) = 8 

Как вы можете видеть, он смотрит через некоторые каталоги, чтобы найти его требования.

Трассировка это с помощью тестового приложения, фильтрация для ошибки ENOENT и подсчета мест где, отображает следующую относительно выхода:

vdi9442:/boa_proj_build/nsteen/$ strace packager --version 2>&1 | grep ENOENT | wc -l 
3454261 

из-конечно, 3,5 миллиона много. И это приведет к времени загрузки около 5 минут (и около половины без strace), прежде чем он выведет его номер версии (функциональность по умолчанию из драгоценного камня командира).

Я удалил весь свой домашний каталог драгоценных камней и снова проверил тест, и он сразу же быстрее, но я вижу, что он снова просматривает эти несколько драгоценных камней (зависимостей, таких как командир), но «всего» несколько тысяч случаев вместо 3,5 мил.

Моего драгоценный камень окр выглядит следующим образом:

- GEM PATHS: 
    - /boa_proj_build/nsteen/.gem 
    - /home/nsteen/.gem/ruby/2.1.0 
    - /cadappl/ruby/2.1.1/ruby/lib/ruby/gems/2.1.0 

Похоже, рубин просто шел через весь мой путь нагрузки, чтобы удовлетворить некоторую зависимость. Все в порядке, но это просто смешно. Кто-нибудь знает, что происходит? Я не подозреваю об этом/по умолчанию?

Кто-нибудь знает, что происходит? И как я могу ускорить дело?

+0

Рубигемы иногда могут быть невозможными. [Эта статья о сайте] (http://www.sitepoint.com/rubygems-slow/) с апреля подробно описывает некоторые из них и что можно сделать по этому поводу. – wspurgin

+0

Из любопытства вы уже используете [bundler] (http://bundler.io/)? – wspurgin

+0

@wspurgin, что не может быть проблемой. Это итерация по уже установленным драгоценным камням. Кроме того, Да. Использование связки. –

ответ

4

Есть немало способов борьбы с этим, включая файлы gemrc, что я не буду вдаваться в. Назову некоторые из вариантов у вас есть:

Решение 1:

Другой ответ правильный, но я хотел бы расширить немного на эту тему, так как это один, что люди, кажется, часто лицо , RVM может помочь. Для этого важна одна особенность. Я лично переехал в рбенв и не оглянулся. Rbenv намного менее навязчив в вашей среде, чем RVM, но они оба великолепны. Вы можете использовать gemsets как в RVM, так и в Rbenv, чтобы ограничить, какие драгоценные камни доступны для вашего приложения. Вы также можете создать конкретный gemset приложения. С помощью gemset ваше приложение будет выглядеть в одном месте и будет загружать только драгоценные камни, которые он использовал. Он не будет смешиваться с другими наборами приложений. Самое лучшее в этом - автоматическое, вам просто нужно настроить его один раз, и он будет автоматически переключаться, когда вы находитесь в этом каталоге.Он также интегрирован с Rubymine и другими IDE/редакторами, которые поддерживают Ruby.

Решение 2:

Set GEM_PATH переменной среды одной из локаций. Это переопределяет все остальное, поэтому он, по крайней мере, перестанет смотреть в разных местах.

Решение 3 (Application оптимизация загрузки):

Что-то вы могли бы смотреть на это, если вы используете Bundler, вы можете только требуют специальных камней использования, когда они необходимы. Например, если вы используете снаряженная камень в одном модуле вашего приложения, добавьте в начало файла загрузки модуля:

require 'curb' 

и изменить Gemfile поэтому линия загрузки Снаряженная выглядит следующим образом:

gem 'curb', require: false 

Меньше драгоценных камней, которые вы загружаете, когда ваше приложение запускается быстрее, оно будет загружено. Функция авто требует большой, но часто забывается и считается само собой разумеющимся. Удивительно, какая разница.

+0

Спасибо за подробный ответ! –

+0

Lol, извините, я как-то вошел в полупрондел. Просто вещи, которые я чувствовал, могут знать люди, которые могут видеть этот вопрос. –

+0

Не пожалеете, очень благодарен :) –

1

Я бы предложил использовать rvm для рубиновой версии и управления драгоценными камнями. С помощью rvm вы можете создавать специальные гемзеты и рубиновые версии.

Я надеюсь, что это решит вашу проблему.

https://rvm.io/

+0

Мы фактически ищем решение, использующее «gem install», так как наш пользователь должен установить оснастку. –

Смежные вопросы