음악을 틀어 놓고 일하다 노트북 팬이 돌기 시작해 작업 관리자를 열면, 의외의 이름이 CPU 위쪽에 있을 때가 있다. "Windows 오디오 장치 그래프 격리", 파일 이름은 audiodg.exe 다. 소리 하나 내는 데 왜 CPU 를 쓰는지, 이름의 "격리"는 무엇을 떼어 놓는다는 건지 이 PC 에서 확인해 봤다.

하나뿐이고, 서비스 세션에서 돈다

Get-Process audiodg | Select-Object Id, CPU, StartTime,
    @{n='WS(MB)'; e={[math]::Round($_.WorkingSet64/1MB,1)}},
    @{n='Private(MB)'; e={[math]::Round($_.PrivateMemorySize64/1MB,1)}}

확인한 시점에 audiodg.exe 는 하나였다. 세션 0, 즉 서비스 쪽 세션에서 돌고 있었고, 일반 권한으로는 경로와 명령줄이 비어 보였다. 부모를 따라가면 svchost.exe -k LocalServiceNetworkRestricted -p 그룹의 Audiosrv(Windows Audio) 서비스가 나온다. 장치 목록을 관리하는 AudioEndpointBuilder 는 다른 svchost 에 따로 있었다.

파일은 C:\Windows\System32\audiodg.exe, 903,640바이트, 버전 10.0.26100.9949 이고 Microsoft Windows 서명이 유효했다. 작업 집합 17.4MB, 개인 메모리 32.2MB, 스레드 11개였다. 시작 시각이 PC 를 켠 날이 아니라 이틀 뒤 저녁이었는데, 오디오 장치가 바뀌거나 소리가 한동안 없으면 내려갔다가 다시 뜨는 것으로 보인다. 그 뒤 약 17시간 동안 누적 CPU 시간은 47.8초였고, 1~2초 간격으로 15번 잰 CPU 사용률은 모두 0% 였다. 소리를 내지 않을 때는 거의 아무 일도 하지 않는다.

오디오 그래프와 '격리'의 뜻

앱이 소리를 내면 그 소리는 곧장 스피커로 가지 않는다. Windows 오디오 엔진이 여러 앱의 소리를 섞고, 장치가 받는 형식(샘플 레이트, 채널 수)으로 바꾸고, 그 사이에 효과를 입힌 뒤 드라이버로 넘긴다. 이 흐름을 그래프라고 부르고, 그 그래프가 실제로 도는 곳이 audiodg.exe 다.

효과는 APO(Audio Processing Object)라는 DLL 이 맡는다. Windows 가 기본으로 넣는 것도 있고, 사운드 칩 제조사나 오디오 앱이 드라이버와 함께 설치하는 것도 있다. 이퀄라이저, 가상 서라운드, 음량 평준화, 마이크 잡음 제거, 공간 음향이 대개 이 자리에 들어간다. 제조사 코드가 Windows Audio 서비스 안에서 직접 돌면 그 코드가 죽을 때 서비스 전체가 같이 쓰러지니, 그래프를 별도 프로세스로 떼어 낸 것이 "격리"의 뜻으로 알려져 있다. 그래서 audiodg 의 CPU 가 높다는 건 대부분 그 안에 올라온 효과 모듈이 바쁘다는 뜻이다.

이 PC 의 출력 장치와 효과 모듈

장치마다 어떤 APO 가 붙어 있는지는 레지스트리에서 읽을 수 있다. HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio 아래 Render(출력)와 Capture(입력)에 장치가 하나씩 키로 있고, 그 안 FxProperties 에 효과 모듈의 CLSID 가 들어 있다. CLSID 의 이름은 HKLM\SOFTWARE\Classes\AudioEngine\AudioProcessingObjects 에서 찾는다. 이 PC 에는 APO 가 37개 등록되어 있었다.

$root = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render'
Get-ChildItem $root | Where-Object { ((Get-ItemProperty $_.PSPath).DeviceState -band 0xF) -eq 1 } |
    ForEach-Object { (Get-ItemProperty "$($_.PSPath)\Properties").'{a45c254e-df1c-4efd-8020-67d146a850e0},2' }

출력 장치 키는 25개였지만, 지금 쓸 수 있는(활성) 것은 3개뿐이었다. 나머지는 연결이 끊겼거나 예전에 꽂았던 장치의 흔적이다. 입력은 22개 중 2개가 활성이었다. 활성 장치의 효과 모듈은 이렇게 나왔다.

장치 붙어 있는 효과 모듈
스피커 (Realtek Audio, 메인보드 사운드) CRtkAPOSFX · CRtkAPOMFX · CRtkAPOEFX (Realtek)
모니터 스피커 (AMD HD Audio, 그래픽 HDMI/DP 출력) WM audio LFX · GFX APO (Windows 기본)
USB 마이크의 헤드폰 단자 WM audio LFX · GFX APO (Windows 기본)
스테레오 믹스 (Realtek, 입력) CRtkRecEFX (Realtek)

메인보드 사운드인 Realtek 출력에는 Realtek 의 모듈이 세 단계(스트림·모드·엔드포인트)로 다 끼어 있었다. 함께 설치된 Realtek Audio Universal Service(RtkAudioUniversalService)도 자동 시작으로 돌고 있었다. 이 서비스 파일은 드라이버 저장소 폴더에 있었고 서명은 Microsoft 의 하드웨어 호환성 서명이었다. 서비스 쪽과 사용자 세션 쪽에 하나씩, 개인 메모리 6.7MB 와 4.7MB 였다. 드라이버는 Realtek Semiconductor Corp. 의 6.0.9927.1 이었다. 설정 앱 역할을 하는 Realtek Audio Control 앱과 공간 음향용 Dolby Access 앱도 설치되어 있었다. 반면 모니터와 USB 장치 쪽은 Windows 기본 모듈뿐이었다.

CPU 가 높을 때 원인 좁히기

audiodg 하나가 CPU 를 오래 잡고 있다면 순서는 이렇다.

먼저 "어느 장치로 소리를 낼 때인가"를 본다. 기본 출력 장치를 다른 것으로 바꿔 같은 소리를 틀어 보고 CPU 가 내려가면 원래 장치에 붙은 효과 모듈이 원인일 가능성이 높다. 이 PC 라면 Realtek 출력과 모니터 스피커를 번갈아 골라 보는 것이다. Realtek 쪽에서만 오른다면 Realtek 모듈을 의심할 차례다.

다음은 효과를 꺼 본다. Windows 11 에서는 설정 → 시스템 → 소리 → 해당 출력 장치 → "오디오 향상"을 끄기로 바꾸면 된다. 마이크라면 입력 장치 속성에서 같은 항목을, 공간 음향을 켜 두었다면 같은 화면의 "공간 음향"을 끔으로 한다. 언제든 되돌릴 수 있는 설정이라 하나씩 바꿔 보며 audiodg 의 CPU 를 지켜보면 된다. 제조사 앱(Realtek Audio Control 같은 것)에 별도의 이퀄라이저·서라운드 스위치가 있다면 그것도 확인한다. 화상 회의 앱의 잡음 제거와 Windows 의 마이크 효과가 겹쳐 있을 때 CPU 가 오른다는 이야기도 많다.

(Get-Counter '\Process(audiodg)\% Processor Time' -SampleInterval 1 -MaxSamples 10).CounterSamples.CookedValue

이 값은 논리 프로세서 하나를 100으로 친 값이라, 이 PC 처럼 논리 프로세서가 16개면 작업 관리자의 퍼센트보다 크게 나온다.

효과를 다 꺼도 높다면 드라이버 쪽이다. Windows Update 가 넣어 준 일반 드라이버와 메인보드·노트북 제조사가 배포하는 드라이버가 다를 수 있으니, 제조사 지원 페이지의 최신 오디오 드라이버를 확인한다. 서드파티 오디오 앱을 지웠는데도 그 앱의 효과 모듈이 레지스트리에 남아 장치에 붙어 있는 경우도 있는 것으로 알려져 있다. 위 명령으로 이름을 보면 누구의 모듈인지 드러난다.

audiodg 를 작업 관리자에서 끝내면 소리가 잠깐 끊겼다가 Windows Audio 가 다시 띄우는 것으로 알려져 있다. 일시적으로 CPU 가 내려갈 수는 있어도 원인이 그대로라 금방 돌아온다. Windows Audio 서비스를 끄는 것은 소리 자체를 끄는 일이다.

가짜 구별은 앞 편들과 같다. 일반 권한에서는 경로가 안 보이니 관리자 권한으로 보거나 파일 자체를 확인한다.

Get-AuthenticodeSignature C:\Windows\System32\audiodg.exe | Select-Object Status

audiodg 는 하나만 있고 부모가 Audiosrv 의 svchost 다. 같은 이름이 여러 개이거나 System32 밖에 있다면 정상이 아니다.

다음 편은 작업 관리자에서 사용자 이름이 "UMFD-0", "UMFD-1"처럼 보이는 fontdrvhost.exe 와, 장치 드라이버를 사용자 모드에서 돌리는 WUDFHost.exe 다.