2013-02-28 1 views
2

저는 .NET으로 작성된 흐름 제어 시스템을 사용하여 시스템이 TCP 연결을 통해 외부 시스템과 상호 작용하고 서로 다른 끝점간에 트랜잭션을 라우팅합니다.관리되지 않는 코드가 메모리를 특정 한도까지 증가시키는 이유는 무엇입니까?

내 문제 : 시작시

/초기화가 개인 작업 설정 메모리 수준에 대한 2만5천킬로바이트입니다. 시스템이 유휴 상태 일 때 초기화한 후 개인 작업 세트는 약 57000KB의 한계에 도달 할 때까지 초당 50-100KB 정도의 속도로 스테핑 업합니다.

정보 : 점진 동안

시스템이 생성되는 페이지 폴트.

한계에 도달하면 개인 작업 세트가 매우 안정적으로 유지되고 +300 개의 클라이언트를 연결하고 고주파 트랜잭션을 몇 시간 동안 교환 할 때 수 MB로 위아래로 진동하므로 가비지 수집 논리가 작동합니다 아주 잘.

"Memory Profiler"라고 불리는 Redgate의 도구로이 시스템을 프로파일 링했습니다. 초기화되지 않은 코드에 의해 초기화가 할당 된 이후에 메모리가 올라간다는 것을 알려줍니다. 불행하게도이 프로파일 러는 관리되지 않는 코드에 의해 할당 된 메모리에 대한 통찰력을 지원하지 않습니다. 할당 된 메모리가 무엇을 포함하고 있는지, 할당 된 이유 및 메모리를 할당하는 코드를 찾는 데 어려움이 있습니다.

전체 코드베이스는 C#에서 개발되었으며 COM + 어셈블리에 대한 참조가없고 기본 Windows API와의 통신이 없습니다 (이 메모리 증분 중).

내 질문 : I 메모리가 지속적으로 초기화 한 후 특정 레벨에 작은 덩어리에서 증가하는 이유를 찾아 올바른 방향으로 지적 될 필요가

.

+3

_ "TCP 연결을 통해 [...] 네이티브 windows API와의 통신이 없습니다."- 당신이있는 동안 WinSock을 다시 빌드 했습니까? ;-) – CodeCaster

+1

이 메모리가 증가하는 동안 네이티브 API와의 통신이 없습니다 (내 질문은 해당 정보로 수정되었습니다). – tost

+1

@Tobias [_.Net Memory Profiler_] (http://memprofiler.com/)를 사용해보십시오. 관리되지 않는 메모리를 추적 할 수 있으며 무료 평가판을 사용할 수 있습니다. – Dzienny

답변

1

페이지가 작동하지 않는 경우 페이지가 디스크 또는 디스크에만 저장된다는 의미는 아닙니다. Windows의 페이지는 대기 목록으로 이동할 수 있습니다. 그럴 경우 WS에서 나와 의 부드러운 오류을 반환해야합니다. (나는이 메커니즘이 왜 존재하는지 결코 이해하지 못했다. 그러나 그렇다). 부드러운 결함은 싸다.

Process Explorer의 시스템 정보 창을 사용하면 초당 하드 및 소프트 결함 수를 볼 수 있습니다. 아마도 perfmon을 사용하여 사용할 수도 있습니다. 나는 당신이 단단한 결함이 있는지 확인해보기를 권한다. (나는 당신이 그렇게 생각하지 않아도 문제가없고 조사를 끝낼 수 있다고 믿는다.)

또한 WS는 메모리 사용과는 아무런 관련이 없지만 이미 알고 있다고 생각합니다.

+0

정보를 제공해 주셔서 감사합니다. 생성 된 페이지 오류는 소프트 오류입니다. – tost

+0

@ 토비아스 당신은 잘합니다. 그것은 perf 문제가 아니며 일반적으로 신비한 메모리 관리자 결정의 일부입니다. – usr

관련 문제