Tôi đã gãi đầu với cái này gần 2 tuần rồi. Tôi có một máy chủ Ubuntu 14.04 với rbenv được cài đặt đang chạy một số trang web Rails khác nhau, một số trong số chúng trên các phiên bản cũ hơn của Rails, một số trong số chúng trên phiên bản mới nhất.
Tôi có 2 trang web đặc biệt là cả hai đều yêu cầu một phiên bản khác nhau của puma_worker_killer, 1 yêu cầu 0.1.0 và 0.1.1 khác. Cả hai trang web này đều sử dụng Ruby 2.5.3.
Khi tôi khởi động máy chủ, RAILS_ENV=dev3 bundle exec pumactl -F ./config/puma.rb start
tôi gặp lỗi sau trong nhật ký và trang web bị treo:
You have already activated puma_worker_killer 0.1.1, but your Gemfile requires puma_worker_killer 0.1.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
Lúc đầu, tôi nghĩ rằng đó có thể là một vấn đề với rbenv vì tôi đã cài đặt các viên đá quý trong ~ / .gem thay vì trong ~ / .rbenv vì vậy tôi đã thu thập tất cả các viên hồng ngọc trong ~ / .gem và cài đặt chúng mới vào đúng thư mục rbenv với bundle install
và tôi vẫn gặp vấn đề tương tự.
Bây giờ tại thời điểm này tôi muốn làm rõ rằng tôi đã thực hiện nghiên cứu sâu rộng về chủ đề này trực tuyến và tôi biết rằng tôi có thể làm nhiều việc để giải quyết vấn đề này.
Tôi biết tôi chỉ có thể thay đổi phiên bản và bundle update puma_worker_killer
.
Tôi cũng biết tôi có thể loại bỏ phiên bản mới nhất bằng cách thực hiện gem uninstall puma_worker_killer
và chọn 0.1.1 nhưng điều này có nghĩa là sự phụ thuộc vào trang web khác sẽ không được đáp ứng.
Tôi đã thực hiện một số nghiên cứu về mã nguồn của trình đóng gói và có thể thấy rằng điều đó gây ra bởi dòng mã sau:
return if activated_spec.version == spec.version
Khi chạy trong ngữ cảnh của trình đóng gói sử dụng bundle exec
cả hai activated_spec
và spec
khớp, có nghĩa là đoạn mã sau trong phương thức đó ( check_for_activated_spec!
) không chạy. Vì một số lý do, khi chạy lệnh trên để khởi động máy chủ,activated_spec
(đá quý được kích hoạt) là phiên bản mới nhất (0.1.1) và không phải là phiên bản được liệt kê trong Gemfile (0.1.0), có nghĩa là nó không quay lại và ném các lỗi trên.
Tôi cũng nên đề cập rằng dường như cũng có vấn đề tương tự với get_ process_mem, một trong những phụ thuộc của puma_worker_killer. Nó phàn nàn về việc đã kích hoạt 0.2.5 nhưng Gemfile của tôi muốn 0.2.4:
You have already activated get_process_mem 0.2.5, but your Gemfile requires get_process_mem 0.2.4. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
Theo hiểu biết của tôi về trình đóng gói, nó nên tải phiên bản được liệt kê trong Gemfile khi sử dụng bundle exec
để chống lại chính vấn đề này khi có nhiều phiên bản của cùng một loại đá quý.
Tôi biết tôi cũng có thể tạo một gemet riêng (có thể được thực hiện với rbenv rõ ràng) có các phiên bản khác nhau của puma_worker_killer trong đó và sau đó chạy rbenv local 2.5.3-pwk0.1.0
hoặcrbenv local 2.5.3-pwk0.1.1
tùy thuộc vào phiên bản tôi muốn, trong dự án, nhưng điều đó dường như quá mức cho những gì tôi muốn Hoàn thành.
Với tốc độ này, tôi chỉ muốn cập nhật tất cả các trang web với phiên bản mới nhất của cả puma_worker_killer và get_ process_mem và sau đó khóa chúng và xóa tất cả các phiên bản cũ hơn trên máy chủ, nhưng tôi không nghĩ mình nên làm điều đó.
Có ai biết những gì đang xảy ra ở đây hoặc liệu tôi đang làm gì đó sai trái?
Dưới đây là đoạn mã tôi sử dụng để sử dụng puma_worker_killer trong cấu hình puma của tôi.
before_fork do
require 'puma_worker_killer'
PumaWorkerKiller.config do |config|
config.ram = 1024 # mb
config.frequency = 5 # seconds
config.percent_usage = 0.98
config.rolling_restart_frequency = 12 * 3600 # 12 hours in seconds
end
PumaWorkerKiller.start
end
bundle update puma_worker_killer
không thực sự vì nó sẽ chỉ sử dụng phiên bản mới nhất của puma_worker_killer được cài đặt trên máy chủ