작업 관리자에서 아무 프로세스나 오른쪽 클릭하고 "파일 위치 열기"를 누르면 보통 탐색기가 열린다. 그런데 몇몇 이름은 그 메뉴가 회색이거나 눌러도 아무 일이 없다. Memory Compression, Secure System, Registry, System 같은 것들이다. 파일이 없는 프로세스라니, 처음 보면 숨어 있는 무언가처럼 느껴진다.
경로가 빈 프로세스들
PowerShell 로 이 이름들을 한꺼번에 불러 봤다.
Get-CimInstance Win32_Process |
Where-Object { $_.ProcessId -in 0,4 -or $_.Name -in 'Registry','Memory Compression','Secure System' } |
Select-Object ProcessId, ParentProcessId, Name, ExecutablePath
다섯 개 모두 ExecutablePath 가 비어 있었다. 권한 때문에 안 보이는 것이 아니라 원래 디스크의 실행 파일에서 시작한 프로세스가 아니기 때문이다. 부모를 보면 더 분명하다. System Idle Process(PID 0)와 System(PID 4)은 부모가 0 이고, 나머지 셋은 모두 부모가 4, 즉 System 이었다. 커널이 직접 만든 그릇이라는 뜻이다. 확인한 시점의 메모리는 이랬다. 이 PC 의 실제 메모리는 47.1GB 다.
| 이름 | PID | 부모 | 작업 집합 |
|---|---|---|---|
| System Idle Process | 0 | 0 | 0MB |
| System | 4 | 0 | 18.5MB (핸들 9,054개, 스레드 495개) |
| Secure System | 236 | 4 | 191.4MB |
| Registry | 280 | 4 | 49.6MB |
| Memory Compression | 4348 | 4 | 621.3MB |
Memory Compression: 압축된 메모리의 보관함
이 중 가장 큰 것이 Memory Compression 이었다. 부팅 뒤 약 14시간이 지난 시점에 작업 집합이 621.3MB 였다. 숫자만 보면 메모리를 많이 먹는 것 같지만, 이 프로세스의 작업 집합은 다른 프로세스들의 메모리를 압축해 담아 둔 것이다.
Windows 10 부터는 메모리가 부족해지면 오래 안 쓴 페이지를 바로 디스크(페이지 파일)로 내보내지 않고 먼저 압축해서 메모리 안에 둔다. 디스크에 쓰고 다시 읽는 것보다 압축을 푸는 쪽이 빠르기 때문이다. 그 압축된 페이지들이 모여 있는 곳이 Memory Compression 프로세스다. 그래서 이 프로세스 자기 몫의 개인 메모리는 6.8MB 뿐이었다. 621MB 는 여러 프로그램의 메모리가 줄어든 채 들어 있는 양이고, 압축 전 원래 크기는 그보다 크다.
이 프로세스는 작업 관리자의 프로세스 목록에서는 보이지 않도록 되어 있는 것으로 알려져 있다. 대신 성능 탭의 메모리 화면에서 "사용 중(압축)" 괄호 안의 숫자로 압축된 양을 볼 수 있다. 이 숫자가 계속 크다면 압축 기능의 문제가 아니라 실제 메모리에 비해 띄워 둔 프로그램이 많다는 신호다. 메모리 압축 설정은 관리자 권한의 Get-MMAgent 로 볼 수 있는데, 일반 권한에서는 "액세스가 거부되었습니다"로 끝났다.
Secure System 과 Registry
Secure System 은 가상화 기반 보안(VBS)이 켜져 있을 때 보이는 이름이다. VBS 는 하이퍼바이저로 메모리 일부를 떼어 일반 Windows 커널도 손대지 못하는 구역을 만들고, 그 안에서 별도의 보안 커널을 돌린다. Secure System 은 그 구역을 작업 관리자에 보여 주는 자리라고 보면 된다. 이 PC 에서 상태를 읽어 보았다.
Get-CimInstance -Namespace root\Microsoft\Windows\DeviceGuard -ClassName Win32_DeviceGuard |
Select-Object VirtualizationBasedSecurityStatus, SecurityServicesRunning
VirtualizationBasedSecurityStatus 는 2(실행 중), SecurityServicesRunning 은 2 였다. 2 는 하이퍼바이저로 보호되는 코드 무결성, Windows 보안 앱에서 "메모리 무결성"이라고 부르는 기능이다. 191.4MB 는 그 보안 구역 쪽에 잡힌 메모리로 보인다. 같은 구역에서 도는 LsaIso.exe 도 작업 집합 3.6MB 로 떠 있었는데, 로그인 비밀 정보를 격리해 두는 LSA 의 짝으로 알려져 있다. 메모리 무결성은 드라이버를 통한 공격을 막는 기능이라, 메모리 200MB 가량 때문에 끌 일은 아니다.
Registry 는 이름 그대로 레지스트리를 담은 프로세스다. 예전에는 레지스트리 하이브가 System 프로세스 안쪽의 커널 메모리에 있었는데, Windows 10 1803 무렵부터 이렇게 따로 떼어 낸 것으로 알려져 있다. 이 PC 에서는 49.6MB, 스레드는 4개뿐이었다. 레지스트리를 읽고 쓰는 일은 각 프로그램이 커널을 통해 하므로 이 프로세스 자체가 바쁘게 도는 일은 드문 것으로 보인다. 설치된 프로그램이 많을수록 레지스트리가 커지니 이 숫자도 조금씩 다르다.
System, System Idle Process, 시스템 인터럽트
System(PID 4)은 커널과 드라이버의 작업이 걸리는 자리다. 이 PC 에서 핸들 9,054개, 스레드 495개였고, 핸들 수로 정렬하면 탐색기(약 8,700개)보다 위로 맨 앞에 섰다. System 의 CPU 가 높다면 System 이 문제라기보다 그 위에서 도는 어떤 드라이버가 일을 많이 하고 있다는 뜻이다. 디스크·네트워크·그래픽 드라이버를 최신으로 바꾸거나, 최근에 깔린 장치 관련 프로그램을 의심해 보는 것이 순서다.
System Idle Process 는 반대로 CPU 가 놀고 있는 시간을 보여 주는 자리다. 이 값이 90% 라면 CPU 의 90% 가 비어 있다는 뜻이니 높을수록 좋다. 작업 관리자의 세부 정보 탭에서 이 줄이 맨 위에 큰 숫자로 있으면 놀라지만 걱정할 것이 없다.
프로세스 탭에 보이는 "시스템 인터럽트"는 하드웨어가 CPU 를 부른 인터럽트와 그 뒷처리(DPC)에 쓴 시간이다. 확인할 수 있는 성능 카운터가 있다.
Get-Counter '\Processor(_Total)\% Interrupt Time','\Processor(_Total)\% DPC Time' -SampleInterval 2 -MaxSamples 3
2초 간격으로 세 번 읽었을 때 인터럽트 시간은 0.190.29%, DPC 시간은 0.050.58% 였다. 초당 인터럽트 수는 17,000~19,700 번 정도였는데, 이 정도 횟수는 CPU 입장에서 대단한 일이 아니다. 둘을 합쳐 몇 % 를 계속 넘는다면 드라이버나 장치 쪽 문제를 의심한다. 오래된 USB 장치, 무선 랜·사운드 드라이버가 자주 거론된다. 장치를 하나씩 빼 보거나 드라이버를 바꿔 보며 숫자가 내려가는지 보면 된다.
이 이름들은 끝내기를 눌러도 거부되거나 아예 대상이 되지 않는 것으로 알려져 있고, 실행 파일이 없으니 지울 것도 없다. 숫자가 신경 쓰일 때는 이 프로세스들이 아니라 그 숫자를 만든 쪽, 메모리라면 띄워 둔 프로그램, CPU 라면 드라이버를 보는 것이 맞다.
다음 편은 연재의 마지막으로, CPU 를 잡아먹는다는 검색어가 꾸준한 WmiPrvSE.exe(WMI Provider Host)를 본다. 누가 WMI 에 묻고 있는지 이벤트 로그로 찾아낸다.