2009-05-26 30 views
5

luôn yêu cầu đầu tiên (của một phiên làm việc) cho ứng dụng Rails của tôi bị trễ. Chuyển sang chế độ sản xuất không giúp ích gì.Yêu cầu đầu tiên đối với ứng dụng Rails rất chậm

Tôi sử dụng mongrel và các yêu cầu khác được xử lý với tốc độ chấp nhận được.

Làm cách nào để làm cho nó nhanh hơn?

Kính trọng

Trả lời

1

Nếu bạn đăng nội dung của nhật ký khi yêu cầu đầu tiên được xử lý thì có lẽ chúng tôi có thể tìm ra điều gì làm cho nó quá chậm. Ví dụ: đây là nhật ký của tôi khi người dùng đầu tiên truy cập vào trang web

Booting Mongrel (use 'script/server webrick' to force WEBrick)  
Rails 2.1.0 application starting on http://0.0.0.0:3000  
Debugger enabled  
Call with -d to detach  
Ctrl-C to shutdown server 
** Starting Mongrel listening at 0.0.0.0:3000 
** Starting Rails with development environment... 
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/mime_type.rb:66: warning: already initialized constant CSV 
** Rails loaded. 
** Loading any Rails specific GemPlugins 
** Signals ready. TERM => stop. USR2 => restart. INT => stop (no restart). 
** Rails signals registered. HUP => reload (without restart). It might not work well. 
** Mongrel 1.1.5 available at 0.0.0.0:3000 
** Use CTRL-C to stop. 


Processing SessionsController#new (for 127.0.0.1 at 2009-05-26 12:26:00) [GET] 
    Session ID: de2acf074759026e1ed6205724f547a9 
    Parameters: {"action"=>"new", "controller"=>"sessions"} 
Rendering sessions/new 
Completed in 0.00587 (170 reqs/sec) | Rendering: 0.00298 (50%) | DB: 0.00092 (15%) | 200 OK [http://localhost/] 

Tôi nghĩ 170 reqs/giây là tốt cho ứng dụng của chúng tôi nhưng những người khác có thể thấy chậm. Bạn có thể thấy từ số liệu thống kê mà đường ray cung cấp rằng một nửa thời gian cần thiết được dành để hiển thị phản hồi - trong trường hợp này tạo HTML cho màn hình đăng nhập. Nếu yêu cầu này mất nhiều thời gian, cổng gọi đầu tiên của tôi sẽ là lượt xem và người trợ giúp được liên kết với màn hình đăng nhập.

Nếu bạn có một hệ thống mất nhiều thời gian để tự khởi chạy trong lần yêu cầu đầu tiên thì tại sao không lén lút và viết chương trình khởi động của riêng bạn trước tiên chạy đường ray rồi gửi yêu cầu giả mạo qua curl. Bằng cách đó người dùng của bạn không bao giờ thấy sự cố.

Chris

+0

Cảm ơn bạn đã gợi ý. Đây là logfile của tôi: http://pastie.org/private/ih2mpcmjpofp5jmfsvw Đôi khi, nó kéo dài hơn 1600 ms để trả lời yêu cầu của tôi. Tôi thực sự không có một đầu mối ... – Stefan

+1

Bạn đang sử dụng phiên bản đường ray nào? Hoàn thành trong 10367ms (Xem: 1572, DB: 450) | 200 OK [http: // localhost/search? Search = stefan +] Có vẻ như mất 10 giây để trả lời yêu cầu đầu tiên. Tôi đoán rằng tìm kiếm một lần nữa cho cùng một truy vấn "stefan" là nhanh hơn nhiều? Mất bao lâu để tìm một bản ghi khác? Cuối cùng mất bao lâu để tìm kiếm một bản ghi không tồn tại? –

1

Có thể lý do tương tự như các ứng dụng của chúng tôi mất một thời gian dài khi chúng tôi khởi động lần đầu tiên trong Websphere.

WAS phải thực hiện rất nhiều công việc ban đầu để thiết lập vùng chứa khi phiên bản mới của ứng dụng được cài đặt (hoặc WAS được khởi động lại).

Giải pháp thay thế mà chúng tôi đã sử dụng là sửa đổi tập lệnh cài đặt và các tập lệnh khởi chạy WAS để chúng tự động duyệt đến ứng dụng (trang chính và các trang khác được chọn) ngay sau khi chạy. Bằng cách đó, sự truy cập thực sự đầu tiên vào nó ở tốc độ tối đa.

Tôi không biết làm thế nào để làm điều này với Ruby hoặc thậm chí cho dù đó là có thể. Bạn sẽ phải tìm ra cái đó.

+0

Có thể - bạn có thể sử dụng tập lệnh đơn giản để yêu cầu một trang từ tất cả các ứng dụng đường ray sử dụng curl/wget để đạt được hiệu quả tương tự. – Petesh

1

Tôi đoán bạn đang sử dụng Ferret để tìm kiếm toàn văn? Có thể là kết nối chồn mất một thời gian để khởi tạo? Khi tôi kiểm tra nhật ký của bạn, có vẻ như cả db và lượt xem mất một lượng thời gian bình thường nhưng tổng số vẫn là 10 giây. Vì vậy, tôi phải là một cái gì đó khác đó là lý do tại sao tôi đoán Ferret có thể là vấn đề.

1

Nó có thể là bởi vì bạn là:

  • yêu cầu và tải một số plugins và đá quý

  • thực hiện kết nối đến một dịch vụ bên ngoài (sau đó bộ nhớ đệm)

  • lưu vào bộ nhớ cache các trang của riêng bạn và chỉ xảy ra sau yêu cầu đầu tiên trừ khi bạn 'làm ấm' bộ nhớ cache

Bất kỳ một trong số này chắc chắn sẽ làm tăng thời gian phản hồi của yêu cầu đầu tiên.

0

Có thể bạn cần điều chỉnh số PassengerPoolIdleTime var trong confache. Đặt nó thành 0 để không bao giờ dừng quá trình đường ray của bạn.

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