제품 소식

Android 성능 향상: 커널용 AutoFDO 소개

읽는 데 4분 소요
찰스 멍거의 프로필 보기
Yabin Cui 소프트웨어 엔지니어

저희는 Android LLVM 도구 모음팀입니다. Google의 최우선 과제 중 하나는 LLVM 생태계의 최적화 기법을 통해 Android 성능을 개선하는 것입니다. Google은 Android를 더 빠르고, 원활하고, 효율적으로 만들기 위한 방법을 끊임없이 모색하고 있습니다. 최적화 작업의 대부분은 사용자 공간에서 이루어지지만 커널은 시스템의 핵심으로 남아 있습니다. 오늘 Google은 Android 커널에 자동 피드백 기반 최적화 (AutoFDO)를 도입하여 사용자에게 상당한 성능 향상을 제공하는 방법을 공유하고자 합니다.

AutoFDO란 무엇인가요?

표준 소프트웨어 빌드 중에 컴파일러는 정적 코드 힌트를 기반으로 함수를 인라인할지, 조건부의 어느 분기를 사용할지 등 수천 가지의 작은 결정을 내립니다.이러한 휴리스틱은 유용하지만 실제 휴대전화 사용 중 코드 실행을 항상 정확하게 예측하지는 않습니다.

AutoFDO는 실제 실행 패턴을 사용하여 컴파일러를 안내함으로써 이를 변경합니다. 이러한 패턴은 실제 사용 중에 코드가 사용하는 가장 일반적인 명령어 실행 경로를 나타내며, CPU의 분기 기록을 기록하여 캡처됩니다. 이 데이터는 기기에서 수집할 수 있지만, 커널의 경우 인기 앱 상위 100개를 실행하는 것과 같은 대표적인 워크로드를 사용하여 실험실 환경에서 합성합니다. 샘플링 프로파일러를 사용하여 이 데이터를 캡처하고 코드의 어떤 부분이 '핫' (자주 사용됨)이고 어떤 부분이 '콜드'인지 식별합니다. 이러한 프로필로 커널을 다시 빌드하면 컴파일러는 실제 Android 워크로드에 맞게 훨씬 더 스마트한 최적화 결정을 내릴 수 있습니다.

이 최적화의 영향을 이해하려면 다음 주요 사실을 고려하세요.

  • Android에서 커널은 CPU 시간의 약 40% 를 차지합니다.
  • Google은 이미 AutoFDO를 사용하여 사용자 공간에서 네이티브 실행 파일과 라이브러리를 최적화하고 있으며, 이를 통해 콜드 앱 실행을 약 4% 개선하고 부팅 시간을 1% 단축했습니다.

실제 성능 향상

제어된 실험실 환경의 프로필을 활용하여 주요 Android 측정항목 전반에서 인상적인 개선이 이루어졌습니다. 이러한 프로필은 앱 크롤링 및 실행을 통해 수집되었으며 6.1, 6.6, 6.12 커널의 Pixel 기기에서 측정되었습니다.

가장 눈에 띄는 개선사항은 다음과 같습니다. 이러한 커널 버전의 AutoFDO 프로필에 관한 세부정보는 android16-6.12 및 android15-6.6 커널의 각 Android 커널 저장소에서 확인할 수 있습니다.

boosting_2.png

이는 단순한 이론적 수치가 아닙니다. 이를 통해 최종 사용자는 더 빠른 인터페이스, 더 빠른 앱 전환, 더 긴 배터리 수명, 전반적으로 더 반응성이 뛰어난 기기를 사용할 수 있습니다.

작동 방식: 파이프라인

Google의 배포 전략에는 프로필의 관련성을 유지하고 성능을 안정적으로 유지하기 위한 정교한 파이프라인이 포함됩니다.

boosting_3.png

1단계: 프로필 수집

Google은 내부 테스트 Fleet을 사용하여 사용자 공간 바이너리를 프로파일링하지만 일반 커널 이미지 (GKI)의 경우 제어된 실험실 환경으로 전환했습니다. 기기 출시 주기에서 프로파일링을 분리하면 배포된 커널 버전과 관계없이 유연하고 즉각적인 업데이트가 가능합니다. 중요한 점은 테스트를 통해 이 실험실 기반 데이터가 실제 차량에서 얻은 것과 비슷한 성능 향상을 제공한다는 것이 확인되었다는 것입니다.

  • 도구 및 환경: 최신 커널 이미지로 테스트 기기를 플래시하고 simpleperf를 사용하여 명령어 실행 스트림을 캡처합니다. 이 프로세스는 하드웨어 기능을 사용하여 분기 기록을 기록하며, 특히 Pixel 기기에서  ARM Embedded Trace Extension (ETE) 및 ARM Trace Buffer Extension (TRBE)을 활용합니다.
  • 워크로드: Android 앱 호환성 테스트 모음 (C-Suite)에서 가장 인기 있는 앱 100개를 사용하여 대표 워크로드를 구성합니다. 가장 정확한 데이터를 수집하기 위해 Google은 다음 사항에 중점을 둡니다.
    • 앱 실행: 가장 눈에 띄는 사용자 지연에 맞게 최적화
    • AI 기반 앱 크롤링: 연속적이고 진화하는 사용자 상호작용 시뮬레이션
    • 시스템 전반 모니터링: 포그라운드 앱 활동뿐만 아니라 중요한 백그라운드 워크로드 및 프로세스 간 통신도 캡처합니다.
  • 검증: 이 합성 워크로드는 Google 내부 Fleet에서 수집한 실행 패턴과 85% 유사합니다.
  • 타겟팅된 데이터: 이러한 테스트를 충분히 반복하여 가장 인기 있는 애플리케이션과의 실제 사용자 상호작용을 정확하게 나타내는 고품질 실행 패턴을 포착합니다. 또한 이 확장 가능한 프레임워크를 통해 추가 워크로드와 벤치마크를 원활하게 통합하여 적용 범위를 넓힐 수 있습니다.

2단계: 프로필 처리

원시 trace 데이터를 후처리하여 데이터가 정리되고 효과적이며 컴파일러에 사용할 수 있도록 합니다.

  • 집계: 여러 테스트 실행 및 기기의 데이터를 단일 시스템 뷰로 통합합니다.
  • 변환: 원시 트레이스를 AutoFDO 프로필 형식으로 변환하여 필요에 따라 원치 않는 기호를 필터링합니다.
  • 프로필 자르기: 프로필을 잘라 '콜드' 함수의 데이터를 삭제하여 표준 최적화를 사용할 수 있도록 합니다. 이렇게 하면 거의 사용되지 않는 코드의 회귀를 방지하고 바이너리 크기가 불필요하게 증가하는 것을 방지할 수 있습니다.

3단계: 프로필 테스트

배포 전에 프로필은 안정성 위험 없이 일관된 성능 향상을 제공하는지 확인하기 위해 엄격한 검증을 거칩니다.

  • 프로필 및 바이너리 분석: 새 프로필의 콘텐츠 (핫 함수, 샘플 수, 프로필 크기 포함)를 이전 버전과 엄격하게 비교합니다. 또한 프로필을 사용하여 새 커널 이미지를 빌드하고 바이너리를 분석하여 텍스트 섹션의 변경사항이 예상과 일치하는지 확인합니다.
  • 성능 확인: 새 커널 이미지에서 타겟팅된 벤치마크를 실행합니다. 이를 통해 이전 기준에서 설정한 성능 개선사항이 유지되는지 확인합니다.

지속적인 업데이트

코드는 시간이 지남에 따라 자연스럽게 '드리프트'되므로 정적 프로필은 결국 효과를 잃게 됩니다. 최적의 성능을 유지하기 위해 파이프라인을 지속적으로 실행하여 정기적인 업데이트를 진행합니다.

  • 정기 새로고침: 각 GKI 출시 전에 Android 커널 LTS 브랜치의 프로필을 새로고침하여 모든 빌드에 최신 프로필 데이터가 포함되도록 합니다.
  • 향후 확장: 현재 android16-6.12 및 android15-6.6 브랜치에 이러한 업데이트를 제공하고 있으며, 향후 출시될 android17-6.18와 같은 최신 GKI 버전으로 지원을 확대할 예정입니다.

안정성 보장

프로필 기반 최적화와 관련하여 자주 묻는 질문은 안정성 위험이 발생하는지 여부입니다. AutoFDO는 소스 코드의 로직을 변경하는 대신 함수 인라인 처리 및 코드 레이아웃과 같은 컴파일러 휴리스틱에 주로 영향을 미치므로 커널의 기능적 무결성을 유지합니다. 이 기술은 이미 대규모로 검증되었으며 수년 동안 Android 플랫폼 라이브러리, ChromeOS, Google의 자체 서버 인프라의 표준 최적화로 사용되었습니다.

일관된 동작을 보장하기 위해 '기본적으로 보수적' 전략을 적용합니다. 고화질 프로필에 캡처되지 않은 함수는 표준 컴파일러 메서드를 사용하여 최적화됩니다. 이렇게 하면 커널의 '콜드' 또는 거의 실행되지 않는 부분이 표준 빌드에서와 똑같이 작동하여 예외적인 경우에 성능 저하나 예기치 않은 동작이 발생하는 것을 방지할 수 있습니다.

향후 계획

현재 android16-6.12 및 android15-6.6 브랜치에 AutoFDO를 배포하고 있습니다. 초기 출시 이후에도 기술을 더욱 개선할 수 있는 몇 가지 유망한 방법이 있습니다.

  • 도달범위 확대: 현재 aarch64 지원을 넘어 최신 GKI 커널 버전과 추가 빌드 타겟에 AutoFDO 프로필을 배포할 예정입니다.
  • GKI 모듈 최적화: 현재 최적화는 기본 커널 바이너리 (vmlinux)에 중점을 두고 있습니다. AutoFDO를 GKI 모듈로 확장하면 커널 하위 시스템의 더 많은 부분에 성능 이점을 제공할 수 있습니다.
  • 공급업체 모듈 지원: 드라이버 개발 키트 (DDK)를 사용하여 빌드된 공급업체 모듈에 AutoFDO를 지원하는 데도 관심이 있습니다. 빌드 시스템 (Kleaf)과 프로파일링 도구 (simpleperf)에서 이미 지원되므로 공급업체는 이러한 최적화 기법을 특정 하드웨어 드라이버에 적용할 수 있습니다.
  • 더 광범위한 프로필 적용 범위: 더 광범위한 CUJ (중요한 사용자 여정)에서 프로필을 수집하여 최적화할 수 있습니다.

Android 커널에 AutoFDO를 도입함으로써 OS의 기반이 사용자의 일상적인 기기 사용 방식에 최적화되도록 보장합니다.

작성자:
계속 읽기