2011-11-05 42 views
21

Tôi sắp triển khai ứng dụng được xây dựng trên Rails 3.1.x và bắt đầu chạy một số thử nghiệm hiệu suất. Sau khi fiddling với ab cho một chút, tôi thấy một số kết quả rất nản lòng năng suất khoảng 15 yêu cầu/giây trên Heroku.Điều chỉnh hiệu suất đường ray cho sản xuất?

Khi thử nghiệm cục bộ, tôi thấy kết quả tương tự chứng minh rằng đó là vấn đề về ứng dụng nhiều hơn bất kỳ điều gì.

Tôi đang chạy Unicorn, nhanh hơn khoảng 40% so với Thin trên Celadon Cedar. Hơn nữa, tôi đang sử dụng db chia sẻ PGSQL.

Tôi hy vọng rằng ai đó có thể chia sẻ danh sách giặt hoặc về bản chất danh sách kiểm tra khởi chạy mà tôi nên chuyển qua khi chuẩn bị ứng dụng cho sản xuất và chuyển sang nhu cầu điều chỉnh tốc độ. Cho đến nay tôi đã không phải tìm thấy một danh sách ngắn gọn thực sự về các mục có thể thao tác để di chuyển qua đó có vẻ hợp lý với tình huống của tôi.

Hoặc nếu bạn có trải nghiệm thực tế vững chắc di chuyển qua các vấn đề như thế này, mọi đầu vào đều sẽ được đánh giá cao!

Trả lời

19

Tôi đã dành thời gian điều chỉnh ứng dụng của mình trên heroku và đã dành một chút thời gian làm việc để điều chỉnh hiệu suất ứng dụng Rails trong nhiều cài đặt khác nhau.

Khi tôi chạy ab -n 300 -c 75 ... myapp.com .... # đó là một bản sao lưu vào trang web chính của tôi, và đang trên kế hoạch tuyết tùng miễn phí với lân

Requests per second: 132.11 [#/sec] (mean) 
Time per request:  567.707 [ms] (mean) 
Time per request:  7.569 [ms] (mean, across all concurrent requests) 

(điều này là chống lại một trang chủ mà không làm bất cứ điều gì mãnh liệt, vì vậy tôi chỉ cung cấp nó như là một "heroku nhanh như thế nào có thể được trên kế hoạch miễn phí với một trang rất đơn giản?" Ví dụ, không phải là một "ứng dụng của bạn nên được này nhanh ")

đây là Rails tôi Performance Tuning 101 danh sách kiểm tra:

  1. Đo thời gian tải trang/trình duyệt trước (trình duyệt thực hiện nhiều yêu cầu, ab chỉ cho bạn biết một trong số các yêu cầu đó, và thường yêu cầu trang chính của bạn không phải là vấn đề), nhận số trang cơ sở tải từ các công cụ như www.webpagetest.org hoặc www.gtmetrix.com cho các trang công khai hoặc các công cụ trình duyệt Yslow, tốc độ trang google hoặc dynatrace cho các trang riêng tư. Nếu bạn nhìn vào sơ đồ thác tải trang (bảng 'Net' trong chrome/firefox), nó thường cho thấy tải html của bạn nhanh chóng (dưới một giây), nhưng sau đó mọi thứ khác mất 1-3 giây để tải. Thực hiện theo các khuyến nghị tốc độ trang/tốc độ trang về cách cải thiện (đảm bảo bạn đang sử dụng nội dung đường ống nội dung Rails 3.1 đến mức tối đa)

  2. Đọc qua tệp nhật ký/di tích mới để tìm vị trí ngọt ngào của 'chậm nhất/yêu cầu thường xuyên nhất, và hồ sơ những gì xảy ra cho yêu cầu đó (có phải là ruby ​​chậm/nhiều lần sử dụng mem hay nhiều truy vấn không?) Bạn cần có cách đáng tin cậy để phát hiện và theo dõi các vấn đề về hiệu suất và không chỉ thay đổi những điều ngẫu nhiên. Khi bạn đã xác định được một số khu vực mục tiêu, hãy tạo tập lệnh thử nghiệm để trợ giúp trước/sau khi thử nghiệm và chứng minh rằng thay đổi của bạn giúp và phát hiện xem có một đợt hồi quy không.

  3. Thiếu chỉ mục trên cột db là một trong những phổ biến nhất vấn đề và dễ nhất để giải quyết. Chạy giải thích về các truy vấn đích hoặc xem qua nhật ký truy vấn chậm của bạn để xem những gì mà trình hoạch định truy vấn đang làm. Thêm chỉ mục cho khóa ngoài, cột tìm kiếm hoặc dữ liệu chính (bao gồm chỉ mục) khi thích hợp. Kiểm tra lại với dữ liệu sản xuất thực tế để chứng minh rằng nó tạo ra sự khác biệt. (bạn có thể chạy giải thích trong heroku, cũng như chạy các truy vấn cho các chỉ mục bị thiếu hoặc không sử dụng)

  4. Hầu hết các ứng dụng Rails hoạt động kém đều bị truy vấn N + 1 vì nó dễ dàng viết order.owner.address.city và không suy nghĩ về những gì sẽ xảy ra khi đó là trong một vòng lặp.Truy vấn N + 1 không nhất thiết là các truy vấn chậm, vì vậy chúng không hiển thị trong nhật ký truy vấn chậm, nó chỉ có rất nhiều truy vấn và hiệu quả hơn để thực hiện tất cả cùng một lúc. Sử dụng: bao gồm hoặc .includes() để tải dữ liệu đó nhanh hơn hoặc xem xét truy vấn của bạn theo cách khác.

  5. Phân tích luồng ứng dụng của bạn và tìm kiếm cơ hội lưu vào bộ nhớ cache. Nếu người dùng bị trả lại qua lại giữa trang chỉ mục và trang chi tiết và ngược lại, có lẽ là chế độ xem ajax của chi tiết, mà không rời khỏi trang chỉ mục sẽ cung cấp cho họ dữ liệu họ cần theo cách nhanh hơn. Tôi đã viết một số more thoughts about that on my blog

Tôi đã trình bày về các kỹ thuật này và các ý tưởng khác tại Chicago tại hội nghị WindyCityRails năm nay. Bạn có thể see the video here on my www.RailsPerformance.com blog Điều tôi thích về heroku là bạn phải có khả năng mở rộng từ đầu. Khi bạn xem các cuộc thảo luận trong danh sách gửi thư, bạn thấy rằng hầu hết mọi người đều biết về các phương pháp hay nhất về hiệu suất hoạt động và cách tận dụng tối đa máy chủ. Tôi cũng thích làm thế nào bạn nếu bạn muốn ở lại giá rẻ, bạn tìm hiểu làm thế nào các thủ thuật điều chỉnh hiệu suất mà sẽ giúp bạn có được tiếng nổ nhất.

Chúc may mắn!

+0

Xin chào, bạn có thể xem câu hỏi của tôi về một tình huống tương tự không? http://stackoverflow.com/questions/22580297/how-to-tune-a-production-level-heroku-postgres-with-a-ruby-on-rails-application – scaryguy

2

Vì chưa có gì, tôi sẽ cung cấp câu trả lời cho phần PostgreSQL. Tôi không thể hỗ trợ Ruby.

Bạn có thể tìm thấy các điểm xuất phát tuyệt vời để tối ưu hóa hiệu suất tại wiki PostgreSQL.

  • chỉnh các server settings (không chắc chắn có bao nhiêu là có thể với Heroku)
  • Đặc biệt chú ý đến slow queries
  • Kiểm tra hardware (không áp dụng với Heroku)
+0

Vì bạn thường không viết truy vấn SQL trong ứng dụng Rails và (như đã nêu) cài đặt máy chủ và phần cứng không liên quan trên Heroku, câu trả lời của bạn không phải là rất nhắm mục tiêu. – coreyward

+0

@coreyward: Đủ công bằng. Câu trả lời của tôi dường như đã gây ra một số sự chú ý, mặc dù, mang lại hai câu trả lời nhiều hơn về mục tiêu. –

+1

Cảm ơn bạn đã trưởng thành @ErwinBrandstetter! Thật vậy, không có nhiều điều có thể được thực hiện liên quan đến việc chỉnh sửa PGS dựa trên AWS của Heroku dựa trên PGS dbs, tuy nhiên theo các ghi chú khác, các truy vấn có thể là các kicker lốp. – ylluminate

4

Câu trả lời đơn toàn diện nhất của bạn là sử dụng một cái gì đó như NewRelic để cụ ứng dụng của bạn và tìm thấy những điểm chậm. Sau đó, bạn có thể áp dụng tối ưu hóa hoặc lưu vào bộ nhớ đệm cho mã của bạn để làm mịn những điểm chậm đó. Là khách hàng của Heroku, bạn sẽ nhận được một bản cài đặt NewRelic miễn phí - đó là một phần bổ trợ mà bạn có thể thêm vào triển khai của mình từ bảng điều khiển Heroku.

Khi bạn đã hiểu được điều gì làm bạn chậm lại, bạn có thể bắt đầu tiếp cận nó. Heroku xử lý hầu hết tất cả các đầu cuối dev-ops của việc điều chỉnh hiệu năng, vì vậy bạn không cần phải làm bất cứ điều gì ở đó. Tuy nhiên, bạn vẫn có thể kiếm được nhiều lợi nhuận bằng cách tối ưu hóa các truy vấn cơ sở dữ liệu và thực hiện bộ nhớ đệm ở mức hành động và phân đoạn khi thích hợp.

+0

Cảm ơn. Tôi đã sử dụng một chút NewRelic như một dịch vụ miễn phí, nhưng có vẻ như tôi thực sự nên xem xét các tùy chọn khác vào lúc này để xem vị trí của các điểm kêu. Cảm ơn! Sẽ lấy lại cho bạn ở đây về kết quả. – ylluminate

6

Có một số hoa quả khá thấp treo mà hầu như luôn luôn mang lại lợi ích hiệu năng khá xứng đáng:

  1. Giảm số lượng các truy vấn DB bằng cách sử dụng báo cáo hiệu quả hơn ActiveRecord. Hãy chắc chắn sử dụng includejoin nếu thích hợp và đảm bảo bạn đang sử dụng empty? trên any? nếu có thể để tránh SELECT khi bạn chỉ cần COUNT.
  2. Đặc biệt là trên các trang nặng hơn, chế độ xem bộ nhớ cache, ngay cả khi chỉ trong vài phút. Bạn thường có thể phá vỡ các phần lớn hơn hoặc năng động thành partials mà có thể được lưu trữ mà không có bất kỳ tác động tiêu cực, quá.
  3. Di chuyển mọi hoạt động trên mạng sang hoạt động nền. Điều này bao gồm gửi email, tìm nạp các trang từ trang web anther và thực hiện các cuộc gọi API (thậm chí [đặc biệt?] Với Heroku).Có một số thư viện xử lý công việc nền thực sự tốt trong Ruby, DelayedJob thực sự phổ biến vì nó hoạt động với bất kỳ cơ sở dữ liệu ActiveRecord nào, nhưng yêu thích của tôi là Resque.

Bạn cần cẩn thận không dành quá nhiều thời gian để tối ưu hóa các thói quen Ruby. Trừ khi bạn đang làm điều gì đó với số lượng dữ liệu khổng lồ hoặc quá trình xử lý (ví dụ: thay đổi kích thước hình ảnh), bạn có thể sẽ không thấy lợi ích đáng kể từ việc tối ưu hóa vòng hoặc giảm thiểu mức sử dụng bộ nhớ. Và nếu bạn thấy một số trang nhất định có vấn đề, hãy tìm hiểu nhật ký của bạn và xem điều gì đang xảy ra trong các yêu cầu đó. Nếu bạn chưa sẵn sàng, các ứng dụng tự động nạp tiền như HireFireApp là điều tuyệt vời cho phép bạn xử lý nhiều yêu cầu bằng cách mở rộng theo chiều ngang mà không tốn chi phí chạy các dynos không liên quan trong các khoảng thời gian chậm.

PS: Có một Tiện ích bổ sung Heroku mới được gọi là Blitz cho phép bạn kiểm tra tải đồng thời tối đa 5.000 người dùng.

+0

Công cụ tốt, cảm ơn những nhận xét. Vâng, HireFire là tuyệt vời và Michael là một anh chàng tuyệt vời và xem xét anh ta là một người bạn. Đi sâu vào nhận xét của bạn và sẽ cho bạn biết kết quả của tôi. Một vài trong số chúng không được áp dụng hiện nay, nhưng tôi đánh giá cao "không tối ưu hóa các thói quen ruby" vì đó là một trong những cân nhắc đầu tiên của tôi, nhưng dường như mang lại kết quả không quá sao. – ylluminate

+0

@coreyward, xin chào, bạn có sẵn sàng cho tư vấn đường ray đơn giản không? không thể tìm thấy thông tin liên hệ của bạn trên trang web của bạn. nếu có, vui lòng gửi email thông tin tại panabee dot com. cảm ơn! – Crashalot

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