언리얼 엔진 특화 프로파일러, 언리얼 인사이트

| 2022-06-17

안녕하세요, 넷마블 TPM실 기술분석팀 박정욱입니다.

이전 글에서는 언리얼 인사이트로 클라이언트나 서버(데디케이티드 서버 포함)를 분석하기 앞서서 알아두면 좋은 간단한 내용을 살폈습니다. 이번 글에서는 실제로 언리얼 인사이트로 프로파일링하는 예시 과정을 공유합니다. (예시 파일이나 상황도 이전 글에서부터 이어집니다.)

프로파일링 파일 설정

프로파일링 파일 저장 설정은 언리얼 인사이트가 아닌, 데디케이티드 서버 실행 명령어에 붙여야 합니다. 수집기 역할에 대해서는 이전 글에서 수차례 이야기 했었던 만큼 이번에는 넘어가도록 하겠습니다.

로컬 기본 저장

로컬에서 실행한다면 언리얼 인사이트를 클라이언트나 서버(데디케이티드 서버 포함)보다 먼저 실행해두기만 하면 됩니다. 이땐, 프로파일링 파일 저장 경로와 파일명을 지정하지 않아도, 하단 패널에 있는 ‘Trace Store Directory’ 경로에 날짜와 시간 값을 조합한 파일명으로 자동 생성합니다. 언리얼 인사이트를 먼저 실행해야 한다는 순서만 잘 지키면, 별다른 설정 없이 곧바로 쓸 수 있습니다. (언리얼 인사이트 버전 업데이트에 맞춰 바뀔 수 있습니다. 본 글에서 참고한 언리얼 인사이트 버전은 ‘0.14’입니다.)

자동으로 생성된 프로파일링 파일

저장 경로와 파일명 지정

측정 옵션마다 다르게 파일 이름을 지정해 여러 파일이 섞여있을 때에도 가시적으로 쉽게 구분하고 싶거나 저장 위치를 바꾸려는 경우에는, 직접 옵션을 추가해서 저장 경로와 파일명을 정할 수 있습니다.

클라이언트나 서버(데디케이티드 서버)를 실행할 때 옵션으로 ‘-tracefile=’ 값을 넣으면, 해당 경로에 지정한 파일명으로 프로파일링 파일이 생성됩니다. 단, 확장자는 ‘.utrace’로 고정되므로 따로 입력하지 않으셔도 됩니다. 예시는 아래와 같습니다.

$ LE.exe -tracefile=D:\hello-netmarble

저장 경로와 파일명을 직접 입력해서 사용할 때 주의해야 점도 몇 가지 있습니다. 해당 경로에 이미 같은 이름인 파일이 있다면 덮어쓰기가 되지 않는다는 것, 저장 경로만 넣고 파일명을 넣지 않으면 파일명 없이 ‘.utrace’ 확장자만 있는 파일이 생성된다는 것, 저장 경로를 입력하지 않고 파일명만 입력한 경우에는 플랫폼이나 버전별로 다른 동작을 한다는 것입니다.

이 조건으로 인해, 저장 경로와 파일명을 이전과 똑같이 입력한 채로 다시 실행한다면 덮어쓰기가 되지 않으므로 프로파일링 파일을 생성하지 못합니다. 또한, 저장 경로나 파일명 중 하나라도 입력을 하지 않는다면 일관성 있는 실행 결과를 예측할 수 없습니다. 즉, 저장 경로와 파일명 둘 다를 옵션에 넣지 않으면 프로파일링 파일이 어디로 튈지 모르는 상황에 마주할 수밖에 없습니다.

이 옵션을 활용한다면, 최대한 저장 경로와 파일명을 모두 입력하면서 실행마다 파일명을 바꿔가며 쓰시기를 추천합니다.

원격 분석 설정

클라이언트나 서버(데디케이티드 서버 포함)를 실행하는 머신에서 언리얼 인사이트를 같이 실행하면, 머신의 컴퓨팅 리소스를 같이 소모합니다. 만약 클라이언트나 서버를 실행할 때 소모하는 리소스와 분석할 때 소모하는 리소스를 각각 분리하고 싶다면 원격 분석 설정을 활용하면 됩니다. 원격 분석 설정 옵션을 추가하면 동일한 네트워크에 있는 다른 머신에서 언리얼 인사이트를 실행할 수 있습니다.

통신 포트는 TCP 1980 포트를 활용하므로, 방화벽 설정 등으로 막혀있지 않은지 꼭 확인해야 합니다. 여기서 입력하는 IP 주소나 도메인은 언리얼 인사이트를 실행할 분석용 머신의 주소입니다.

$ LE.exe -tracehost=192.168.0.102

데이터 수집 및 분석하기

프로파일링 파일 설정 옵션을 활용한 수집 및 분석 방법은 총 3가지로 정리할 수 있습니다. 기본 동작 방법은 프로파일링 파일 설정 옵션만으로도 충분히 짐작하실 수 있습니다만, 어떻게든 ‘.utrace’ 파일을 생성한 후 언리얼 인사이트에서 불러오는 구조를 각 상황에 맞춰서 쓰면 됩니다.

  • 로컬 실시간 분석:
    로컬에서 클라이언트(혹은 서버) 실행 → 언리얼 인사이트로 파일을 감시 → 실시간 성능 측정
  • 원격 실시간 분석:
    언리얼 인사이트 실행 → 호스트(Host)로 연결할 분석 장비 IP 입력 → 원격지에서 클라이언트(혹은 서버) 실행 → 실시간 성능 측정
  • 선녹화 후분석:
    원격지에서 클라이언트(혹은 서버) 실행 → 생성한 프로파일링 파일을 검사할 머신으로 복사 → 언리얼 인사이트로 분석 → 녹화한 범위까지 성능 측정

로컬 실시간 분석

로컬 실시간 분석을 위해서는 클라이언트나 서버(데디케이티드 서버 포함)를 실행하기 앞서서, 언리얼 인사이트부터 먼저 실행해야 합니다. 언리얼 인사이트 패널 화면을 확인한 후, 프로파일링 옵션을 추가해서 클라이언트나 서버를 실행합니다. 로컬 분석이므로 ‘-tracefile’이나 ‘-tracehost’ 옵션은 사용하지 않습니다.

클라이언트나 서버를 구동하면, 언리얼 인사이트 최초 화면에 날짜와 시간으로 이름이 자동 생성된 항목을 볼 수 있습니다. 항목 설명 중 ‘Status’에 ‘LIVE’라는 표시와 함께, 파일 용량이 점차 증가하는 것을 볼 수 있습니다. 이 항목을 더블 클릭하면 실시간 프로파일링 화면으로 진입합니다.

로컬 실시간 분석 화면

원격 실시간 분석

원격 실시간 분석은 클라이언트나 서버(데디케이티드 서버 포함)를 실행하는 머신과 언리얼 인사이트를 실행하고 분석할 머신을 각각 따로 준비해야 합니다. 그리도 이들 사이는 네트워크로 연결돼 있어야 하며, 방화벽 설정에서 TCP 1980 포트가 열려있어야 합니다.

먼저 분석용 머신에 설치한 언리얼 인사이트를 실행합니다. 다음으로 테스트 대상 머신에서 ‘-tracehost=’ 옵션으로 분석할 머신의 IP 주소를 입력하고 클라이언트나 서버를 실행합니다. 이후 언리얼 인사이트 사용 과정은 로컬 실시간 분석 때와 동일합니다.

원격 실시간 분석

원격 실시간 분석할 때 생성되는 ‘.utrace’ 파일은 테스트 머신 로컬이 아닌, 언리얼 인사이트를 실행하는 분석용 머신에 저장됩니다. 그래서 원격 실시간 분석을 종료한 이후 다시 해당 파일을 찾아보려는 경우, 분석용 머신의 저장 공간에서 찾으셔야 합니다.

선녹화 후분석

로컬 실시간 분석과 원격 실시간 분석에서는 언리얼 인사이트를 동시에 실행했었습니다. 언리얼 인사이트를 동시에 실행하지 않고 ‘.utrace’ 파일만 먼저 생성한 뒤, 언리얼 인사이트를 나중에 따로 실행해서 분석하는 방법이 ‘선녹화 후분석’ 방법입니다. 클라이언트나 서버(데디케이티드 서버 포함)를 실행할 때 ‘-tracefile’ 옵션을 사용하면 언리얼 인사이트를 동시에 실행하지 않고도 프로파일링 파일을 생성할 수 있다는 점을 활용하면 됩니다.

‘-tracefile’ 옵션으로 언리얼 인사이트 없이 프로파일링 파일 생성

위 이미지에서 선녹화로 생성하는 ‘hello.utrace’ 파일의 크기가 ‘0’으로 보입니다만, 녹화를 종료하면 실제 파일 용량으로 늘어납니다. 선녹화를 마친 ‘hello.utrace’ 파일은 언리얼 인사이트가 설치된 머신이라면 어디든지 복사해서 열 수 있습니다. 언리얼 인사이트의 분석 화면은 동시에 여러 화면을 띄울 수도 있으므로, 녹화한 파일 여러 개를 동시에 열어두고 비교할 수 있습니다.

동시에 서로 다른 파일을 열어서 비교하는 화면

언리얼 인사이트 분석 내용 보기

프로파일링 파일 준비 마쳤습니다. 이제 언리얼 인사이트 분석 화면으로 세부 내용을 살펴볼 순서입니다. 여기서는 크게 타이밍 인사이트(Timing Insights) 탭과 네트워킹 인사이트(Networking Insights) 탭을 구분해서 봐야 합니다.

타이밍 인사이트

타이밍 인사이트(Timing Insights) 탭에서는 주로 타이밍(Timing) 패널, 콜러(Callers) 패널, 콜리(Callees) 패널을 분석하게 됩니다.

타이밍 패널은 1프레임(Frame)에서 호출한 함수(이벤트)를 시각화해서 보여주는 영역으로, 각각 목록별 소요 시간을 볼 수 있습니다. 콜러와 콜리 패널은 실제 스택의 관계까지 고려해 소요한 시간을 보여주는 차트입니다. 타이밍 패널이나 타이머(Timers) 패널에서 분석하려는 함수를 클릭하면 볼 수 있습니다.

타이밍 패널에서 프레임을 선택해 나타난 콜러와 콜리 내용

특히, ‘FEngineLoop’ 함수는 목표 FPS에 맞춰서 데디케이티드 서버가 수행하는 루프 함수입니다. 여기서 프레임타임(FrameTime)은 실제 로직을 돌릴 때 CPU를 점유한 시간이므로, 가장 높은 비중을 차지하는 영역은 주요 최적화 포인트라 할 수 있습니다.

네트워킹 인사이트

네트워킹 인사이트(Networking Insights) 탭은 네트워크 프로파일링 데이터를 시각화해서 볼 수 있습니다. 각 클라이언트별로 패킷 인입 수치가 나와 있습니다. 네트워킹 인사이트 기능 자체가 아직 실험 단계이므로, 이점 고려해서 사용하시길 추천합니다.

네트워킹 인사이트 예시 화면

네트워킹 인사이트 탭에서는 네트워크 발생량 추이를 보면서, 게임 인스턴스나 세션에서 특이사항은 없는지 패킷 이름별로 살펴볼 수 있습니다.

그 외

타이밍 인사이트와 네트워킹 인사이트 외에도, 메모리 인사이트(Memory Insights)나 애셋 로딩 인사이트(Asset Loading Insights) 등도 있습니다. 메모리 인사이트는 공식 문서상 언리얼 엔진 5버전부터 정식 지원해주는 것으로 보이며, 애셋 로딩 인사이트는 클라이언트 영역이므로 이번 글에서는 생략하겠습니다.

적당한 분석 방법을 고르자

여기까지가 언리얼 인사이트를 활용하기 위해, 프로파일링 파일을 만들어서 데이터를 살펴보는 내용이었습니다. 

분석 방법 중에서 베스트 케이스는 ‘원격 실시간 분석’으로 보입니다. 로컬 실시간 분석의 경우, 언리얼 인사이트를 같이 실행하기 때문에 리소스 점유가 발생해 충분한 지표 측정을 방해할 여지가 있습니다. 또한 게임 서버로 쓰는 머신에서 언리얼 인사이트를 배포하기 위한 수고로움도 더해지는 만큼, 로컬 개발 시에 간단히 테스트하는 용도로 활용하시기를 추천합니다. (선녹화 후분석 방법에서도 녹화 시 지표 수집과 파일 생성을 하기 때문에 일부 오버헤드가 발생할 수 있습니다.)

하지만 각 방법마다 특징과 장단점이 있었던 만큼, 무조건 원격 실시간 분석을 고집하지는 않으셔도 됩니다. 각자 개발 환경이 다르듯이, 분석을 위한 조건과 개발 여건으로 갖춘 상황은 다를 수밖에 없습니다. 각자에게 맞는 적절한 분석 방법을 선택하셔서, 오늘도 이른 퇴근에 성공하시길 빌겠습니다.