2012-11-17 26 views
5

Vì vậy, tôi đã có ứng dụng đường ray này với một vấn đề rò rỉ bộ nhớ khủng khiếp. Tôi đang chạy nó trên Heroku, và trong vài ngày qua trong khi tôi đã cố gắng tìm ra những gì trên trái đất đang gây ra nó, tôi đã phải liên tục khởi động lại ứng dụng mỗi 5 giờ hoặc lâu hơn hoặc bộ nhớ vượt quá 512 và ứng dụng của tôi gặp sự cố.Rò rỉ bộ nhớ trong Rails App ... chuỗi cơn ác mộng

Tôi đang sử dụng Oink và tôi không thấy bất kỳ điều gì đáng chú ý với các lớp học được khởi tạo của tôi. Điều duy nhất là với mỗi lần tải trang, bộ nhớ được sử dụng tăng lên. Nó thậm chí không quan trọng trang nào tôi tải, nó dường như là ngẫu nhiên.

Di tích mới cũng không giúp được gì nhiều, vì nó không liên quan đến bất kỳ hành động điều khiển cụ thể nào.

Điều duy nhất tôi có thể tìm thấy là sử dụng ObjectSpace, nó cho thấy một số ENORMOUS của các đối tượng chuỗi trong bộ nhớ, và con số này chỉ phát triển và tăng lên. Tôi đã sử dụng một công cụ nhỏ để ghi lại giá trị của các chuỗi và tất cả đều trống. Không nil ... nhưng khoảng trắng. Ứng dụng sản xuất của tôi thường xuyên có hơn 200.000 đối tượng chuỗi đang được sử dụng.

Có ai có ý tưởng gì về những thứ này có thể đến từ đâu không? Điều này thực sự nhấn mạnh tôi phải ở máy tính của tôi sau mỗi năm giờ để giữ cho trang web của tôi còn sống.

Cảm ơn!

+1

Khó đưa ra lời khuyên cụ thể khác ngoài việc chỉ xóa mã cho đến khi bạn có ví dụ nhỏ nhất có thể hiển thị vấn đề và đăng –

+0

Và chạy nó trên máy chủ thay thế và nhấn nó với yêu cầu CURL liên tục cho đến khi bạn có thể repro. – peterept

+0

lời khuyên: không làm 'string = string1 + string 2', cũng không phải' string + = string1'. Do: 'string << string 1', không có chuỗi bổ sung nào được tạo theo cách này – apneadiving

Trả lời

8

Được rồi, điều này hoàn toàn vô lý, nhưng sau hai tuần lo lắng và đấu tranh, tôi đã tìm ra giải pháp cho sự rò rỉ này. Có nghĩa là tất cả đều rơi xuống dòng này:

ActionMailer::Base.delivery_method = :smtp 

trong tệp cấu hình application.rb của tôi.

Nó cần phải có được:

config.action_mailer.delivery_method = :smtp 

Tôi không có ý tưởng làm thế nào tôi đã nhận nó sai, nhưng cậu bé đã làm nó tàn phá trên ứng dụng của tôi.

Có ai biết tại sao điều này sẽ gây ra vấn đề như vậy không? Tôi đã mất khoảng một megabyte bộ nhớ trên mỗi truy vấn. Khùng.

+1

Cảm ơn vì điều này, bạn có thể vừa mới cứu tôi một số nhức đầu nghiêm trọng. – tyler

+1

Bạn đã hình dung ra điều này như thế nào? Ứng dụng Rails của tôi đang tạo ra các chuỗi như điên và tôi không có ý tưởng làm thế nào để theo dõi những gì đang tạo ra chúng. –

+2

@MihaRekar thật khủng khiếp. Tôi theo nghĩa đen phải quay trở lại trong thời gian qua nhiều tháng cam kết, tải và khởi động từng cái, và sau đó đập máy chủ với các yêu cầu bằng cách sử dụng công cụ chuẩn Apache cho đến khi tôi tìm thấy bản sửa đổi không có bất kỳ vấn đề nào.Sau đó, tôi từng mảnh từng loại bỏ thay đổi cho đến khi tôi tìm thấy một trong đó đã làm cho rò rỉ dừng lại. Phải mất nhiều ngày. –