2014-04-30 1 views
3

나는 잘 작동 한 Heroku의 Rails 3.2 Ruby 1.9 앱을 가지고있었습니다. 루비 2.1으로 업그레이드하고 4.1 레일 곧 점점 메모리 오류 시작 : 나는 메모리 사용을 보여에게 Heroku에서 옵션을 설정Ruby와 Rails를 업그레이드 한 후에 어떻게 메모리 누수를 진단합니까?

오류 R14 (메모리 할당량 초과)

합니다. 그것은 시간이 지남에 따라 사용량을 증가 보여 주지만, 그렇지 분명 이유 :

소스 = web.1 다이노 = heroku.12 ... 샘플 # memory_total = 514.44MB 샘플 # memory_rss = 449.46MB 샘플 # memory_cache = 0.52MB

[모듈 : 샘플 #의 memory_swap = 64.46MB 샘플 # memory_pgpgin = 142709pages 샘플 #의 memory_pgpgout는 =

나는 다음과 같은 최고 결과를 클래스는 대부분의 경우이있는 확인하기 위해 오브젝트 공간에서보고 얻은 27516pages , 1232], [MIME :: Type, 1643], [Regexp, 2334], [Hash, 3002], [Class, 3004], [Pr OC, 3363가], [RubyVM의 :: 봉투, 3416], [배열, 25436], [RubyVM의 :: InstructionSequence, 26490은], [문자열, 127601]

은 문자열의 매우 많은 것 같다 , 비록 내가 보통 얼마나 많은지 모르겠지만. ObjectSpace.garbage_collect을 실행하여 문자열을 47485 인스턴스만큼 줄였으며 T_ARRAY (-16308) 및 : T_NODE (-19508)와 같은 다른 많은 클래스의 인스턴스 수에 영향을주었습니다.

위의 내용은 String 객체가 누수의 원인임을 의미합니까? 어떻게 진단해야합니까?

업데이트는 :
나는 추가 메모리 정보를 얻을 수있는 OINK 보석을 설치하고 로그의 조각에 달렸다.
7만7백48킬로바이트, 정적 번호 홈이
70,748킬로바이트이 섹션 번호가 표시
40,664킬로바이트 : - - 요약
최악의 요청

: 메모리의 톤을 사용하지만, 그냥 모든 것을 보여줍니다 페이지 번호가

을 보여 그것은 또한 생성 된 활성 레코드의 수를 보여줍니다

을 - 요약 -
최악의 요청 : 1569
는, 정적 번호 홈
829, 섹션 번호가
817, 페이지 번호 그래서 일반적인 메모리 누수가있다

보여 보여,하지만 난 그것을 어떻게 찾을 수 있습니까?

+0

문제가 new_relic 인 것으로 의심됩니다. 나는 그것을 확인하기 위해 기다릴 것이다. –

+0

사실 그것은 Ruby 2.1입니다. –

답변

1

new_relic gem 3.7.3을 삭제하면 며칠 동안 도움을 받았지만 메모리 문제는 다시 시작되었습니다. Ruby를 2.1에서 2.0으로 바꾸면 문제가 해결되었습니다. 그것은 유니콘과 루비 2.1 잘 지내지 않는 것 같습니다.

1

개발 환경에서 메모리 https://rubygems.org/gems/oink을 사용하는 곳에서 디버깅 할 oink gem을 찾으십시오.

DB 개체가 많은 (has-many) db 요소를 많이 가지고 있는지 확인하십시오.그들은 얼마나 많은 메모리를 소비하는지 당신을 놀라게 할 수 있습니다.

+0

좋아, 나는 누출을 찾는 방법을 아직도 모르지만 Oink를 추가했습니다. –

+0

이제 oink로 지침을 따르고 앱을 여러 번 실행 한 다음 매번 더 많은 메모리를 사용하는 프로세스가 있는지 확인하십시오. 때때로 메모리 누수가 아니지만 액세스 할 때마다 계속 커지는 개체입니다. 기억이있는 마지막 악몽에는 이미지와 has_many 관계가있는 객체가있었습니다. 새 이미지를 추가 할 때마다 개체는 다음에 호출 될 때 모두로드합니다. 그래서 메모리를 오버런하는 데 오랜 시간이 걸리지 않았습니다. – bobbdelsol