작업 관리자에서 "search"로 시작하는 이름을 찾아보면 PC 마다 다른 결과가 나온다. 어떤 PC 는 SearchHost.exe, SearchIndexer.exe, SearchProtocolHost.exe, SearchFilterHost.exe 가 줄줄이 보이고, 어떤 PC 는 SearchHost 하나뿐이다. 내 PC 가 뒤쪽이었다. 색인 프로세스가 아예 없었다. 왜 그런지 따라가다 보니 두 프로세스의 차이가 오히려 잘 보였다.

SearchHost.exe: 검색 창을 그리는 앱

SearchHost 는 작업 표시줄의 검색 상자나 시작 메뉴에서 글자를 입력할 때 뜨는 검색 패널이다. 일반 프로그램처럼 사용자 세션에서 돈다.

Get-CimInstance Win32_Process -Filter "Name like 'Search%'" |
    Select-Object Name, ProcessId, ParentProcessId, CommandLine

확인한 시점에 SearchHost.exe 는 하나였고 경로는 C:\Windows\SystemApps\MicrosoftWindows.Client.CBS_cw5n1h2txyewy\SearchHost.exe 였다. System32 가 아니라 SystemApps 아래의 Windows 기본 앱 패키지 안에 있다. 파일은 57,856바이트로 작고, 서명은 Microsoft 로 유효했다. 명령줄에는 -ServerName:CortanaUI.AppX... 가 붙어 있었다. 예전 Cortana 시절의 이름이 아직 남아 있는 것으로 보인다.

부모는 DcomLaunch 서비스가 든 svchost.exe 였다. Runtime Broker 와 같은 부모다. 시작 시각은 로그인 2초 뒤인 20시 36분 05초였다. 검색 창을 누르기 전부터 미리 띄워 두는 셈이다. 개인 메모리 85MB, 작업 집합 21.7MB, 스레드 34개였고, 성능 카운터로 세 번 재는 동안 CPU 는 0%였다. 이틀 반 동안의 누적 CPU 시간은 50.7초였다.

SearchHost 의 화면은 웹 기술로 그린다. SearchHost 의 자식으로 msedgewebview2.exe 가 있었고, 명령줄에 --webview-exe-name=SearchHost.exe 가 붙은 WebView2 프로세스를 세어 보니 6개였다. 이 6개의 개인 메모리 합은 약 260MB 였다. 검색 창 하나에 SearchHost 본체보다 훨씬 많은 메모리가 WebView2 쪽에 잡혀 있는 것이다. WebView2 가 여러 개 뜨는 이유는 1시즌의 msedgewebview2.exe 편에 정리했다.

SearchIndexer.exe: 색인을 만드는 서비스

SearchIndexer.exe 는 Windows Search 서비스(서비스 이름 WSearch)의 실행 파일이다. svchost 에 묶이지 않고 자기 프로세스로 돈다. 정해 둔 위치의 파일 이름과 속성, 문서 내용, Outlook 메일 같은 것을 미리 읽어 색인 데이터베이스(기본 위치 C:\ProgramData\Microsoft\Search\Data)를 만든다. 탐색기 검색 상자에서 파일 내용으로 검색할 때 빨리 나오는 것이 이 색인 덕분이다.

실제 읽기는 보조 프로세스가 맡는다. SearchProtocolHost.exe 가 파일이나 메일함 같은 저장소에서 항목을 꺼내 오고, SearchFilterHost.exe 가 PDF·Office 문서 같은 파일 형식에서 글자를 뽑아낸다. 형식별 필터가 잘못되어도 서비스 본체가 죽지 않게 따로 띄우는 구조로 알려져 있다. 색인할 것이 없으면 둘은 내려가 있다.

이 PC 의 상태는 이랬다.

Get-CimInstance Win32_Service -Filter "Name='WSearch'" |
    Select-Object State, StartMode, DelayedAutoStart, PathName
항목 값
상태 Stopped
시작 유형 Disabled (사용 안 함)
지연된 시작 표시 True
실행 파일 C:\WINDOWS\system32\SearchIndexer.exe /Embedding
이 서비스에 기대는 서비스 workfolderssvc, WMPNetworkSvc

Windows 기본값은 "자동(지연된 시작)"으로 알려져 있다. 지연 시작 표시가 남아 있는 것으로 보아 원래 자동이었다가 시작 유형만 "사용 안 함"으로 바뀐 것으로 보인다. 시스템 로그가 남아 있는 9월 1일 이후로 이 서비스의 시작·중지·설정 변경 기록이 하나도 없었으니, 그보다 전에 바뀐 설정이다. 그래서 SearchIndexer 도, 보조 프로세스도 없었다.

파일 C:\Windows\System32\SearchIndexer.exe 자체는 그대로 있었다. 크기 1,134,592바이트, 설명 "Microsoft Windows Search 인덱서", 버전 7.0.26100.9949, 서명은 유효했다. 같은 이름이 다른 폴더에 있거나 서비스가 아닌 사용자 프로그램으로 떠 있다면 가짜를 의심할 일이다.

색인 중에 CPU·디스크가 높을 때

SearchIndexer 가 바쁜 시기는 대개 정해져 있다. Windows 를 새로 설치했거나 큰 업데이트 직후, 사진·문서 폴더에 파일을 대량으로 복사했을 때, Outlook 메일함을 새로 연결했을 때다. 이 PC 의 색인 범위 규칙에도 메일(mapi16://)과 OneNote 저장소가 포함 대상으로 들어 있었다. 색인기는 사용자가 PC 를 쓰는 동안에는 속도를 줄이는 것으로 알려져 있어서, 한동안 디스크가 바쁘다가 잦아드는 것이 보통이다.

며칠이 지나도 계속 높다면 두 가지를 본다. 하나는 색인 범위다. 이 PC 의 레지스트리에는 포함 규칙 8개, 제외 규칙 37개가 있었고, 파일 경로로 포함된 곳은 시작 메뉴 폴더 같은 몇 곳뿐이었다. 개발 폴더나 내려받기 폴더처럼 파일이 쉬지 않고 바뀌는 곳이 범위에 들어 있으면 색인이 끝나지 않는다. 범위는 설정 → 개인 정보 및 보안 → Windows 검색에서 "고급 인덱싱 옵션"을 열면 확인할 수 있고, 색인에서 뺄 폴더를 추가하는 항목도 같은 화면에 있다.

다른 하나는 특정 파일에서 걸리는 경우다. SearchFilterHost 가 계속 CPU 를 쓰고 있다면 어떤 형식의 필터가 큰 파일이나 깨진 파일을 붙잡고 있을 가능성이 있다. 응용 프로그램 로그에서 원본이 Microsoft-Windows-Search 인 경고를 보면 문제의 파일이나 저장소가 적혀 있는 것으로 알려져 있다. 고급 인덱싱 옵션의 "다시 작성"은 색인을 처음부터 다시 만드는 것이라 그동안 오히려 더 바빠진다. 원인을 찾은 뒤에 쓰는 편이 낫다.

색인을 끄면 생기는 일

검색해 보면 "SearchIndexer CPU 높음"의 해결책으로 서비스를 사용 안 함으로 바꾸라는 글이 많다. 이 PC 가 바로 그 상태였다. 그래도 SearchHost 는 정상으로 떠 있었고, 시작 메뉴의 앱·설정 이름 검색은 색인 없이도 되는 것으로 알려져 있다. 대신 파일 내용 검색과 Outlook 메일 검색은 색인에 기대기 때문에 느려지거나 결과가 줄어드는 것으로 알려져 있고, 이 서비스에 기대는 Work Folders 와 Windows Media Player 네트워크 공유 서비스도 쓸 수 없다. 얻는 것은 백그라운드 디스크 사용이 사라지는 것 하나다. 검색을 거의 쓰지 않는 PC 라면 견딜 만하지만, 범위를 줄이는 쪽이 먼저다.

SearchHost 는 반대로 끌 대상이 아니다. 끝내도 검색 창을 다시 열면 새로 뜨는 것으로 알려져 있다. CPU 를 계속 쓴다면 SearchHost 본체보다 그 뒤의 WebView2 나 웹 검색 결과 쪽 문제일 가능성이 크니, 세부 정보 탭에서 명령줄에 SearchHost.exe 가 든 msedgewebview2 쪽 CPU 를 같이 보는 편이 낫다.

다음 편은 시작 메뉴와 알림 센터, 이모지 패널을 맡는 StartMenuExperienceHost·ShellExperienceHost·TextInputHost·sihost.exe 다. 작업 관리자에 "일시 중단됨"으로 보이는 이유와 시작 메뉴가 안 열릴 때 볼 곳을 다룬다.