Linux

Ubuntu에서 분산 컴파일러 (ICECC) 설치 및 사용하기

Posted 2013. 07. 27 Updated 2017. 06. 02 Views 17818 Replies 0
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

리눅스 커널이나 부트로더 등과 같은 대규모 프로그램을 빌드할 때 분산 컴파일러(Distributed Compiler)를 사용하면 상당한 시간 단축 효과를 얻을 수 있습니다.

빌드 클러스터 내에서 스케쥴러 역할을 하는 한 대의 PC가 작업을 분배하고 취합하는 역할을 수행하며, 스케쥴러를 포함한 빌드 클러스터를 구성하는 PC들은 보통 동일 LAN 영역 내에 존재합니다.

가운데에서 스케쥴러 역할을 하는 PC는 대규모 빌드작업을 의존성(Dependency) 문제가 없도록 여러 개의 작은 빌드작업으로 나눠서 다른 PC에 분배하고, 빌드가 완료된 결과물을 받아서 취합한 뒤 작업을 요청한 PC로 되돌려 줍니다. 이 과정에서 스케쥴러 역할을 하는 PC도 빌드 작업에 참여시킬 수도 있습니다..

빌드 시간을 단축하는 가장 중요한 요소는 단연 CPU에서 동시에 처리하는 쓰레드(Thread)의 수입니다.. 요즘 출시되는 하이퍼쓰레딩(Hyper Threading)이라는 기술을 적용하여 하나의 코어당 복수의 쓰레드를 동시에 처리합니다. 근래에 나온 CPU의 경우 코어 수에 두 배를 하면 그게 곧 쓰레드의 수가 됩니다.

이러한 빌드 과정의 특성 때문에 성능이 별로 좋지 않은 PC들을 여러 대 연결하여 빌드 클러스터(Build Cluster)를 구성하더라도 상당한 시간 단축 효과를 볼 수 있습니다.

이번 글에서는 분산 컴파일러 솔루션 중 하나인 ICECC를 활용하여 빌드 클러스터(Build Cluster)를 구축하는 방법을 다루도록 하겠습니다. 이 글에서 설명되지 않은 상세한 내용은 다음 사이트에서 확인하실 수 있습니다.

https://github.com/icecc/icecream


사용 환경

빌드 클러스터를 구성하는 모든 PC는 같은 LAN 영역에 있어야 합니다. ICECC에서 LAN 영역에서 ICECC가 동작하고 있는 PC들을 자동으로 검색하여 분산 컴파일 환경을 구축해줍니다.

불가피하게 원격지에 떨어져 있거나, 서로 다른 네트워크에 있는 PC들로 빌드 클러스터를 구성해야 하는 경우, VPN 등을 활용하여 LAN 영역에 붙여 사용하면 됩니다.

ICECC에서는 환경설정을 통해 서로 다른 Name Space를 지정하여 복수의 빌드 클러스터를 구축하는 기능도 제공합니다. (icecc.conf에서 Domain을 지정하면 됩니다.)


지원 플랫폼

이 글을 쓰고 있는 현재 지원하는 플랫폼(OS)의 종류는 다음과 같습니다.

  • Linux
  • FreeBSD
  • DragonFlyBSD
  • OS X

기본적으로 분산 컴파일러를 사용하기 위해서는 Build Cluster상에 있는 PC들의 플랫폼(OS)과 아키텍쳐(32bit/64bit)가 일치해야만 합니다.

단, 별도의 추가 세팅을 통해 빌드 요청시 빌드 환경 정보를 함께 전달하도록 하여 Cross-Platform 분산 컴파일 환경을 구축할 수도 있습니다. (이 글에서는 다루지 않습니다.)


분산 컴파일러 ICECC 설치 및 설정


ICECC 설치

빌드 클러스터에 사용할 모든 PC에 다음 과정을 참조하여 ICECC를 설치하고 설정해 주도록 합니다. Repository에 이미 ICECC가 올라가 있으므로 다음 명령으로 간편하게 설치할 수 있습니다.

sudo apt-get install icecc


ICECC Monitor 설치

Monitor 프로그램은 GUI 환경에서 분산 컴파일 빌드 클러스터가 올바르게 동작하는지 여부를 모니터링하는 기능을 제공합니다. 이를 통해 현재 빌드 클러스터에 속한 PC들의 현황과 스케줄러 동작 여부, 작업 분배 상황 등을 실시간으로 확인할 수 있습니다.

sudo apt-get install icecc-monitor


환경설정 - 스케줄러 PC

빌드 클러스터에 속해 있는 PC중 한 대를 선택하여 스케쥴러로 지정해주도록 합니다.

스케쥴러로 사용할 PC의 /etc/default/icecc를 텍스트 에디터로 열고, 다음 설정을 수정합니다.

START_ICECC_SCHEDULER="true"

스케쥴러는 클러스터의 가운데에서 작업을 분배하고 취합하는 역할을 수행하며, 보통 클러스터에 속해 있는 PC들 중 가장 성능이 좋은 PC를 스케쥴러로 사용합니다.

하나의 빌드 클러스터에는 반드시 한 대의 PC가 스케쥴러로 지정되어 있어야 하며, 스케쥴러 PC가 꺼져있거나 올바르게 동작하지 않으면 전체 빌드 클러스터가 동작하지 않습니다.

[2015.11.09 추가] '/etc/default/icecc' 파일이 존재하지 않는 경우:

최신 버전의 ICECC에는 스케줄러로 지정하기 위한 설정 파일이 따로 존재하지 않으며, 대신 스케줄러 데몬 프로그램이 따로 분리되어 있습니다.

따라서, 위 파일이 존재하지 않는 경우 임의로 만들지 말고(소용 없습니다.), 다음과 같이 스케줄러로 사용할 PC에서 데몬 서비스를 시작해 주도록 합니다.

sudo service icecc-scheduler start

TIP: 스케줄러 PC에서 빌드는 수행하지 않으려면 스케줄러 PC에서 iceccd서비스를 stop시키면 됩니다. 이렇게 하면 스케줄러 PC는 빌드 스케줄링만 수행하고, 빌드 동작은 붙어있는 클러스터 PC들에서만 수행합니다.


환경설정 - 공통

텍스트 에디터로 /etc/icecc/icecc.conf 파일을 열어서 29번째 줄 근처를 다음과 같이 수정합니다.

#
# You can overwrite here the number of jobs to run in parallel. Per
# default this depends on the number of (virtual) CPUs installed.
#
# Note: a value of "0" is actually interpreted as "1", however it
# also sets ICECC_ALLOW_REMOTE="no".
#
# ICECC_MAX_JOBS=""
ICECC_MAX_JOBS="8"
 
#

로컬 PC에서 분산 컴파일에 사용할 쓰레드의 수(=Logical CPU Number)를 입력하면 되는데, 보통 하나의 CPU 코어에서 두 개의 쓰레드를 동시에 처리할 수 있으므로 (CPU 코어 수) × 2의 값을 입력하면 됩니다.

CPU에 몇 개의 코어가 있는지 잘 모르겠다면, 다음과 같이 lscpu 명령을 쳐 보면 알 수 있습니다. 단, 여기에 나타나는 값은 Logical CPU의 수이므로 이 값은 ICECC_MAX_JOBS에 그대로 입력해 주면 됩니다.

lscpu.png
▲ lscpu명령으로 CPU에서 지원하는 Physical Thread의 수를 알 수 있습니다.

TIP: 간혹 빌드를 하는 중에 다른 작업을 하기 힘든 경우가 있는데, 이 경우 ICECC_MAX_JOBS값을 1~2만큼 줄여서 입력하여 숨 쉴 틈(?)을 만들어 주도록 합니다.

[2015.11.09 추가] 클러스터 PC에서 스케줄러를 찾지 못하는 경우:

스케줄러가 VPN으로 붙인 네트워크에 존재하거나, 클러스터 PC와 스케줄러 PC사이에 방화벽이 존재하는 등의 문제로 인해 클러스터 PC에서 스케줄러 PC를 찾지 못하는 경우가 있습니다.

이 경우, 다음과 같이 /etc/icecc/icecc.conf파일의 ICECC_SCHEDULER_HOST에 스케줄러 PC의 주소를 지정해 주도록 합니다.

#
# If the daemon can't find the scheduler by broadcast (e.g. because
# of a firewall) you can specify it.
#
#ICECC_SCHEDULER_HOST=""
ICECC_SCHEDULER_HOST="192.168.0.10"


PATH 등록

~/.bashrc 파일의 맨 아래에 다음 줄을 추가하여 사용할 컴파일러들을 ICECC로 Redirection해 주도록 합니다. 이렇게 함으로써 기존 빌드 명령(gcc, make 등)을 그대로 사용하면서 분산 컴파일러를 사용할 수 있습니다.

export PATH="/usr/lib/icecc/bin:$PATH"

쉘을 다시 실행하고 'which gcc'명령을 실행했을 때 다음과 같이 '/usr/lib/icecc/bin/gcc'가 나타나면 올바르게 설정된 것입니다.

which_gcc.png


서비스 재시작

저장을 하고 서비스를 재시작합니다.

sudo service icecc restart

최신 버전의 ICECC는 'icecc'가 아닌, 'iceccd'로 입력해야 합니다.

sudo service iceccd restart

스케줄러 PC가 제대로 잡히지 않으면 이것도 재시작해 주도록 합니다.

sudo service icecc-scheduler restart


분산 컴파일러 ICECC 사용 방법

Make 명령을 활용하여 빌드를 수행할 때, 다음과 같이 뒤에 -j 옵션을 추가해 주도록 합니다.

make -j40

-j 옵션 뒤에 입력하는 값은 빌드에 사용할 최대 쓰레드의 수입니다. 즉, 빌드 클러스터에 있는 모든 PC의 Thread수의 총합을 입력하면 됩니다.

여기에 입력한 쓰레드 수가 항상 사용 가능한 쓰레드 수와 같을 필요는 없습니다. 빌드하는 소프트웨어의 규모에 따라 적절한 쓰레드 수를 지정해 주는 것이 가장 좋은 방법입니다.

분산 컴파일러가 정상 동작하는지 모니터링하고 싶다면, 위에서 설치한 ICECC Monitor를 사용하면 됩니다. 우분투 테스크바의 시작버튼을 누르고 입력창에 'icemon'을 검색하면 실행할 수 있습니다.

ICECC Monitor.png
▲ ICECC Monitor

모니터에는 다양한 View mode가 있는데, 위 그림은 [View]→[Mode]→[Star View] 를 선택한 경우입니다.

빌드를 시작하면 해당 PC에서 가운데 있는 스케쥴러로 점선이 발사됩니다. 발사되는 점선은 작업 요청을 의미하며, 실선은 요청이 들어온 작업을 분배하고 취합하는 과정을 나타냅니다.

스케줄러 서비스를 재시작한 경우, 간혹 모니터 프로그램를 다시 실행해줘야 하는 경우가 있습니다. 열심히 빌드가 잘 되고 있는데 모니터 프로그램에서 아무 반응이 없다면 모니터 프로그램을 다시 실행해 주도록 합니다.

여담이지만, 이걸로 규모가 좀 되는 빌드를 하다 보면, 어느덧 빌드 걸어놓고 이 창만 멍때리며 바라보고 있는 자신을 발견하기도 합니다. [...]