2011-01-19 18 views
44

Tôi tự hỏi liệu có cách nào tương đối dễ dàng để tăng tốc thời gian tải bàn điều khiển của tôi không, thời gian này bắt đầu tiếp cận 30 giây. Tôi có rất nhiều lớp con có phương pháp dường như không bị ảnh hưởng bởi reload! vì vậy tôi kết thúc việc mở và đóng bảng điều khiển rất nhiều. IRB tải sét nhanh.Rails 3 - Speed ​​up Console Thời gian tải

Tôi có quá nhiều đá quý không? Làm thế nào để tôi đi về thời gian các nhiệm vụ tải để tôi có thể xem những gì đang chiếm nhiều thời gian nhất? Như bạn thấy, tôi đã thử đá quý dev-boost không có kết quả. Các ứng dụng là tốt trong hành khách, nó chỉ là giao diện điều khiển tải rằng lỗi crap ra khỏi tôi. Chạy trên MBP OSX 10.6.6 với RAM 2.4GHz và 4GB. Không sử dụng RVM.

phiên bản:

Ovid$ rails -v 
Rails 3.0.3 
Ovid$ ruby -v 
ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10] 

Memory:

Ovid$ vm_stat 
Mach Virtual Memory Statistics: (page size of 4096 bytes) 
Pages free:       118818. 
Pages active:      341320. 
Pages inactive:      99490. 
Pages speculative:     310576. 
Pages wired down:     112527. 
"Translation faults":    23097323. 
Pages copy-on-write:    1270961. 
Pages zero filled:    13836659. 
Pages reactivated:      36. 
Pageins:       165761. 
Pageouts:        0. 
Object cache: 28 hits of 760846 lookups (0% hit rate) 

Gemfile:

source 'http://rubygems.org' 

gem 'rails', '3.0.3' 
gem 'mysql2' 
gem 'foreigner' 
gem 'haml' 
gem 'capistrano' 
gem 'nokogiri' 

#web services 
gem 'yammer4r' 
gem 'ruby-freshbooks' 

#authentication gems from nifty generator 
gem "bcrypt-ruby", :require => "bcrypt" 
gem "mocha", :group => :test 
gem 'authlogic' 

#dev 
group :development do 
    gem 'rails-dev-boost', :git => 'git://github.com/thedarkone/rails-dev-boost.git', :require => 'rails_development_boost' 
end 

#testing 
group :test do 
    gem 'database_cleaner' 
    gem 'cucumber-rails' 
    gem 'cucumber' 
    gem 'rspec-rails' 
    gem 'spork' 
    gem 'launchy' 
    gem 'machinist' 
    gem 'faker' 
    gem 'capybara' 
end 

Cảm ơn bạn rất nhiều!

+0

Câu hỏi hay! Hãy cho chúng tôi biết những gì bạn tìm hiểu. :) –

+0

Cũng được đăng lên http://www.ruby-forum.com/topic/914379 – pendevere

Trả lời

1

Tôi chỉ có thể đề xuất đặt áo khoác trong phòng thí nghiệm của bạn và chia sẻ vấn đề. Xem nếu bình luận ra tất cả các yêu cầu đá quý của bạn tăng tốc độ những thứ lên (có lẽ đó cũng sẽ liên quan đến bình luận ra các mảnh mã dựa trên những viên đá quý). Nếu vậy, nhận xét một nửa tại một thời điểm và như vậy.

Xin lỗi, đây không phải là câu trả lời thực sự .. Bạn có thể thử ruby-prof Tôi giả sử, ví dụ bằng cách gọi nó bằng rails runner và tập lệnh không dùng.

tôi đã cố gắng ruby-prof script/rails runner 'nil' trên mac của tôi, nhưng nó dường như chỉ có đâm :-)

EDIT

Nếu bạn đang sử dụng git cho ứng dụng của bạn, bạn có thể thử nó lệnh bisect quá và xem nếu có một điểm cụ thể trong thời gian khi mọi thứ trở nên chậm chạp, thay vì chỉ nói chung.

0

Tải lại! đã là một vấn đề trong một thời gian. Hãy xem this. Có một số bản vá mà bạn có thể sử dụng và một số mẹo về cách bạn có thể giải quyết vấn đề của mình.

Phương thức tải lại sẽ giống như thế này.

# reloads the environment 
def reload!(print=true) 
    puts "Reloading..." if print 
    ActionDispatch::Callbacks.new(lambda {}, false).call({}) 
    true 
end 

Bạn luôn có thể thêm môi trường vào phương pháp này để ghi đè chức năng và buộc tải lại bạn yêu cầu.

Điều này đã làm việc cho tôi để cho chúng tôi biết nếu nó phù hợp với bạn. Tất cả là tốt nhất.

+0

Cảm ơn bạn đã đề xuất - Tôi đã thử cả bản vá của bạn và bản vá còn lại trong chuỗi. Nhưng tôi không có may mắn. Bạn có nghĩa là dòng nên nói ActionDispatch :: Callbacks.new (Proc.new {}, false) .call (RAILS_ENV), phải không? – pendevere

58

Cuối cùng tôi đã tìm thấy nút cổ chai khởi động của mình bằng cách sử dụng Điểm chuẩn. Đặc biệt, điều hướng đến đá quý bundler và trong lib/bundler/runtime.rb, tìm dòng mà không Kernel.require và quấn nó như thế này:

puts Benchmark.measure("require #{file}") { 
    Kernel.require file 
}.format("%n: %t %r") 

Bạn có thể phải thêm require 'chuẩn' ở đâu đó trong ứng dụng của bạn, như trong config/boot.rb. Điều đó sẽ cho bạn thấy phải mất bao lâu để yêu cầu mỗi viên đá quý. Tôi không thể đảm bảo kết quả của bạn sẽ phù hợp với tôi, nhưng tôi đã có một vài viên đá quý đã chiếm hơn một giây để tải so với phần nghìn giây cho hầu hết.Một vài là đá quý mà tôi không cần cho phát triển nhưng tôi đã cần một số tác vụ trong môi trường phát triển, ví dụ: capistrano, shoulda. Tôi đã đánh giá các khu vực khác của startup (initializers, etc), nhưng không thể tìm thấy bất kỳ tắc nghẽn đáng kể nào.

Tôi chưa tìm ra cách rõ ràng để định cấu hình ứng dụng để chỉ tải những ứng dụng đó cho những công việc thực sự cần thiết. Có thể, tôi có thể tạo ra một môi trường được gọi là: nhanh chóng và sử dụng RAILS_ENV = tốc độ rails s/c để khởi động khi tôi biết tôi không cần những viên đá quý đó. Sau đó, trong Gemfile, tôi có thể sử dụng nhóm: nhanh chóng để loại trừ những viên đá quý đó trong một số trường hợp.

Tất cả những gì đã nói, phiền toái khởi động lớn nhất đối với tôi là phải tải toàn bộ môi trường để chạy tác vụ cào. Tôi có lẽ có thể loại trừ hầu hết đá quý cho điều đó, nhưng Gemfile sẽ bắt đầu lộn xộn vì vậy tôi không biết nếu nó có giá trị nó.

+7

Bản hack này cung cấp một số dữ liệu thực sự thú vị. Tôi tự hỏi có bao nhiêu tác giả đá quý nhận ra có bao nhiêu công việc của họ đang đóng góp cho thời gian khởi động dài. –

+1

hãy nhớ: yêu cầu 'điểm chuẩn' ở đâu đó trong tệp đó – makevoid

+0

Sản lượng này hiển thị ở đâu? Tôi sẽ có mặc dù các tập tin đăng nhập nhưng tôi không thấy bất cứ điều gì. Đã thử ngay cả một đặt chung và xác minh tôi đang sửa đổi runtime.rb đúng. Tôi đang thiếu gì? –

7

Bạn có thể tăng tốc độ bằng cách thêm: require => nil vào các mục nhập Gemfile chậm và yêu cầu chúng theo cách thủ công. ví dụ:

gem 'jammit', :require => nil 

Tôi cũng đã giải quyết vấn đề này trong buổi gặp mặt tôi đã có. này có vẻ là một lỗi trong ruby ​​1.9.2 (xem ý kiến ​​của bản vá này: https://gist.github.com/1008945)

Bạn có thể sửa chữa nó bằng cách vá của bạn 1.9.2 bởi thực chất tôi chỉ liên kết hoặc nâng cấp lên 1.9.2-head hoặc 1.9.3-head.

+3

Nghe như một ý tưởng hay. Chúng tôi đang nhìn thấy đá quý như activeadmin và omniauth mất thời gian để tải và vì vậy tự hỏi những gì là chiến lược tốt nhất để tải chúng sau này mà không ảnh hưởng đến bất kỳ chức năng. Đâu là nơi tốt nhất để yêu cầu những thủ công sau khi ray được nạp đầy đủ? – gingerlime

20

Hơi thích nghi hình thức đó là sao chép thể dán, kết thúc tốt đẹp tất cả các yêu cầu, và cung cấp sản lượng có thể phân loại:

# Add this to the top of boot.rb 
require 'benchmark' 
def require(file) 
    puts Benchmark.measure("") { 
    super 
    }.format("%t require #{file}") 
end 

Sau đó, bạn có thể thực hiện không-op để xem họ:

rails runner 1 

Hoặc sắp xếp chúng và hiển thị đầu trang 50:

rails runner 1 | sort -nr | head -n 50 
+2

cho đường ray 2.3/ruby ​​1.8.7 sử dụng 'script/runner 1' – professormeowingtons

+2

bạn đã lưu 2 ngày :) – Jayesh

1

Điều này chắc chắn là làm sạch mã của bạn và xác định tắc nghẽn , nhưng một khi bạn đã thực hiện những khoản tiết kiệm đó là giá trị nhìn vào một cái gì đó giống như Zeus để tăng tốc độ thời gian dev của bạn.

gem install zeus 

https://github.com/burke/zeus (tài liệu)

Đó là không phải không có lỗi và không đôi khi yêu cầu khởi động lại nhưng tôi vẫn nhìn thấy sự gia tăng tổng thể trong thời gian phát triển bởi máy chủ nhanh và giao diện điều khiển khởi động lại sau khi thay đổi mã nhỏ.

Các vấn đề liên quan