Yocto

Yocto 빌드 속도 개선 작업

chbae 2023. 10. 1. 06:07
728x90

요즘 내부 핫 토픽 중 하나는 Yocto 기반의 리눅스 Subsystem의 빌드 성능 향상 작업이다. 여러가지 원인으로 인해 성능이 좋은 AWS EC2 Instance를 사용해도 빌드 속도가 엄청나게 오래 걸린다. 물론 지금 모든 이야기는 shared state cache를 사용하지 않고 측청한 결과를 이야기한다. 

 

 

Yocto 공식 Wiki에서 빌드 성능을 향상시키기 위해 Build 서버에서 다음과 같이 설정하라고 가이드 한다.

  • Put the build directory on its own disk. This is good practice in its own right since the build system has a tendency to wear disks heavily.
  • Use the ext4 filesystem for the build disk
  • Turn off journaling for ext4 ("tune2fs -O ^has_journal <disk>")
  • Mount using the options "noatime,barrier=0,commit=6000"
  • Use a tmpfs for /tmp

 

https://docs.yoctoproject.org/dev/dev-manual/speeding-up-build.html 에 보면 추가적인 가이드를 준다.

  • rm_work 사용
  • 사용하지 않는 DISTRO_FEATURES 제거
  • 필요 없으면 debug symbol과 debug 정보 생성 안함 (INHIBIT_PACKAGE_DEBUG_SPLIT 1로 설정)
  • autoconf 또는 libtool 사용하는 레시피의 정적 라이브러리 생성 비활성화. 아래 예제 참고

 

STATICLIBCONF = "--disable-static"
STATICLIBCONF:sqlite3-native = ""
EXTRA_OECONF += "${STATICLIBCONF}"

 

위의 내용들은 Yocto 공식 문서들에 나와 있는 것들이고 추가적으로 아래 내용들도 고려해볼만 하다.

  • clang으로 툴체인 변경. 또는 linker만이라도 변경
  • LTO (Linker Time Optimization) 적용 -> Linking 할 때 시간이 엄청 오래 걸릴 경우 유용하다.
  • AWS Instance Type 변경 (이전 글 참고)
  • Yocto의 Parallel 빌드 옵션 변경하면서 테스트
  • Yocto 레시피 의존성 제대로 확인하여 DEPENDS 설정
  • ccache 적용 -> 한벌의 ccache를 가지고 있어야 유용하다. 필자의 회사에서도 테스트 중에 있다.
  • Yocto 최신 버전으로 유지 -> 전 직장 동료가 dunfell에서 kirkstone으로 올렸는데 sstate cache 성능이 향상되었다고 한다.

 

물론 가장 중요한 것중 하나는 각 컴포넌트 개발팀이 최적화 하는 것이다. 경우에 따라서 아키텍처적으로 변경도 필요하고 Yocto의 철학을 잘 이해하고 레시피를 설계하는 것도 좋을 수 있다. 예를 들어 configuration 파일을 따로 레시피로 놓는다던지 말이다. configuration 파일은 빌드에 영향을 미치는 경우가 거의 없는데 Yocto에서는 어떤 것을 수정하던 간에 변경이 있다고 생각하고 의존성 있는 다른 컴포넌트를 다 빌드하기 때문이다.

 

경우에 따라서는 icecc (https://github.com/icecc/icecream) 분산 컴파일러를 적용해보는 것도 방법이고 상용으로는 incredibuild 솔루션도 있다. incredibuild PoC를 진행했는데 일단 엄청난 Core를 써서 성능이 좋아지는 것까지만 확인했다.

 

그 외에도 CI를 사용하면 Yocto 빌드에서 향상 시킬 수 있는 방법 외에도 빌드를 준비하는 전후 단계의 시간도 측정해 개선할 수 있는 포인트가 있으면 개선하는 것도 좋다. 예를 들어 meta layer를 내부에 mirror 해놓고 쓴다던지 최종 이미지 복사하는데 필요한 시간을 단축하기 위해 압축을 하거나 등등 나름 이쪽에서도 개선 포인트가 있다.

 

모든 것은 프로젝트에 따라 달라지지만 일반적으로 해볼만한 가치가 있는 것들을 하나씩 해보면 좋을 것 같다. ccache 는 동료가 열심히 진행중인데 의미있는 결과가 나오면 간단히 블로그 글을 써서 공유할 예정이다.