6

C ++에서 다음 호출을 사용하면 프로세스의 WorkingSet이 결코 100MB 미만으로 떨어지지 않을 것이라고 기대합니다.

그러나이 호출을해도 여전히 OS가 작업 세트를 다시 16MB로 줄입니다.

WorkingSet을 100MB로 설정하면 소프트 페이지 페이지 오류를 제거하여 애플리케이션 속도가 크게 향상됩니다 (아래 다이어그램 참조).

내가 뭘 잘못하고 있죠?

SIZE_T workingSetSizeMB = 100;
int errorCode = SetProcessWorkingSetSizeEx(
    GetCurrentProcess(),
    (workingSetSizeMB - 1) * 1024 * 1024), // dwMinimumWorkingSetSize
    workingSetSizeMB * 1024 * 1024,  // dwMaximumWorkingSetSize,
    QUOTA_LIMITS_HARDWS_MIN_ENABLE | QUOTA_LIMITS_HARDWS_MAX_DISABLE
  );
// errorCode returns 1, so the call worked.

(전문가를위한 추가 비용) 실험 방법론

100MB 이상의 데이터를 할당하여 Process Explorer에서 보았던 작업 세트를 100MB 이상으로 가져온 다음 해당 메모리를 할당 해제하는 테스트 C ++ 프로젝트를 작성했습니다. 그러나 OS는 메모리를 할당 해제하자마자 WorkingSet을 다시 16MB로 줄였습니다. 원한다면 내가 사용한 테스트 C ++ 프로젝트를 제공 할 수있다.

Windows가 SetProcessWorkingSetSizeEx () 호출을 제공하는 이유가 작동하지 않는 이유는 무엇입니까? 나는 틀린 일을해야만합니다.

아래 그림은 초록색 라인 (작업 세트)이 50MB에서 30MB로 떨어졌을 때의 소프트 페이지 폴트 (빨간색 스파이크) 수가 급격히 증가한 것을 보여줍니다.

Example showing the increase in soft page faults when the WorkingSet is reduced too low

최신 정보

결과적으로 성능에 큰 영향을 미치지 않았으므로 결국 문제를 무시하게되었습니다.

더 중요한 것은 SetProcessWorkingSetSizeEx가아니현재 WorkingSet을 제어하고,아니어떤 방식 으로든 소프트 페이지 오류와 관련이 있습니다. 현재 수행중인 작업 세트가 하드 드라이브로 페이징되지 않도록함으로써 하드 페이지 오류를 방지합니다.

즉, 소프트 페이지 오류를 줄이려는 경우 SetProcessWorkingSetSizeEx는 하드 페이지 오류를 나타 내기 때문에 아무런 영향을 미치지 않습니다.

Windows가 메모리를 어떻게 다루는 지 "C / C ++을 통한 Windows"(Richter)에는 훌륭한 글이 있습니다.


  • OS가 할당 한 것보다 더 많은 페이지를 메모리에 보관할 것으로 예상되는 방법은 무엇입니까? - James McNellis
  • 그럼 왜 메모리를 할당 해제 하시겠습니까? - Mat
  • 가비지 수집기가 성능에 너무 많은 영향을 미치면 할당 정책을 검토 할 시간입니다. - Mat
  • 객체 재사용 (객체 풀링)은 (때때로) 수행 될 수 있습니다. GC는 개체를 할당하고 놓을 때 제어 할 수 없음을 의미하지 않습니다. - Mat
  • @Gravitas : 포인트가 누락되었습니다. 작업 집합에는 현재 RAM에있는 메모리 블록이 할당되며 사용자가 직접 제어 할 수있는 메모리 블록이 아닙니다. 예, 블록을 할당하여 작업 집합 크기를 특정 값으로 가져올 수 있지만 해제 된 후에는 사라지고 더 이상 사용할 수 없거나 작업 집합의 일부가됩니다. OS 페이지를 불가사의하게 다른 페이지로 되돌 리거나 프로세스에 맞게 유지하지 않습니다. 메모리가 스왑 아웃되는 것을 막으려면 해제하거나 계속 사용하지 마십시오. - Deanna

1 답변


4

페이지 결함은 싸고 예상됩니다. 실시간 응용 프로그램, 하이 엔드 게임, 고휘도 처리 및 BluRay 재생은 모두 페이지 오류가있는 최고 속도로 행복하게 작동합니다. 페이지 폴트가 응용 프로그램이 느린 이유는 아닙니다.

응용 프로그램의 속도가 느린 이유를 확인하려면 응용 프로그램의 일부 응용 프로그램 프로파일 링을 수행해야합니다.

특히 GC.Collect ()가있을 때 발생하는 페이지 폴트는 페이지 인 폴트가 아니라 GC가 방금 할당 한 사실로 인해 발생하는 페이지 폴트 (page-fault)입니다 개체를 이동할 수있는 새로운 페이지입니다. 수요 제로 페이지는 귀하의 페이지 파일에서 서비스되지 않으며 디스크 비용도 발생하지 않지만 여전히 페이지 오류이므로 그래프에 왜 표시되는지.

일반적으로 Windows는 자신보다 시스템 리소스를 관리하는 것이 더 좋으며 기본값은 일반 프로그램의 평균적인 경우에 맞춰 조정됩니다. 당신의 예제에서 당신이 가비지 콜렉터를 사용하고 있다는 것을 확실히 알 수 있습니다. 따라서 작업 세트와 가상 메모리를 처리하는 작업을 GC 구현에 이미 오프로드했습니다. GC 성능을 향상시키기 위해 SetProcessWorkingSetSize가 좋은 API 호출 인 경우 GC 구현이이를 수행합니다.

내 충고는 앱을 프로파일 링하는 것입니다. 관리 응용 프로그램의 속도 저하의 주요 원인은 GC가 느려지는 것이 아니라 잘못된 관리 코드 작성입니다. Big-O 성능을 개선하고 Future 및 BackgroundWorker와 같은 것들을 사용하여 값 비싼 업무량을 줄이고 네트워크에 대한 동기식 요청을 피하십시오. 무엇보다 빠른 속도로 앱을 개발하는 데 필요한 열쇠는 다음과 같습니다.윤곽그것.


  • Microsoft Concurrency Visualizer를 사용하여 응용 프로그램에서 진행되는 작업에 대한 통찰력을 얻었습니다. 결국, 성능 손실로 걱정하기에 충분하지 않았습니다. - Contango

연결된 질문


관련된 질문

최근 질문