문제

Ruby on Rails를 사용하여 작은 웹 앱을 작성했는데, 주요 목적은 XML (파일 최대 MB까지)의 결과를 업로드, 저장 및 표시하는 것입니다. 약 2 개월 동안 실행 한 후 나는 Mongrel 프로세스가 약 4GB의 메모리를 사용하고 있음을 알았습니다. 루비 메모리 누출 디버깅에 대한 연구를했는데 많이 찾을 수 없었습니다. 그래서 두 가지 질문이 있습니다.

  • 루비/레일에서 메모리 누출을 찾는 데 사용할 수있는 좋은 도구가 있습니까?
  • 루비에서 어떤 유형의 코딩 패턴이 메모리 누출을 일으키나요?
도움이 되었습니까?

해결책

레일에서 메모리 누출을 찾는 몇 가지 팁 :

첫 번째는 ObjectSpace의 객체에 의한 메모리 사용법의 그래픽 탐색입니다.

마지막 두 가지는 메모리 사용을 팽창시키는 특정 사용 패턴을 식별하는 데 도움이되며 거기서 작업 할 수 있습니다.

특정 코딩 패턴의 경우, 경험에서 파일 IO, 이미지 처리, 거대한 문자열 등으로 작업하는 모든 것을보아야합니다.

가장 적합한 XML 라이브러리를 사용하고 있는지 확인합니다. REXML은 느리고 누출 된 것으로 알려져 있습니다 (그 증거는 없습니다!). 또한 할 수 있는지 확인하십시오 메모에 값 비싼 운영.

다른 팁

각 요청 후 또는 이전에 메모리 사용량을 기록하는 매우 간단한 방법 (Linux의 경우에만).

#Put this in applictation_controller.rb
before_filter :log_ram # or use after_filter
def log_ram
  logger.warn 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip
end

스크립트/콘솔을로드하고 먼저 진술을 시도하여 상자에서 작동하는지 확인할 수 있습니다.

puts 'RAM USAGE: ' + `pmap #{Process.pid} | tail -1`[10,40].strip

그런 다음 요청이 메모리 사용이 점프 할 때 상단을 모니터링하면 로그를 확인하십시오. 물론 이것은 작은 단위가 아닌 큰 점프에서 발생하는 메모리 누출이있는 경우에만 도움이됩니다.

메모리 누출은 현재 루비 구현에서 문제입니다.http://whytheluckystiff.net/articles/sheallyupturnedbin.html WhytheluckyStiff 웹 사이트는 더 이상 존재하지 않지만 여기에서 원본 기사를 찾을 수 있습니다. http://viewsourcecode.org/why/hacking/seulyupturnedbin.html

오랜 RUBY 프로세스의 문제에 대한보다 구체적인 답변은http://zdavatz.wordpress.com/2007/07/18/heap-fragmentation-in-a-long-running-ruby-process/

어쩌면 당신은 승객 (mod_rails)을 시도 할 수 있습니다. http://nubyonrails.com/articles/ask-your-doctor-about-mod_rails

당신은 살펴 봐야합니다 루비 프로프.

Jruby로 전환하고 사용하십시오 일식 메모리 분석기. 현재 루비를위한 도구는 없습니다.

이제 다음을 실행하여 R을 읽을 수있는 형식으로 메모리를 얻을 수 있습니다. 나는 당신의 로그 라인이 다음과 같이 보인다고 가정합니다.

1234567890 RAM USAGE: 27456K

이것을 실행하십시오 (또는 스위트로 수정) :

$ grep 'RAM USAGE' fubar.log | awk '{print s " " $1 " " $4; s++}' | sed 's/K//g' > mem.log

그런 다음 이것을 실행할 수 있습니다.

#!/bin/sh
rm -f mem.png
R --vanilla --no-save --slave <<RSCRIPT
    lst <- read.table("mem.log")
    attach(lst)
    m = memory / 1024.0
    summary(m)
    png(filename="mem.png", width=1024)
    plot(date, m, type='l', main="Memory usage", xlab="time", ylab="memory")
RSCRIPT

그리고 멋진 그래프를 얻으십시오.

이 보석은 나를 위해 일했습니다.

MemoryLogic

레일 로그에 Proccess ID 및 메모리 사용량을 추가하여 메모리 누출 추적에 적합합니다.

오크

VM 힙 크기를 크게 증가시키는 동작을 식별하기위한 로그 파서

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top