2009-06-24 2 views
14

Windows에 특정 프로세스의 메모리를 디스크로 스왑해서는 안된다고 말하는 방법이 있습니까?Windows에게 특정 프로세스의 메모리를 스왑하지 않도록 할 수 있습니까?

매우 큰 메모리 사용량을 가진 .Net Windows 서비스입니다. 나는 물리적 RAM을 많이 가지고 있지만 운영 체제는 프로세스 메모리의 일부를 페이지 파일로 이동시키는 것처럼 보입니다.

+2

윈도우 프로세스 작업 세트에서 페이지를 이동에 의해 설명 된대로 성능, 버퍼가 아닌 응용 프로그램 데이터에 대한 문제의 메모리를 사용하는

또한, 그것은 더 좋을 수 있습니다 가장 최근에 액세스 한 기준. 일반적으로 이는 좋은 결과를 가져다 주지만 특정 사용 사례는 제어가 필요할 수 있습니다. 이 작업을 수행하기 전에 Windows Internals (시작하기)를 읽고 자신이하려는 것을 더 잘 이해하십시오. – Richard

+1

나는 의견을 초. 대부분의 경우 Windows 메모리 관리자를 out-smart하려고하면 성능이 저하됩니다. –

+1

주요 질문 : 어째서이 문제 ("프로세스 메모리의 페이지 파일 이동 부분")가 문제입니까? – Stobor

답변

17

VirtualLock을 사용하면 메모리가 디스크로 페이징되지 않도록 할 수 있지만 OS가 시스템 메모리를 관리하는 것이 더 바람직하다고 생각합니다. 그것은 꽤 좋았고, OS가 왜 내가 디스크 뭘하고 있는지 알지 못하는 한 디스크를 스왑하는 이유를 추측하지는 못했습니다.

+0

+1 :이 작업을하지 않는 것이 좋습니다. – Richard

+1

잘 작동했다면 일부 복사 작업이 켜져 있고 페이징 io를 차단했기 때문에 몇 초 만에 컨텍스트 메뉴를 여는 많은 앱을 볼 수 있습니까? – John

12

기본적으로 VirtualLock은 사용자의 권한 (기본적으로 "메모리 내 페이지 잠그기"의 보안 정책 설정에는 항목이없고 관리자가 아님)가 있더라도 서둘러 할당량이 부족합니다.

이 작업을 구성하는 경우 "프로세스에 메모리 할당량 조정"도 설정해야합니다.

이 질문은 약간 모호합니다. VM 공간의 어느 부분을 스왑 아웃하지 않을까요? 힙/스택/모듈의? ...?

전반적으로 과거에 사용한 한 가지 해결책은 읽기/쓰기가 가능한 큰 섹션이있는 DLL을 만드는 것입니다. 필요한 경우 실행 및 공유를 표시 할 수도 있지만 그 다음에는 HeapCreate 그 모듈의 섹션에 넣어 힙으로 사용할 수있게 해줍니다.

here, IMAGE_SCN_MEM_NOT_PAGED으로 설정할 정확한 비트를 찾아 볼 수 있습니다.

이 비트로 모든 모듈 및 섹션을 표시하는 과정을 거치는 경우 Windows 모듈 로더는 관절 사용자 할당량을 청구하지 않거나 코드를 배포하는 각 시스템에서 정책 설정을 수정해야합니다. 이러한 NON_PAGEABLE dll에 생성하는 HEAP에 대한 액세스를 제공하려면 특별한 shim을 코딩해야합니다.

약간의 작업이지만 과거에는 잘 작동했지만 동일한 주소를 기반으로 여러 프로세스에 메모리를 공유해야한다는 추가 요구 사항이있었습니다.

나는 가장 쉬운 방법은 페이지 파일을 완전히 비활성화하는 것이라고 생각합니다. 그러나 이전에 Vista/2008 + OS를 사용하고 있다면 스와핑은 가까운 미래에 하나의 응용 프로그램이나 다른 응용 프로그램을 사용해야한다는 가정하에 시스템을 사전에 "조정"할 수있는 슈퍼 페치로 인한 것일 수 있습니다. 다른 쉬운 작업은 검색과 같이 사용하지 않는 서비스를 막는 것입니다. 엄청난 양의 파일을 인덱싱 할 수 있으며 시스템 작업을 구성하는 "작업 스케줄러"에 들어가야합니다. 기본적으로 대부분의 시스템에는 기본적으로 몇 십 가지가 있습니다 모든 Dr. Watson 덤프를 MS로 전송하고 드라이브 및 기타 메모리 집약형 작업을 조각 모음 할 수 있습니다.

더 자세한 답변을 얻으려면 좀 더 자세하게 대답 할 수 있지만 다른 제안은 대형 솔리드 스테이트 드라이브를 구입하여 스왑 용으로 사용하는 것입니다. 전체 성능에서 시간이 지남에 따라 저하됩니다 기존의 모든 SSD 기술과 공통된 불량 블록 매핑으로 인한 크기.

나는 최근 자신의 페이지에서 "non-paged clr host"라는 CodePlex의 프로젝트를 건너 왔어요 : 구현의 관점에서

구현의 비 페이징 CLR 호스트는 후에도 SetProcessWorkingSetSize를 사용 SetProcessWorkingSetSizeEx (Windows에서 Server 2003 이상) 및 VirtualLock ensu하는 API 그 메모리가 할당 된 실제 메모리에 잠겨 있습니다. 위의 API를 를 사용하여 하지 않습니다 페이징이 발생하지 않습니다 절대적인 확실성 와보증 것을 참고; 대신, 은 매우 예외적 인 시나리오 인 에 발생하는 확률을 최소화하기 위해을 최소화합니다. 일부 부하 테스트에서 우리는, 실시에도 전체 시스템의 실제 메모리가 부족 결함이 과정 비 페이징 CLR 호스트를 사용하여 관찰되었다 아무 페이지에서 를 hogged 때.

0

해당 페이지가 메모리에서 제거되고 있습니까? VM 하위 시스템이 더러워진 페이지를 사전에 디스크에 쓰지 않고 퇴출하지 않고 잠재적 인 향후 할당이 지연 시간을 줄일 수 있습니다. 시스템이 IO 많은 양의 일을하는 경우 Martin Pool

+0

MS는 최근에 DynCache 도구를 출시했습니다.이 도구를 사용하면이 scenerio의 일부 환경 설정을 미리 구성하거나 설정할 수 있습니다. http://blogs.msdn.com/ntdebugging/archive/2009/02/06/microsoft-windows-dynamic- cache-service.aspx & http://sqlblogcasts.com/blogs/grumpyolddba/archive/2009/03/18/x64-memory-problems.aspx – RandomNickName42

+0

Gheeze 나는 당신을 찢어지기 싫지만 포인트가 필요합니다;). 당신이 인용 한 참고 문헌은 리눅스 용입니다. 분명히 명시하지 않으면 토착어의 subtile varieance가 매우 혼란 스러울 수 있습니다 ... 참고 자료 (http://msdn.microsoft.com/en-us/library/cc644950(VS) .85) .aspx), "FILE_FLAG_NO_BUFFERING을 FILE_FLAG_OVERLAPPED와 결합하면 I/O가 메모리 관리자의 동기 작업에 의존하지 않으므로 플래그는 최대 비동기 성능을 제공하지만 일부 I/O 작업은 데이터가 캐시에 저장되지 않기 때문에 시간이 걸립니다. " - 그래서 Windows = NO_BUFFER> * :) – RandomNickName42

관련 문제