Yocto

Yocto Shared State Cache 디버깅 하기

chbae 2024. 7. 31. 08:24
728x90

Yocto 프로젝트의 shared state cache (SSTATE)는 빌드 시스템의 빌드 속도와 효율성을 높이기 위해 사용하는 메커니즘이다. 이 캐시 시스템은 이전에 빌드된 결과물을 재사용할 수 있도록 하여, 매번 전체 빌드 과정을 다시 수행하지 않아도 되게 한다.

출처: https://engineering.mercari.com/en/blog/entry/20221215-16cdd59909/

 

위의 그림은 Bazel의 Remote cache에 대해 설명한 그림인데, Yocto의 Shared State Cache 또는 PREMIRROR 도 비슷하다. 원격의 공유할 수 있는 공간에 Cache를 담아 놓고 빌드할 때 접근해서 캐시를 사용한다. 캐시는 이미 빌드해 놓은 결과물로써 변경이 없으면 그대로 사용하여 빌드 속도를 향상시키는데 주 목적이 있다.

 

하지만 가끔 변경이 없거나 잘못된 의존성 등으로 인해서 Cache Hit이 되지 않아 소스 코드로부터 빌드를 다시 시작하는 경우가 있다. 그렇게 되면 또 그 컴포넌트의 의존성으로 인해서 다른 컴포넌트가 꼬리를 물고 빌드를 하게 되어 엄청난 빌드 시간이 소요 된다. 이 글에서는 어떻게 Yocto Shared State를 디버깅 하는지에 대한 방법에 대해서 간단히 설명하고자 한다.

디버깅 방법

1. 우선 전체적으로 cache hit ratio를 본다. 빌드를 시작할 때 파싱 후 아래 그림과 같이 sstate summary 항목에서 상황을 파악한다. 그리고 소스를 다운 받고 빌드를 하는 컴포넌트 목록을 추출해 낸다. (로그 파일에 보면 do_configure, do_compile 등의 태스크가 진행된 컴포넌트를 확인한다.)

 

2. 1번에서 확인된 컴포넌트 목록의 shared sstate cache가 있는지 확인을 한다. 캐시가 있는 디렉토리는 ${TOPDIR}/sstate-cache 디렉토리이고 find로 레시피 이름과 테스크 이름을 아래와 같이 조합하여 검색하면 된다.

 

Yocto 프로젝트에서 siginfo 파일은 빌드 시스템의 캐시 메커니즘과 관련이 있다. Yocto 프로젝트는 빌드 프로세스를 가속화하고 효율적으로 관리하기 위해 다양한 캐시 파일을 사용한다. siginfo 파일은 이러한 캐시 파일 중 하나로, 주로 다음과 같은 역할을 한다:

  • Signature Information 저장: siginfo 파일은 빌드 태스크의 서명을 저장한다. 이 서명은 태스크의 입력, 출력, 그리고 기타 관련 메타데이터를 기반으로 생성된 고유한 해시 값이다. 이를 통해 빌드 시스템은 어떤 태스크가 변경되었는지, 그리고 어떤 태스크를 다시 빌드해야 하는지를 결정할 수 있다.
  • 재사용 가능성 확인: 빌드 태스크가 이미 실행되었고, 그 결과가 캐시에 저장되어 있는 경우, 동일한 서명을 가진 태스크는 다시 실행할 필요 없이 캐시된 결과를 재사용할 수 있다. 이를 통해 빌드 시간을 크게 단축할 수 있다.
  • 빌드 디버깅 지원: siginfo 파일은 빌드 시스템이 빌드 프로세스의 흐름을 추적하고, 문제 발생 시 디버깅하는 데 도움을 준다. 서명 정보가 기록되어 있기 때문에, 어떤 태스크가 변경되었는지, 왜 다시 빌드되었는지를 쉽게 파악할 수 있다.

 

3. 문제가 발생한 레시피의 cache의 siginfo 파일을 가지고 디버깅을 하는데 Yocto에서는 bitbake-diffsigsbitbake-dumpsig 도구를 제공한다.

  • bitbake-diffsigs는 두 개의 서명 파일(.siginfo) 간의 차이점을 비교한다. 이를 통해 어떤 입력이나 환경 변수가 변경되어 빌드 태스크가 다시 실행되었는지 확인할 수 있다. 아래 그림에서는 curl compile task의 siginfo 파일을 비교하였고 do_configure의 hash값이 변경되어 다시 빌드되었다고 나온다. 이렇게 하나씩 추적하면 된다.

 

  • bitbake-dumpsig는 Yocto 프로젝트의 BitBake 도구에서 제공하는 유틸리티 중 하나로, 빌드 태스크의 서명(signature) 파일의 내용을 덤프하여 자세한 정보를 개발자가 보기 쉽게 디코딩하여 표시하는 데 사용된다. 이 유틸리티는 서명 파일이 포함하는 다양한 구성 요소를 분석하고 이해하는 데 도움을 준다.

정리

실제로 sstate-cache 디렉토리로 가서 관련 레시피의 siginfo (주로 prepare_recipe_sysroot 태스크)을 찾는다. preprare_recipe_sysroot를 찾는 이유는 많은 경우에 diffsigs를 보게 되면 영향을 주는 다른 레시피를  가리키기 때문이다. 이렇게 하나씩 추적하다보면 문제의 실마리가 나올때가 많다. 추가적으로 bibake -DDD 옵션을 줘서 빌드할 때 나오는 디버깅 정보를 조금 더 모아서 분석해 보는것도 방법이나 너무 많은 메시지가 나와서 실제 의미있는 데이터를 찾아내기가 어렵긴 한다.

추가 정보

Yocto 프로젝트에서 Shared State (SState)에서 해시 동시성을 보장하는 것은 매우 중요한 부분이다. 특히 빌드 환경에서 여러 스레드나 프로세스가 동시에 접근할 때 데이터의 일관성을 유지하는 것이 중요하다. 이를 위해 Yocto는 해시 동등성 (equivalent hash) 설정을 사용한다. 이 설정은 빌드 태스크의 해시 값이 변경되었을 때, 이를 효과적으로 관리하고 동시성을 보장하는 데 도움을 준다.

 

Hash Equivalence를 설정하여 여러 다른 환경에서 접근하여 cache를 사용할 때 해시 동시성을 보장할 수 있게 한다. https://summit.yoctoproject.org/yocto-project-summit-2023-11/talk/GZHZPA/ 첨부된 pdf를 한번 읽어보는 것을 추천한다. 이에 대한 자세한 내용은 추후 다른 글에서 다뤄볼까 생각중이다.