2013-06-04 44 views
5

Tôi đã cố gắng sử dụng một nhân viên Dyno 2X, chờ đợi để không nhận lỗi R14, nhưng đây là kết quả:Heroku nhân Dyno cho lỗi R14 - vấn đề với quản lý bộ nhớ - tùy chọn giới hạn bộ nhớ rmagick

2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Process running mem=1047M(102.3%) 
2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded) 

Tuy nhiên, nhiệm vụ cho công nhân đã hoàn tất thành công.

Câu hỏi:

  • Làm thế nào tôi có thể làm giảm bộ nhớ cần thiết cho công việc của tôi? - Tôi đang sử dụng đá quý rmagick để chuyển đổi danh sách hình ảnh thành một bản pdf nhiều trang.
  • Làm thế nào nguy hiểm là giữ cho quy trình như thế này (với lỗi R14) khi công việc cuối cùng kết thúc thành công?

Cảm ơn trước

+0

Bạn chỉ đang chạy 1 trong số các công việc này tại một thời điểm trong sidekiq? Đó là, có 1 công việc mất 1 gig bộ nhớ? –

+0

Có vẻ như đá quý rmagick mà tôi cũng đang sử dụng có rò rỉ bộ nhớ: http://stackoverflow.com/questions/958681/how-to-deal-with-memory-leaks-in-rmagick-in-ruby – josal

Trả lời

5

cuối cùng tôi đã tìm thấy một giải pháp. Vấn đề là với rmagick. Nó nhận được tất cả bộ nhớ mà nó nhìn thấy có sẵn. Nó không quan trọng nếu bạn sử dụng một công nhân 2X dyno thay vì một 1X một. Nó phát triển đến các tài nguyên có sẵn tối đa. Vì vậy, we have to set a limit. Nhưng trong trường hợp của tôi không phải tất cả các giới hạn đều hiệu quả.

Bạn có thể thực hiện cuộc gọi hệ thống trực tiếp theo cách này:

convert -limit memory 0 -limit map 0 list_of_input_files output_file

Bằng cách này, bạn tránh sử dụng bộ nhớ cache, đi trực tiếp vào bộ nhớ cache đĩa. Đây là cách duy nhất tôi tìm thấy để tránh các lỗi R14 trong heroku. Với các kết hợp khác như -limit memory 32 -limit map 64 hoặc tương tự, nó luôn cho tôi lỗi. Tôi lấy ý tưởng from here.

Tất nhiên, bạn luôn có thể sử dụng rmagick library với dòng này, tuy nhiên nó không làm việc cho tôi và tôi đã sử dụng phương pháp syscall giải thích trước:

Magick.limit_resource(:memory, 0) 
Magick.limit_resource(:map, 0) 

UPDATE: Tôi đã sử dụng nice lệnh để đảm bảo ưu tiên hơn. Dường như nó cải thiện, nhưng cuối cùng tôi nhận được lỗi R14, nhưng nó là sự thật họ không phải là quá thường xuyên (ngay cả với cùng một tập tin!).

+0

Có thể bạn nên thử [minimagick] (https://github.com/minimagick/minimagick) – shinnyx

+0

Tôi đã thử nó nhưng tôi không thể nhớ tại sao tôi không chọn nó. Dù sao cũng cảm ơn bạn. – josal

+0

Tìm thấy tuyệt vời @josai – Trip

0

Một chút muộn cho bữa tiệc, nhưng trong trường hợp của tôi, người thu gom rác là vị cứu tinh của tôi. Chỉ cần chạy GC.start sau mỗi công việc.

+0

Cảm ơn câu trả lời của bạn. – josal