2012-02-29 41 views
5

Tôi hơi bối rối về chiến lược triển khai của mình ở đây, khi triển khai trong trường hợp nào tôi muốn gửi tín hiệu reload cho lân? Ví dụ trong trường hợp của tôi nó sẽ như thế nào:Sử dụng `tải lại` thay vì` khởi động lại 'cho Unicorn?

sudo kill -s USR2 `cat /home/deploy/apps/my_app/current/tmp/pids/unicorn.pid` 

Tôi đã triển khai ứng dụng của tôi bằng cách giết chết pid đó, sau đó bắt đầu kỳ lân một lần nữa qua một cái gì đó như:

bundle exec unicorn -c config/unicorn/production.rb -E production -D 

Tôi chỉ tự hỏi tại sao Tôi muốn sử dụng tải lại? Tôi có thể đạt được hiệu suất cho việc triển khai của mình bằng cách làm như vậy không?

Trả lời

14

Khi bạn giết lân, bạn gây ra thời gian chết, cho đến khi kỳ lân có thể bắt đầu sao lưu. Khi bạn sử dụng tín hiệu USR2, kỳ lân bắt đầu công nhân mới đầu tiên, sau đó một khi họ đang chạy, nó giết chết các công nhân cũ. Về cơ bản tất cả là về việc loại bỏ nhu cầu "tắt" kỳ lân. Lưu ý, giả định là bạn có tài liệu móc before_fork trong cấu hình kỳ lân của bạn, để xử lý việc giết chết các công nhân cũ, nên tìm thấy tập tin ".oldbin", chứa PID của quá trình kỳ lân cũ :

before_fork do |server, worker| 
    # a .oldbin file exists if unicorn was gracefully restarted with a USR2 signal 
    # we should terminate the old process now that we're up and running 
    old_pid = "#{pids_dir}/unicorn.pid.oldbin" 
    if File.exists?(old_pid) 
    begin 
     Process.kill("QUIT", File.read(old_pid).to_i) 
    rescue Errno::ENOENT, Errno::ESRCH 
     # someone else did our job for us 
    end 
    end 
end 
Các vấn đề liên quan