2012-05-13 2 views
3

나는 rack-timeout gem 그래서 난 몇 가지 기능을 추가 할 수 갈래의 한 - 즉, 시간 제한의 사건을 잡기를 로깅하고, 503왜 내 미들웨어에 메모리가 누수가 있습니까?

Here's my fork를 전송.

Here's the Rack app/middleware in my fork.

예상대로 동작합니다. 그러나, 배포 이후, 내 app의 메모리 사용량은 증가 할 것이고, 재시동해야만 착실하게 성장할 것입니다. 성장하는 동안 그 행동은 정확하며 그 성능은 겉으로는 정상입니다.

내가 처음이 사실을 알았을 때, 요청이 끊어진 경우에 일부 스레드/메모리가 계속 매달려 있었기 때문일 수 있다고 생각했습니다. 이 실험 라인은 this patch입니다. 사실, 내 로컬 테스트에서,이 패치 메모리가 없으면 앱이 (의도적으로) 요청 시간 초과에 도달하면 꾸준히 증가하며, 패치를 사용하면 메모리가 낮고 정상적으로 유지됩니다.

그래서 문제를 해결했다고 생각합니다. 그러나 나는하지 않았다. 내 프로덕션 앱의 메모리는 계속해서 커진다. (나는 프로덕션 모드에서 로컬로 내 애플 리케이션을 테스트 해 보지 않았다.

내 랙 애플 리케이션에서 메모리 누수의 원인이 될 수있는 것은 무엇입니까?

+0

여분의 스레드가 왜':: Timeout.timeout (self.class.time, Rack :: Timeout :: AppTimeout) {@ app.call (env)}'이 될까요? 프로덕션 모드에서 확실히 테스트 할 가치가 있습니다 - 코드 재로드는 메모리 누출을 마스크 할 수 있습니다. –

+0

래퍼 스레드가 없으면 Timeout에서 예외가 발생하기 때문에 예외가 미들웨어 대신 스택에서 처리됩니다. 이것은 Tomeout의 구현 때문입니다. –

답변

0

클로저는 Timeout 클래스에 람다가 있습니다. 필요가 없으므로 대신에 메소드를 정의 할 것입니다. 이것이 원인인지는 확실하지 않지만 메모리 누수가 발생할 가능성이 큽니다.

관련 문제