빌드 캐시 활용
빌드 캐시는 Yocto 프로젝트에서 효율적으로 빌드를 최적화하고 시간과 자원을 절약하기 위해 매우 중요한 개념이다. Yocto 빌드 시스템은 빌드 아티팩트를 재사용하여 동일한 코드 변경에 대해 중복된 빌드를 피할 수 있도록 다양한 캐시 메커니즘을 제공한다. 이를 통해 빌드 시간을 단축하고 개발 주기를 가속화할 수 있다.
sstate 캐시
Yocto는 sstate 캐시(shared state 캐시)를 사용하여 이전에 빌드된 결과물을 재사용한다. 이 캐시는 빌드된 구성 요소들의 상태를 저장하여 동일한 구성 요소가 다시 빌드될 때 캐시된 결과물을 재활용할 수 있게 한다.
sstate 캐시의 주요 이점
- 속도 향상: 이미 빌드된 컴포넌트를 다시 빌드할 필요가 없으므로 빌드 시간이 크게 단축된다.
- 일관성 보장: 동일한 소스 코드와 설정으로 빌드할 때 항상 동일한 결과를 얻을 수 있다.
- 디스크 공간 절약: 필요한 경우 sstate 캐시의 항목을 삭제하거나 정리하여 디스크 공간을 효율적으로 사용할 수 있다.
sstate 캐시 설정
sstate 캐시는 conf/local.conf
파일 내에서 설정된다.
SSTATE_DIR ?= "/path/to/sstate-cache"
이 디렉토리는 Yocto 빌드 시스템의 데이터나 빌드된 아티팩트를 사용할 수 있는 성능 최적화된 공유 상태 디렉터리(sstate)를 포함한다.
ccache
ccache는 C/C++ 컴파일러를 위한 캐싱 시스템으로, 동일한 컴파일 명령을 요청받을 때 이전 컴파일 결과를 재사용함으로써 컴파일 시간을 단축한다.
ccache 설정
ccache를 사용하기 위해서는 Yocto의 설정 파일(conf/local.conf
)에 다음과 같이 설정할 수 있다:
INHERIT += "ccache"
CCACHE_DIR = "/path/to/ccache"
디스크 I/O 최적화
디스크 I/O는 빌드 시간에 큰 영향을 미칠 수 있는 요인 중 하나이다. Yocto는 데이터를 많이 읽고 쓰기 때문에 빠른 디스크나 로컬 SSD를 사용하는 것이 좋다.
tmpfs 사용
임시 파일 시스템(tmpfs)을 빌드 디렉토리로 사용하면 디스크 I/O 병목을 줄일 수 있다.
TMPDIR = "/path/to/tmpfs"
이렇게 설정하면 빌드 중 생성되는 임시 파일이 RAM 디스크에 저장되어 빠른 접근이 가능한다.
Parallelism
병렬 빌드를 통해 빌드 시간을 더욱 단축할 수 있다. Yocto는 기본적으로 병렬 빌드를 지원하며, CPU 코어 수에 따라 병렬 작업을 수행할 수 있다.
병렬 빌드 설정
conf/local.conf
파일에서 다음과 같은 설정을 통해 병렬 빌드의 수준을 조절할 수 있다:
BB_NUMBER_THREADS ?= "number_of_cores"
PARALLEL_MAKE ?= "-j number_of_cores"
이 설정은 Yocto 빌드 시스템과 Makefile이 병렬로 작업을 수행하도록 한다.
네트워크 캐시 활용
Yocto 프로젝트에서 네트워크를 통해 추가적인 캐시 옵션을 활용할 수도 있다. 예를 들어, PREMIRRORS
나 MIRRORS
옵션을 사용하여 소스 파일을 다운로드할 때 네트워크 캐시를 이용할 수 있다.
PREMIRRORS 설정
PREMIRRORS
는 소스 파일을 다운로드하기 전에 검토할 미러 목록을 정의한다. 이를 통해 원격 서버에서 소스를 다운로드하기 전에 보다 가까운 미러에서 소스를 다운로드할 수 있다.
PREMIRRORS = "\
git://.*/.* file:///path/to/local/mirror/ \n \
"
MIRRORS 설정
MIRRORS
옵션은 소스를 가져오지 못했을 때 대체할 미러 목록을 정의하는 데 사용된다. 이는 소스가 지정된 원본 위치에서 사용할 수 없을 때 유용하다.
MIRRORS = "\
git://.*/.* http://backupmirror.org/sources/ \n \
"
기타 최적화 기법
PACKAGE_CLASSES 설정
Yocto 프로젝트에서 생성하는 패키지 유형을 조정하여 빌드 시간을 줄일 수 있다. 예를 들어, deb
대신 ipk
패키지를 사용하면 보다 빠른 패키지 빌드가 가능한다.
PACKAGE_CLASSES ?= "package_ipk"
빌드 타입 지정
빌드 유형을 지정하는 것도 중요한 최적화 요소이다. 개발 중 빠른 빌드를 위해 디버그 정보를 포함하지 않는 -O2
최적화를 사용할 수 있다.
DEBUG_BUILD = "0"
INHERIT 옵션
기본적으로 Yocto는 특정 기능을 추가하는 많은 클래스 파일을 inherit
한다. 필요 없는 기능을 제거하면 빌드가 최적화될 수 있다.
INHERIT_remove = "rm_work"
BitBake 캐시
BitBake는 메타데이터를 캐시한다. 이 캐시는 파일 시스템의 $HOME/.bitbake
디렉토리에 저장된다. 캐시가 없거나 오래된 경우, BitBake는 재구성을 시도하므로 최신 상황을 유지하는 것이 중요하다.
TUNE_FEATURES 설정
프로세서 아키텍처에 맞춘 최적화도 매우 중요하다. TUNE_FEATURES
변수를 사용하여 특정 하드웨어 최적화를 설정할 수 있다.
TUNE_FEATURES = "arm armv7a"
외장 스크립트 사용
외장 빌드 스크립트를 사용하면 빌드 프로세스를 더 세밀하게 제어하고 특정 작업을 병렬 처리할 수 있다.
bitbake -c clean myimage
bitbake myimage
스크립트를 실행하여 전체 빌드 프로세스를 최적화할 수 있다.
Yocto 프로젝트의 성능을 최적화하기 위해서는 다양한 캐시 메커니즘(sstate, ccache 등)을 활용하고, 디스크 I/O와 네트워크 설정을 최적화하며, 병렬 빌드 옵션을 적절히 조정하는 것이 중요하다. 이를 통해 빌드 시간을 줄이고, 자원을 효율적으로 활용할 수 있다. Yocto의 설정 파일인 local.conf
파일을 적절하게 구성하여 이러한 최적화 옵션을 적용하면 개발의 생산성을 크게 향상시킬 수 있다.