2012-02-29 24 views
8

Tuần trước chúng tôi đã nâng cấp một dự án nhỏ đang chạy trên Rails 3.0.1 lên Rails 3.2.2.Rò rỉ bộ nhớ lớn/sưng lên sau khi nâng cấp từ Rails 3.0 lên Rails 3.2 (Ruby 1.9.3 + Passenger)

Ngay sau khi nâng cấp, chúng tôi nhận ra rằng đôi khi, 2-3 lần một ngày, chúng tôi đã nhìn thấy một quy trình Phusion Hành khách rất lớn (1-5 GB).

Chúng tôi đang chạy Phusion Passenger 3.0.11 và Ruby 1.9.3-p0. Chúng tôi đã thử phiên bản Ruby khác nhau (1.9.2-p290 và 1.9.3-p125) mà không thành công.

Sau đó, chúng tôi đã cố gắng theo dõi mức sử dụng bộ nhớ của chúng tôi với Oink. Thật không may Oink không cho thấy lý do cho bộ nhớ sưng lên - Các quy trình lớn dường như không ghi vào logfiles nữa.

Khi chúng tôi hạ cấp xuống Rails 3.0.1, sự cố đã biến mất. Có ai có vấn đề tương tự? Chúng tôi thực sự đã kiểm tra mã của chúng tôi để có thể rò rỉ bộ nhớ, chẳng hạn như quá nhiều phiên bản ActiveRecord, nhưng không tìm thấy bất kỳ lỗi nào.

Bạn có nghĩ rằng bạn nên thử Unicorn thay vì Hành khách? Hoặc có khả năng chúng ta sẽ gặp phải vấn đề tương tự?

Bất kỳ đề xuất nào về cách theo dõi rò rỉ bộ nhớ đều được chào đón. Chúng tôi đã thiết lập newrelic, nhưng nó không hiển thị thông tin chi tiết về rò rỉ bộ nhớ.

+1

Chúng tôi đã thay thế Hành khách bằng thiết lập Unicorn và giờ đây hệ thống hoạt động như mong đợi. Tôi không nếu nó là một vấn đề hành khách chung hoặc có thể là một vấn đề với hành khách/rvm (và có lẽ cách chúng tôi gần đây đã cài đặt/nâng cấp nó). –

+0

bạn có muốn chia sẻ thiết lập kỳ lân của mình không? tôi đang gặp vấn đề tương tự, cần phải khởi động lại máy chủ sau mỗi 6 giờ để ngăn chặn tràn bộ nhớ! –

+2

Xin lỗi vì câu trả lời muộn. Vâng ... chia sẻ các thiết lập lân sẽ có lẽ quá nhiều để gửi nó như là một bình luận ở đây. Tìm kiếm nhanh trên Google sẽ giúp bạn. Có thể bạn bắt đầu ở đây: https://github.com/blog/517-unicorn.Về cơ bản nó chỉ là nginx với kỳ lân như máy chủ ngược dòng. Các thiết lập kỳ lân chỉ là một unicorn.rb đơn giản trong cấu hình .... Mất cho chúng tôi có lẽ một giờ để chuyển từ hành khách. Và một số khác để thêm nội dung triển khai kỳ lân vào cấu hình Capistrano của chúng tôi. –

Trả lời

0

Tôi muốn biết số liệu thống kê hành khách-bộ nhớ hiển thị và loại bộ nhớ bạn có hành khách được đặt cho PassengerMaxPoolSize PassengerPoolIdleTime và bất kỳ cài đặt hành khách nào khác.

Bạn nâng cấp hành khách như thế nào?

Thiết lập apache của bạn như thế nào? prefork hoặc công nhân?

Tôi nghi ngờ rằng bạn đang nhìn thấy hiệu suất gc nghèo, nỗ lực để điều chỉnh chúng bằng cách đặt này trong một wrapper quanh ruby ​​rằng hành khách sử dụng:

#!/bin/sh 
export RUBY_HEAP_MIN_SLOTS=600000 
export RUBY_GC_MALLOC_LIMIT=59000000 
export RUBY_FREE_MIN=200000 
exec "/usr/bin/ruby" "[email protected]" 

Cần khắc phục một số vấn đề hiệu suất mà bạn đang nhìn thấy nói chung do để mặc định gc ruby ​​nghèo.

+0

Đã lâu rồi kể từ khi chúng tôi gặp sự cố này. Rất tiếc, tôi không biết cấu hình Hành khách nữa nhưng tôi đoán đó là giá trị mặc định hoặc được đề xuất. Chúng tôi đã cài đặt Hành khách với tập lệnh cài đặt mặc định cũng đã cài đặt nginx cho chúng tôi. Như tôi đã viết trong bình luận ở trên, chúng tôi đã khắc phục vấn đề bằng cách sử dụng Unicorn/nginx thay vì Passenger/Nginx. –

1

Nếu đây là Linux tương thích với Red Hat, bạn có thể sử dụng SystemTap. Tôi không chắc liệu SystemTap có sẵn trên các hệ thống Debian/Ubuntu hay không, nếu không có thay thế được gọi là DTrace. Dưới đây là một số bài viết - Tôi đã khá thành công với việc theo dõi một số hồi quy, mặc dù không có vấn đề nào trong số này là vấn đề bộ nhớ (có thể bạn có thể tìm thấy tập lệnh STP có thể thực hiện thủ thuật cho bạn). Đọc ở đây:

http://lukas.zapletalovi.com/2012/02/peek-into-your-ruby-app-with-systemtap.html http://lukas.zapletalovi.com/2012/01/probing-ruby-apps-with-systemtap-in.html http://sourceware.org/systemtap/wiki/RubyMarker

Các liên kết cuối cùng cho thấy các đầu dò bạn có thể hoop vào trong SystemTaps trong Ruby. Có những suy nghĩ như gc chạy hoặc cấp phát bộ nhớ, có thể giúp bạn. Chúc may mắn!

Các vấn đề liên quan