2013-09-21 72 views
5

Tôi đang cố gắng cải thiện hiệu suất của ứng dụng Rails 3.2 trước beta của tôi được lưu trữ trên Heroku.Trên di tích mới những gì góp phần vào "Thời gian dành cho Ruby" cho một ứng dụng Heroku Rails?

Bộ nhớ đệm linh hoạt đã cải thiện đáng kể mọi thứ, nhưng tôi vẫn nhận thấy sự đóng góp lớn từ "Thời gian trong Ruby" khi xem thời gian phản hồi của máy chủ ứng dụng trên Relic mới (ánh sáng màu xanh trên biểu đồ).

Phần nào của ứng dụng Rails thường đóng góp cho 'thời gian Ruby' này?

New Relic time spent in ruby

ban đầu tôi nghĩ rằng đây là do điều kiện phức tạp trong một trong các bộ điều khiển chính của tôi, nhưng đã đơn giản hóa này. Quan điểm của tôi bây giờ rất tích cực được lưu trữ bằng cách sử dụng bộ nhớ đệm của bộ nhớ Búp bê Nga và memcache (wow!).

Việc phân phát nội dung tĩnh có thể là nguyên nhân không? (Di chuyển đến S3/CloudFont nằm trong danh sách việc cần làm ...)

Cảm ơn!

(Tôi đã có thiết lập delayed_job và đã chuyển tất cả những gì tôi có thể vào nền. Tôi cũng sử dụng Unicorn như máy chủ web của tôi.)

CẬP NHẬT Performance Tuning

Sau khi bộ nhớ đệm tích cực, Tôi bắt đầu tìm kiếm các cách khác để cải thiện hiệu suất ứng dụng.

Đầu tiên tôi đã thêm giám sát bộ sưu tập Garbage như đề xuất, thấy rằng GC không đóng góp đáng kể vào thời gian Ruby.

enter image description here

Tiếp theo, tôi đã quyết định để đạt tài sản của tôi phục vụ bằng cách thêm vào một CDN (CloudFront qua CDNsumo add-on). Điều này thực sự làm giảm thời gian Ruby của tôi theo dõi NR. (CDN đã được cấp phép và sau đó được làm ấm bằng yêu cầu thử nghiệm cuối cùng ở bên phải của biểu đồ bên dưới.) Hầu hết các trang của tôi có một vài trăm kb của css & javascript - vì vậy không nhỏ nhưng không lớn.

enter image description here

Cuối cùng, tôi nâng cấp từ cơ sở dữ liệu khởi động các 'cơ bản' đến db sản xuất nhỏ 'cẩu'. Điều này có hiệu ứng ấn tượng về hiệu suất. Sau một chút bộ nhớ đệm của PG, ứng dụng sẽ bay. (cuối cùng 3 yêu cầu gai trên đồ thị dưới đây).

enter image description here

Đưa những thông điệp về nhà cho những người khác cố gắng để điều chỉnh các ứng dụng Heroku của họ: (. Tức là bộ nhớ đệm, CDN, cơ sở dữ liệu, Ruby đang)

  • đơn giản điều chỉnh hiệu suất trong nhiều lĩnh vực có tác dụng hiệp đồng trên ngăn xếp. Ngược lại, bất kỳ một hiệu suất đơn lẻ nào cũng sẽ là một nút cổ chai mà bạn không thể vượt qua ngay cả khi bạn điều chỉnh các khu vực khác (tức là cơ sở dữ liệu cơ bản hoặc Dev khởi động chậm trên Heroku so với cơ sở dữ liệu sản xuất đắt đỏ. hiệu suất ứng dụng của tôi).
  • NewRelic là điều cần thiết trong việc tìm ra nơi có thể đạt được nhiều lợi ích nhất.

Trả lời

7

Thời gian "Ruby" thực sự là nhóm "Khác" để theo dõi NewRelic. Các loại khác là các biện pháp rõ ràng (ví dụ: bao nhiêu thời gian được chi tiêu trong các cuộc gọi ra để memcached). Ruby thời gian là tất cả thời gian không được chi tiêu trong một trong những xô.

Vậy điều gì khác xảy ra trong thời gian "Ruby"? Ứng viên số một là Garbage Collection (GC). Nếu bạn đang chạy của Ruby 1.9+, bạn có thể bật profiling NewRelic của GC bằng cách tạo ra một initializer như config/initializers/newrelic.rb như sau:

GC::Profiler.enable 

này sẽ theo dõi thời gian GC như một phạm trù NewRelic riêng cho bạn.

Nếu bạn đang ở trạng thái tốt trên GC, bước tiếp theo là sử dụng giao diện Web Giao dịch để xem cách phân phối thời gian trung bình. Có lẽ một hoặc hai hành động trong ứng dụng của bạn là những người biểu diễn kinh khủng và chịu trách nhiệm về các mức trung bình này.

Chúc bạn may mắn và vui lòng liên hệ trực tiếp nếu bạn vẫn gặp sự cố. Điều chỉnh hiệu suất là một nghệ thuật đen.

+1

Cảm ơn Winfield, đó là một ý tưởng tuyệt vời. Tôi sẽ thêm GC profiling và wade sâu hơn vào quan điểm của NC. –

+0

Cảm ơn một lần nữa Winfield cho đề xuất của bạn. Tôi khá hạnh phúc bây giờ sau khi cải thiện một số mã của tôi, thêm bộ nhớ đệm, CDN và một cơ sở dữ liệu nhanh hơn. Thú vị làm thế nào chậm db cơ bản Heroku được so sánh với Crane và lên. –

+1

Cơ sở dữ liệu là ràng buộc hiệu suất phổ biến nhất và chokepoint trong các hệ thống web phân tán. Rất vui khi biết bạn đã tiết kiệm được rất nhiều thời gian trong bộ nhớ đệm và mở rộng dọc theo chiều dọc. Cảm thấy tự do để thả tôi một dòng nếu bạn có vấn đề hiệu suất trong tương lai. [email protected] – Winfield