Windows 컴퓨터 및 서버는 시스템의 비페이징 메모리 풀에 데이터를 저장하는 특정 시스템 드라이버의 누출로 인해 메모리 오버플로 문제가 발생할 수 있습니다. 비페이징 메모리 똥 l은 운영 체제의 커널과 드라이버가 사용하는 컴퓨터 RAM의 데이터입니다. 비페이징 풀은 디스크(페이징 파일)로 스왑되지 않으며 항상 실제 메모리에만 저장됩니다.
메모리에서 페이징되지 않은 메모리의 현재 크기를 볼 수 있습니다. 실적 섹션 작업 관리자의 탭. 아래 스크린샷은 서버의 거의 모든 메모리가 사용 중이며 대부분의 메모리가 비페이징 풀 4.2GB에 의해 점유되고 있음을 보여줍니다. 일반적으로 비페이징 풀의 크기는 200-400MB를 거의 초과하지 않습니다. 비페이징 풀 크기가 크면 일부 시스템 구성 요소 또는 장치 드라이버에 메모리 누수가 있음을 나타내는 경우가 많습니다.
서버의 비페이징 풀에 메모리 누수가 있는 경우 시스템 이벤트 로그에 다음 이벤트가 나타납니다.
이벤트 ID:2019소스:Srv
설명:
The server was unable to allocate from the system nonpaged pool because the pool was empty
대부분의 경우 위에서 설명한 메모리 누수의 원인은 Windows에 설치된 타사 드라이버의 일부 문제입니다. 일반적으로 이들은 네트워크 드라이버입니다. 대용량 파일을 다운로드할 때 풀 동작에 주의하십시오(대부분 빠르게 증가할 수 있음).
Windows의 최대 비페이징 풀 크기:
- 최대 128Gb의 Windows x64 및 실제 메모리의 75% 이하
- Windows x86 최대 2Gb 및 75% 이하 RAM
Windows 재부팅만이 비페이징 풀을 정리하는 데 도움이 됩니다. 가정용 기기에는 적합할 수 있지만 24시간 연중무휴로 작동하는 서버에 더 나은 솔루션을 찾아야 합니다.
내용:
- 네트워크 데이터 사용량 모니터링 드라이버 비활성화
- PoolMon을 사용하여 커널 모드 메모리 누수 찾기
- 최신 버전의 네트워크 어댑터 드라이버 설치
- Hyper-V 역할 비활성화
네트워크 데이터 사용량 모니터링 드라이버 비활성화
종종 비페이징 풀에서 메모리 누수가 발생하는 이유는 네트워크 활동 모니터링 드라이버(네트워크 데이터 사용량 — NDU, %WinDir%\system32\drivers\Ndu.sys
) 네트워크 어댑터 드라이버를 사용합니다. 대부분의 경우 Killer 네트워크 및 MSI 네트워크 카드 드라이버는 NDU 드라이버와 충돌합니다. 이 서비스는 Windows 기능을 크게 잃지 않고 비활성화할 수 있습니다.
다음 명령을 사용하여 NDU 서비스를 중지합니다.
sc config NDU start= disabled
또는 레지스트리를 통해:
- 레지스트리 편집기(regedit.exe );
- 레지스트리 키 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Ndu\로 이동합니다.;
- 시작 값 변경 매개변수를 4.로 지정합니다.
변경한 후에는 컴퓨터를 다시 시작해야 합니다.
PoolMon을 사용하여 커널 모드 메모리 누수 찾기
비페이징 풀에서 메모리 누수를 일으킨 드라이버를 식별할 수 있습니다. 이렇게 하려면 Poolmoon.exe 가 필요합니다. Windows 드라이버 키트에 포함된 콘솔 도구 (WDK). Microsoft에서 Windows 버전용 WDK를 다운로드하여 설치합니다. 그런 다음 Poolmon.exe를 시작합니다(Windows 10용 WDK의 경우 도구는 C:\Program Files (x86)\Windows Kits\10\Tools\
에 있습니다. 폴더).
도구를 시작한 후 P 키를 누릅니다. . 두 번째 열은 페이지되지 않은 메모리(Nonp 속성)를 사용하는 프로세스의 태그를 표시합니다. 그런 다음 B를 누릅니다. 키를 눌러 드라이버 목록을 바이트 열로 정렬합니다.
왼쪽 열에는 드라이버 태그가 나열됩니다. 당신의 임무는 이 태그를 사용하여 드라이버 파일을 식별하는 것입니다. 이 예에서 비페이징 풀에 있는 대부분의 RAM이 Nr22 태그가 있는 드라이버에서 사용되는 것을 볼 수 있습니다. , 계속 및 smNp .
strings.exe
를 사용하여 찾은 태그에 대한 드라이버를 확인해야 합니다. 도구(Sysinternals에서), 내장 findstr
사용 명령을 사용하거나 PowerShell을 사용합니다.
찾은 태그와 관련된 드라이버 파일을 찾으려면 다음 명령을 사용하십시오.
findstr /m /l /s Nr22 %Systemroot%\System32\drivers\*.sys
findstr /m /l /s ConT %Systemroot%\System32\drivers\*.sys
findstr /m /l /s smNp %Systemroot%\System32\drivers\*.sys
또는 PowerShell을 사용할 수도 있습니다.
Set-Location "C:\Windows\System32\drivers"
Select-String -Path *.sys -Pattern "Nr22" -CaseSensitive | Select-Object FileName -Unique
Select-String -Path *.sys -Pattern "Py28" -CaseSensitive | Select-Object FileName -Unique
Select-String -Path *.sys -Pattern "Ne40" -CaseSensitive | Select-Object FileName –Unique
poolmon.exe에서 직접 태그에 대한 드라이버 파일을 매핑할 수 있습니다. 이렇게 하려면 pooltag.txt 파일은 도구 디렉토리에 있습니다. WDK 설치 디렉터리에서 pooltag.txt를 복사하거나 GitHub에서 다운로드할 수 있습니다. 다음과 같이 풀몬을 실행합니다.
poolmon /g
이제 드라이버 이름이 Mapped_driver에 표시됩니다. 열.
따라서 문제를 일으킬 수 있는 드라이버 파일 목록이 있습니다. 이제 이러한 파일이 이름으로 참조하는 드라이버 및 시스템 구성 요소를 식별해야 합니다. 이를 수행하려면 서명 확인을 사용할 수 있습니다. Sysinternals의 도구입니다.
sigcheck C:\Windows\System32\drivers\rdyboost.sys
이 도구는 드라이버 또는 Windows 구성 요소의 이름, 설명 및 버전을 반환합니다.
이제 문제가 있는 드라이버 또는 서비스를 제거/업데이트/재설치할 수 있습니다.
메모리 누수로 인해 BSOD가 발생한 경우 메모리 덤프 파일에서 문제가 있는 드라이버를 식별할 수 있습니다.
- Windbg 디버거에 메모리 덤프 로드
- 명령 실행:
!vm
- 비페이지 풀 사용 값이 NonPagedPool Max보다 큽니다. , 이는 페이징되지 않은 풀이 소진되었음을 의미합니다.
- 다음 명령을 사용하여 풀의 내용을 확인합니다(결과는 비페이징 풀 사용량에 따라 정렬됨):
!poolused 2
- 드라이버 태그를 얻은 후
findstr
을 사용하여 드라이버 파일을 찾습니다. 또는strings.exe
위에서 설명한 대로
최신 버전의 네트워크 어댑터 드라이버 설치
공급업체 웹사이트에서 네트워크 어댑터의 최신 드라이버 버전을 다운로드하여 설치해 보십시오.
Windows에서 자동 드라이버 업데이트가 활성화된 경우 새 드라이버를 설치한 후 문제가 시작되었는지 확인합니다. 이전 드라이버 버전으로 롤백하고 문제가 지속되는지 확인합니다. 문제가 해결되면 자동 드라이버 업데이트를 비활성화하십시오.
Hyper-V 역할 비활성화
경우에 따라 설치된 Hyper-V 역할로 인해 비페이징 풀에 대한 메모리 누수가 발생합니다. 이 역할이 필요하지 않다면 비활성화하는 것이 좋습니다.
Windows Server에서는 PowerShell 명령을 사용하여 Hyper-V 역할을 비활성화할 수 있습니다.
Remove-WindowsFeature -Name Hyper-V
Windows 10용 명령:
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
검색 결과가 반환되지 않으면 메모리 누수가 사용자 모드 프로세스로 인해 발생했는지 확인하십시오. 작업 관리자를 열고 세부정보로 이동합니다. 탭에서 NP 풀 추가 비페이징 풀에서 메모리 크기가 큰 프로세스를 찾습니다.
이 가이드는 Windows Server 2019/2016/2012R 및 데스크톱 Windows 10/8.1에 모두 적용됩니다.