페이지 폴트를 피하기 위해 .NET 프로세스의 WorkingSet을 1GB로 미리 늘려야합니다.
.NET에서이 작업을 수행 할 수있는 방법이 있습니까?
최신 정보
불행히도, 우리가 전화를하더라도SetProcessWorkingSetSizeEx가비지 콜렉션은 MinWorkingSet을 우회하여 작업 세트를 어쨌든 트리밍합니다 (아래 다이어그램의 "자동 GC.Collect ()"참조).
아래 그림에서 새 메모리를 프로세스에 할당 할 때 발생하는 페이지 오류 (빨간색 선)가 발생하지 않도록 프로세스 WorkingSet (녹색 선)을 1GB로 잠글 수있는 방법이 있습니까?
이것이 끔찍한 이유는 페이지 폴트가 발생할 때마다 애플리케이션 성능을 크게 저하시키는 250us 스레드를 차단하기 때문입니다.
최신 정보
인용구 : "C / C ++, 제 5 판, Jeffrey Richter (Wintellect)를 통한 Windows"
개별 프로세스에 의한 SetProcessWorkingSetSize에 대한 호출은 무시됩니다. 프로세스가 작업 세트를 비우려고 시도하는 것이 아닌 한. 설정 이 제한에서 JOB_OBJECT_LIMIT_WORKINGSET 플래그를 지정하십시오. LimitFlags 멤버.
이 책은 워킹 셋을 설정하는 유일한 방법은 프로세스를 작업 객체에 할당하고 JOB_OBJECT_LIMIT_WORKINGSET 및 MinimumWorkingSetSize를 설정하는 것이다.
최신 정보
SetProcessWorkingSetSizeEx는 소프트 페이지 폴트와 전혀 관련이 없습니다. 하드 페이지 오류는 현재 WorkingSet의 메모리가 하드 드라이브로 페이징되는 것을 방지하기 때문에 발생합니다.
최신 정보
WorkingSet을 늘리는 유일한 방법은 .NET을 매우 전문화 된 방식으로 실행하는 것입니다CLR 호스트C + +로 작성된 (내 대답을 참조하십시오).
원하는 것을 얻으려면 전화를 걸거나 핀볼을 사용해야합니다.SetWorkingSetSizeEx최소 1GB (두 번째 매개 변수) 및QUOTA_LIMITS_HARDWS_MIN_ENABLE
네 번째 매개 변수로, 작업 크기가 시스템의 "높은 메모리 부족"조건에서도 최소한으로 떨어지지 않도록합니다.
시스템 동작은 또한 필요할 수있는 OS 버전 등에 따라 호출자의 권한에 따라 다릅니다.SE_INC_WORKING_SET_NAME
및 / 또는SE_INC_BASE_PRIORITY_NAME
!
"배후"에서 이러한 API를 사용하는 다른 (더 멋진) 옵션은 찾을 수있는 .NET 래퍼입니다.이리.
문제가 발생하면 프로세스가 메모리 부족 상황에서 너무 적극적으로 손질을하고 있다는 것이 었으면 문제를 해결할 수 있습니다.SetProcessWorkingSetSize
또는 그냥 설정Process.CurrentProcess.MinWorkingSet
.
그래도 표시된 것은 작업 세트가 GC에 의해 줄어들고 있다는 것입니다. 이것은 실제로 일어나고있는 일은 GC가 당신의 WS를 구성하는 페이지의 할당을 해제하고 있다는 것을 말해줍니다. 이 경우 작업 세트 문제가 아닌 주소 공간 문제가 발생하며이를 방지하기 위해 시스템 호출을 할 수 없습니다. 이상적으로는 메모리를 OS로 반환하지 않도록 GC에 알릴 수 있지만 .NET에는 이와 같은 기능이 없습니다.
주소 공간 문제를 해결하려면 이미 할당 한 객체를 다시 사용해야합니다. 대형 오브젝트 힙에 문제가있는 경우, 콜렉션이 원인 일 가능성이 큽니다. 예를 들어, 새 배열 / 목록 / 사전을 만드는 대신Clear
메서드를 호출하고 다시 사용하십시오. 문제가 문자열 인 경우, 사용하지 않고 도망 갈 수 있습니다.StringBuilder
LOH에서 벗어나야합니다.
특정 유형의 오브젝트를 많이 작성하는 경우 재활용되는 풀을 만드는 것을 고려하십시오. 그런 일은 한번도 해본 적이 없지만, 구현하려고한다면 정적 팩터 리 메소드를 사용하여 객체를 생성합니다. 정적 팩토리 메소드를 사용하면 객체를 풀에서 꺼내 public 생성자 대신 초기 화기를 호출하고 finalizer를 넣을 수 있습니다. 다시 풀에 넣고 그 안에있는 모든 참조를 널 (NULL)로 만듭니다. 필요에 따라 수영장은ConcurrentBag<WeakReference<T>>
.
SetWorkingSetSizeEx
(자세한 내용은 내 답변 참조) ... - Yahia
나는 Job Object에 프로세스를 할당하고 설정하는 것JOB_OBJECT_LIMIT_WORKINGSET
과MinimumWorkingSetSize
일할 수도 있습니다.
소프트 페이지 오류를 줄이기 위해 .NET에서 프로세스의 WorkingSet을 늘리는 유일한 방법은 사용자 지정 아래에서 전체 .NET 응용 프로그램을 실행하는 것입니다CLR 호스트. 이는 약 800 줄의 맞춤 작성된 다소 밀도가 높은 C ++ 코드가 필요한 간단한 작업입니다. C ++ 코드는 .NET 호출을 가로 채어 Win32 메모리 관리 메서드를 호출하고 .NET 런타임의 동작을 변경하므로 일반적으로 메모리를 적극적으로 해제하지 않습니다.
이는 응용 프로그램이 시작될 때 소프트 페이지 폴트를 모두 발생 시키므로, 일반 응용 프로그램 실행 중에 .NET 응용 프로그램의 소프트 페이지 폴트 수가 거의 0으로 떨어집니다.
이것은 응용 프로그램이 메모리가 부족할 수도 있지만 더 빠르게 실행된다는 것을 의미합니다. 즉, 실시간 성능 향상을 위해 메모리 사용량을 희생합니다.
여기에 오해가 있다고 생각합니다 : 사용되지 않는 메모리를 확보하는 GC는좋은. WS 메트릭에서 더 높은 숫자를보기 위해 계속 유지하는 것은 쓸모가 없습니다.필요WS에서 사용되지 않는 메모리. 잘못된 측정 항목을 최적화하고 있습니다.
페이지 폴트의 수는 소프트 및 하드 폴트가 있기 때문에 의미가 없습니다. 하드 결함은 디스크에서 읽습니다. 소프트 결함은 대부분의 경우 아무 의미가 없습니다. 그것들은 OS의 구현 세부 사항입니다. 예를 들어, 새로 할당 된 모든 페이지에 대해 소프트 폴트가 발생합니다.
빨간색 그래프에 단단한 오류가 표시되지 않는다는 증거가 있습니다. 결국 500 / sec 정도가 나타납니다. 디스크가 500 IOP를 전달할 수 없으므로 하드 결함이 될 수 없습니다.
하드 결함 만 측정 (및 줄이기)하고 싶을 것입니다. 하드 결함 만이 의미있는 방식으로 성능에 영향을 미칩니다.
또한 WS 한계를 설정해도 GC에 영향을 미치지 않습니다. GC는 운영 체제 구성 요소가 아닙니다. Is는 사용자 모드 라이브러리입니다. 운영 체제가 작업 세트로 사용하기로 결정한 것과는 아무런 관련이 없습니다. 이러한 이유로 WS 한계를 설정하여 GC가 메모리를 해제하지 못하게 할 수 있습니다.
그렇다면 GC가 실행될 때 WS가 왜 줄어들까요? GC삭제약간의 기억. 일부 WS 제한을 설정해도 메모리 삭제를 막을 수는 없습니다.
의견에서 GC는 자체적으로 작업 집합을 줄이기 위해 일부 API를 호출 할 수도 있다고 제안했습니다. 왜 그렇게 할 수 있는지 전혀 알 수 없습니다. 왜 GC가 페이지를 강제로 제거합니까? 주의 사항 : WS와 할당 된 페이지는 동일하지 않습니다 (전혀!). GC는해제기억. WS가 축소되는 것을 강제하지 않습니다. 그 목적은 무엇입니까?
SetProcessWorkingSetSize
< / a > < a href = "pinvoke.net/default.aspx/…> - GabeSetProcessWorkingSizeEx
작업 집합을 줄입니다. - Gabe