เริ่มต้นเซิร์ฟเวอร์ช้าเมื่อใช้ Phusion Passenger และ Rails


87

ในการกระโดดขึ้นไปบนเกวียนของ Phusion Passenger เราได้ตั้งค่าเซิร์ฟเวอร์การแสดงละครสำหรับแอปรางขนาดเล็กเพื่อทดสอบสิ่งต่างๆ

จนถึงตอนนี้มันใช้งานได้ดีมากทำให้การติดตั้ง / กำหนดค่าและปรับใช้แอพเป็นเรื่องง่าย ปัญหาคือไซต์ที่เราใช้ไม่ได้รับผลกระทบบ่อยนักและดูเหมือนว่าจะปิดเซิร์ฟเวอร์ในพื้นหลัง หมายถึงเมื่อมีคนไปที่ไซต์พวกเขาจะต้องรอนานมากจนกว่าเซิร์ฟเวอร์ใหม่จะเริ่มทำงาน เราได้อ่านเอกสารแล้วลองตั้งค่าต่างๆ (โหมดอัจฉริยะ / smart-lv2 เวลาโดยสาร ฯลฯ ) และยังไม่พบวิธีแก้ปัญหาที่แท้จริง

หลังจากดูผลการค้นหาของ Google แล้วเราไม่พบข้อมูลที่เป็นประโยชน์ ขณะนี้เรามีงาน cron ที่ร้องขอทุกครั้งเพื่อพยายามให้เซิร์ฟเวอร์ทำงานต่อไป

มีใครบ้างที่ประสบปัญหานี้และคุณมีคำแนะนำในการแก้ไขหรือไม่?


ฉันยังพบนักเก็ตนี้ในเว็บไซต์ Passenger Doc Site: modrails.com/documentation/…
dewrich

@dewrich ฉันพบเครื่องมือ ( wekkars.com ) ที่ทำในสิ่งที่ cronjob ของคุณกำลังทำอยู่
SteenhouwerD

คำตอบ:


119

สิ่งที่เกิดขึ้นคือ Application และ / หรือ ApplicationSpawners ของคุณกำลังปิดตัวลงเนื่องจากหมดเวลา ในการดำเนินการตามคำขอใหม่ของคุณผู้โดยสารจะต้องเริ่มต้นสำเนาแอปพลิเคชันของคุณใหม่ซึ่งอาจใช้เวลาหลายวินาทีแม้ในเครื่องที่เร็ว ในการแก้ไขปัญหามีตัวเลือกการกำหนดค่า Apache สองสามตัวที่คุณสามารถใช้เพื่อให้แอปพลิเคชันของคุณมีชีวิตอยู่

นี่คือสิ่งที่ฉันทำบนเซิร์ฟเวอร์โดยเฉพาะ PassengerSpawnMethod และ PassengerMaxPreloaderIdleTime เป็นตัวเลือกการกำหนดค่าที่สำคัญที่สุดในสถานการณ์ของคุณ

# 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

เมื่อใช้โหมดการวางไข่ "อัจฉริยะ" และปิด PassengerMaxPreloaderIdleTime Passenger จะเก็บสำเนาแอปพลิเคชันของคุณ 1 ชุดไว้ในหน่วยความจำตลอดเวลา (หลังจากคำขอครั้งแรกหลังจากเริ่ม Apache) Applicationผู้ฟังแต่ละคนจะได้รับการforkแก้ไขจากสำเนานี้ซึ่งเป็นการดำเนินการที่ถูกสุด ๆ มันเกิดขึ้นเร็วมากจนคุณไม่สามารถบอกได้ว่าแอปพลิเคชันของคุณจะต้องมีผู้ฟัง

หากแอปของคุณเข้ากันไม่ได้กับการวางไข่แบบสมาร์ทฉันขอแนะนำให้เก็บ PassengerPoolIdleTime ขนาดใหญ่ไว้และกดปุ่มไซต์ของคุณเป็นระยะโดยใช้ curl และ cronjob หรือตรวจสอบหรือบางอย่างเพื่อให้แน่ใจว่าผู้ฟังยังมีชีวิต

คู่มือผู้โดยสารผู้ใช้คือการอ้างอิงที่น่ากลัวสำหรับเหล่านี้และตั้งค่าตัวเลือกมากขึ้น

แก้ไข : หากแอปของคุณเข้ากันไม่ได้กับการวางไข่อัจฉริยะมีตัวเลือกใหม่ ๆที่ดีมาก

# 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

ดังนั้นหากคุณใช้ PassengerPreStart และ PassengerMinIn

หรือหากคุณใช้การวางไข่อัจฉริยะ (แนะนำ) PassengerMaxPreloaderIdleTime 0อยู่แล้วคุณสามารถเพิ่มPassengerPreStartเพื่อรับประโยชน์เพิ่มเติมจากการเริ่มต้นใช้งานได้ทันที

ขอบคุณฮีโร่มากมายที่phusion.nl !


ขอบคุณมากสำหรับคำตอบของคุณ. ฉันเชื่อว่าเราได้ลองใช้การตั้งค่าเหล่านั้นเกือบทั้งหมดแล้ว แต่อาจจะไม่ใช่ชุดค่าผสมที่ถูกต้อง ฉันจะเข้ารับการทดสอบในวันพรุ่งนี้และเปลี่ยนกลับ
tsdbrown

นี่มันเจ๋งมาก. ฉันประสบปัญหาเดียวกันกับการติดตั้ง Nginx / Phusion Passenger ของฉันและสิ่งนี้ช่วยฉันได้มาก
Scott Anderson

ฉันได้ลองตั้งค่านี้แล้วและไม่เห็นการปรับปรุงประสิทธิภาพ แต่แอปของเราใช้ RMagick มีวิธีแก้ปัญหาสำหรับสิ่งนี้หรือไม่? ทำไมมันไม่ทำงานกับ RMagick?
Chip Castle

1
RailsSpawnMethodเลิกใช้งานPassengerSpawnMethod modrails.com/documentation/…
paulus

1
สวัสดีฉันมีปัญหาเดียวกันและฉันต้องการลองใช้การกำหนดค่านั้น แต่ฉันไม่รู้ว่าจะต้องวางการกำหนดค่านั้นไว้ที่ใด ขอบคุณ!
joseramonc

41

ในกรณีที่มีผู้ใช้เซิร์ฟเวอร์ nginx สะดุดกับคำถามนี้ทั้งคำสั่ง 'PassengerMaxRequests' และ 'PassengerStatThrottleRate' จะไม่แปลเป็น nginx อย่างไรก็ตามคนอื่น ๆ ทำ:

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

เฮ้!

EDIT rails_spawn_methodเลิกใช้ในผู้โดยสาร 3 แทนใช้

passenger_spawn_method smart; 

อย่างอื่นก็ดีจนถึงปัจจุบัน


7
ขอบคุณสำหรับสิ่งนี้. สิ่งหนึ่งที่ควรทราบก็คือฉันต้องบรรจุผู้โดยสาร_pool_idle_timeใน nginx.conf หลักของฉันด้วยการตั้งค่าส่วนกลางอื่น ๆ แทนที่จะอยู่ในการกำหนดค่าไซต์เฉพาะที่เปิดใช้งานราง
Scott Anderson

แต่เกิดข้อผิดพลาดกับผู้โดยสาร 4:"passenger_max_preloader_idle_time" directive is duplicate
TangMonk

4

คุณยังสามารถใช้ PassengerMinInstances:

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

สามารถใช้ร่วมกับ PassengerPreStart


จากเอกสาร: "คุณควรตั้งค่าตัวเลือกนี้เป็นค่าที่ไม่ใช่ศูนย์หากคุณต้องการหลีกเลี่ยงเวลาเริ่มต้นที่อาจยาวนานหลังจากที่เว็บไซต์ไม่มีการใช้งานเป็นเวลานาน" ดูเหมือนจะเป็นคำตอบที่สมบูรณ์แบบสำหรับคำถามของ 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

เพียงแค่เพิ่มบางอย่างและอาจเป็นประโยชน์

วิธีการวางไข่เริ่มต้นในรีลีสปัจจุบันคือ "smart-lv2" ซึ่งจะข้ามเฟรมเวิร์ก spawner ดังนั้นการตั้งค่าการหมดเวลาของเฟรมเวิร์ก spawner จะไม่มีผลต่อไปเว้นแต่คุณจะตั้งค่าวิธีการวางไข่เป็น "อัจฉริยะ" อย่างชัดเจน

ที่มา: http://groups.google.com/group/phusion-passenger/browse_thread/thread/c21b8d17cdb073fd?pli=1


1

หากโฮสต์ของคุณเป็นเซิร์ฟเวอร์ที่ใช้ร่วมกันเช่นของฉันคุณจะเปลี่ยนการตั้งค่าไม่ได้และติดอยู่กับงาน cron


สำหรับแอปพลิเคชันนี้โชคดีที่ไม่ใช่ แต่ฉันจะจำไว้สำหรับอนาคตขอบคุณ
tsdbrown

1

ฉันก็มีปัญหานี้เช่นกัน แต่ฉันไม่สามารถเปลี่ยนการตั้งค่าผู้โดยสารได้เนื่องจากฉันไม่ได้รับอนุญาตให้เขียนไฟล์นี้ ฉันพบเครื่องมือ ( http://www.wekkars.com ) ที่ช่วยให้แอปของฉันตอบสนองอย่างรวดเร็ว บางทีนี่อาจเป็นทางออกสำหรับคุณ


0

ตรวจสอบรุ่นของผู้โดยสาร มันคือ RailsSpawnMethod <string>สำหรับเวอร์ชันเก่า

ถ้าเป็นเช่นนั้น (ถ้าจำไม่ผิด) ให้แทนที่ Passenger ด้วย Rails ในคำสั่งการกำหนดค่าทั้งหมดหรือค้นหาเอกสารผู้โดยสารเก่าเพื่อดูรายละเอียดเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.