Khởi động máy chủ ban đầu chậm khi sử dụng Phusion Passenger và Rails


87

Để nhảy vào chuyến tàu của Phusion Passenger, chúng tôi đã thiết lập một máy chủ dàn cho một ứng dụng đường ray nhỏ để kiểm tra mọi thứ.

Cho đến nay, nó rất hay được sử dụng, giúp việc cài đặt / cấu hình và triển khai ứng dụng trở nên dễ dàng. Vấn đề là trang web chúng tôi đang sử dụng không bị tấn công thường xuyên và có vẻ như nó sẽ đóng các máy chủ trong nền. Có nghĩa là khi ai đó truy cập vào trang web, họ phải chờ đợi rất lâu cho đến khi nó khởi động một máy chủ mới để xử lý yêu cầu. Chúng tôi đã đọc qua tài liệu, thử khá nhiều thiết lập khác nhau (chế độ smart / smart-lv2, Passngeridletime, v.v.) và vẫn chưa tìm ra giải pháp thực sự.

Sau khi xem qua các kết quả của Google, chúng tôi thực sự không thể tìm thấy thông tin hữu ích. Hiện tại, chúng tôi có một công việc cron thường xuyên đưa ra yêu cầu nhằm cố gắng duy trì hoạt động của các máy chủ.

Có ai khác gặp sự cố này không và bạn có lời khuyên nào để khắc phục không?


Tôi cũng tìm thấy tiện ích này trên Trang web Tài liệu Hành khách: modrails.com/documentation/…
dewrich

@dewrich Tôi tìm thấy một công cụ ( wekkars.com ) thực hiện chính xác những gì bạn đang làm cronjob
SteenhouwerD

Câu trả lời:


119

Điều đang xảy ra là Ứng dụng và / hoặc ApplicationSpawners của bạn đang tắt do hết thời gian. Để xử lý yêu cầu mới của bạn, Hành khách phải khởi động bản sao ứng dụng mới của bạn, quá trình này có thể mất vài giây, ngay cả trên một máy nhanh. Để khắc phục sự cố, có một số tùy chọn cấu hình Apache mà bạn có thể sử dụng để giữ cho Ứng dụng của mình tồn tại.

Đây cụ thể là những gì tôi đã làm trên máy chủ của mình. PassengerSpawnMethod và PassengerMaxPreloaderIdleTime là những tùy chọn cấu hình quan trọng nhất trong tình huống của bạn.

# Speeds up spawn time tremendously -- if your app is compatible. 
# RMagick seems to be incompatible with smart spawning
# Older versions of Passenger called this RailsSpawnMethod
PassengerSpawnMethod smart

# Keep the application instances alive longer. Default is 300 (seconds)
PassengerPoolIdleTime 1000

# Keep the spawners alive, which speeds up spawning a new Application
# listener after a period of inactivity at the expense of memory.
# Older versions of Passenger called this RailsAppSpawnerIdleTime
PassengerMaxPreloaderIdleTime 0

# Just in case you're leaking memory, restart a listener 
# after processing 5000 requests
PassengerMaxRequests 5000

Bằng cách sử dụng chế độ sinh sản "thông minh" và tắt PassengerMaxPreloaderIdleTime, Hành khách sẽ luôn giữ 1 bản sao ứng dụng của bạn trong bộ nhớ (sau yêu cầu đầu tiên sau khi khởi động Apache). Người Applicationnghe cá nhân sẽ được chỉnh sửa forktừ bản sao này, đó là một hoạt động siêu rẻ. Nó xảy ra nhanh đến mức bạn không thể biết ứng dụng của mình có phải tạo ra một người nghe hay không.

Nếu ứng dụng của bạn không tương thích với tính năng sinh sản thông minh, tôi khuyên bạn nên giữ một PassengerPoolIdleTime lớn và truy cập trang web của bạn định kỳ bằng cách sử dụng curl và cronjob hoặc màn hình hoặc thứ gì đó để đảm bảo người nghe vẫn sống sót.

Các hành khách hướng dẫn là một tài liệu tham khảo tuyệt vời cho những điều này và tùy chọn cấu hình hơn.

chỉnh sửa : Nếu ứng dụng của bạn không tương thích với tính năng sinh sản thông minh, có một số tùy chọn mới rất hay

# Automatically hit your site when apache starts, so that you don't have to wait
# for the first request for passenger to "spin up" your application. This even
# helps when you have smart spawning enabled. 
PassengerPreStart http://myexample.com/
PassengerPreStart http://myexample2.com:3500/

# the minimum number of application instances that must be kept around whenever 
# the application is first accessed or after passenger cleans up idle instances
# With this option, 3 application instances will ALWAYS be available after the
# first request, even after passenger cleans up idle ones
PassengerMinInstances 3

Vì vậy, nếu bạn kết hợp PassengerPreStart và PassengerMinInstances, Passenger sẽ xuất hiện 3 phiên bản ngay lập tức sau khi tải apache và sẽ luôn duy trì ít nhất 3 phiên bản, vì vậy người dùng của bạn sẽ hiếm khi (nếu có) thấy sự chậm trễ.

Hoặc, nếu bạn đang sử dụng tính năng sinh sản thông minh (được khuyến nghị) PassengerMaxPreloaderIdleTime 0, bạn có thể thêm PassengerPreStartvào để nhận thêm lợi ích khi khởi động ngay lập tức.

Rất cám ơn các anh hùng tại phusion.nl !


Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Tôi tin rằng chúng tôi đã thử hầu hết các thiết lập đó nhưng có thể không kết hợp đúng. Tôi sẽ kiểm tra vào ngày mai và hoàn nguyên.
tsdbrown

Điều này thật tuyệt. Tôi đang gặp vấn đề tương tự với cài đặt Nginx / Phusion Passenger và điều này đã giúp tôi rất nhiều.
Scott Anderson

Tôi đã thử thiết lập này và không thấy cải thiện hiệu suất, nhưng ứng dụng của chúng tôi đang sử dụng RMagick. Có bất kỳ giải pháp thay thế cho điều này? Tại sao nó không hoạt động với RMagick?
Chip Castle

1
RailsSpawnMethodđược phản đối ủng hộ PassengerSpawnMethod modrails.com/documentation/...
Paulus

1
Xin chào, tôi đang gặp vấn đề tương tự và tôi muốn thử cấu hình đó, nhưng tôi không biết cấu hình đó phải được đặt ở đâu. cảm ơn!
joseramonc

41

Chỉ trong trường hợp có bất kỳ người dùng máy chủ nginx nào gặp phải câu hỏi này, cả lệnh 'PassengerMaxRequests' và 'PassengerStatThrottleRate' đều không dịch sang nginx. Tuy nhiên những người khác làm:

rails_spawn_method smart;
rails_app_spawner_idle_time 0;
rails_framework_spawner_idle_time 0;
passenger_pool_idle_time 1000;

HTH!

EDIT rails_spawn_methodkhông được dùng ở hành khách 3 thay vào đó sử dụng

passenger_spawn_method smart; 

mọi thứ khác vẫn tốt cho đến nay.


7
Cám ơn vì cái này. Một điều cần lưu ý là tôi đã phải nhồi nhét customer_pool_idle_time vào nginx.conf chính của mình với các cài đặt chung khác thay vì chỉ trong cấu hình trang web cụ thể nơi đường ray được bật.
Scott Anderson

nhưng lỗi trên hành khách 4:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk

4

Bạn cũng có thể sử dụng PassengerMinInstances:

http://www.modrails.com/documentation/Users%20guide%20Apache.html#PassengerMinInstances

Điều này có thể được kết hợp với PassengerPreStart


Từ tài liệu: "Bạn nên đặt tùy chọn này thành giá trị khác 0 nếu bạn muốn tránh thời gian khởi động có thể kéo dài sau khi trang web không hoạt động trong một thời gian dài." Có vẻ như câu trả lời hoàn hảo cho câu hỏi của OP.
Chuck

2

RE:

# Additionally keep a copy of the Rails framework in memory. If you're 
# using multiple apps on the same version of Rails, this will speed up
# the creation of new RailsAppSpawners. This isn't necessary if you're
# only running one or 2 applications, or if your applications use
# different versions of Rails.
RailsFrameworkSpawnerIdleTime 0

Chỉ là một cái gì đó để thêm vào và có thể hữu ích.

Phương thức sinh sản mặc định trong bản phát hành hiện tại là "smart-lv2", phương thức này bỏ qua trình tạo khuôn khổ, vì vậy, việc đặt thời gian chờ của trình tạo khuôn khổ sẽ không có hiệu lực trừ khi bạn đặt rõ ràng phương thức sinh sản thành "thông minh".

Nguồn: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1


1

Nếu máy chủ của bạn là máy chủ chia sẻ, giống như máy chủ của tôi, bạn không thể thay đổi cài đặt và bị mắc kẹt với công việc cron.


Đối với ứng dụng cụ thể này, rất may nó không phải. Nhưng tôi sẽ ghi nhớ điều đó cho tương lai cảm ơn.
tsdbrown

1

Tôi cũng gặp sự cố này nhưng tôi không thể thay đổi cài đặt hành khách vì tôi không có quyền ghi vào tệp này. Tôi đã tìm thấy một công cụ ( http://www.wekkars.com ) giúp ứng dụng của tôi phản hồi nhanh. Biết đâu đây cũng có thể là một giải pháp cho bạn.


0

kiểm tra phiên bản của hành khách. đó là RailsSpawnMethod <string>cho các phiên bản cũ.

Nếu vậy (nếu tôi nhớ không nhầm), hãy thay Hành khách bằng Đường ray trong tất cả các hướng dẫn cấu hình hoặc tìm tài liệu về hành khách cũ để biết thêm chi tiết

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.