빌드 시간을 줄이기 위해서 최근 각광을 받고 있는 방법은.... 바로 분산 빌드이다.
형상관리 도구인 Git 도 바로 분산 형상관리인데...
여하튼 분산이 유행이다.
- distcc: a fast, free distributed C/C++ compiler
- https://code.google.com/p/distcc/
빌드를 나누어서 분산하여 수행을 한다라....
듣기만 해도 왠지 어려울 것 같고, 설정하기 힘들 것 같은데...
정작 해보면 의외로 쉽게 적용이 가능하다.
그런데, 실제 검증을 회사에서 진행을 해서리.... 스크린샷이 없습니다!
회사에서는 보안 이슈로 인하여, 스크린샷 같은 바이너리를 외부에 전송을 못한답니다.
아직 대출금이 많아서 회사에서 잘리면 안되기에..... ^^ 양해바랍니다!!!!!
(집에서 다시 하면 안되냐구요 ?! ㅋㅋ 지금 HDD 복구 프로젝트로 인하여 여건이 그닥 좋지가 않아서요...
네... 네... 맞습니다. 귀차니즘 때문에..... 흑흑.... 흑흑.....)
1. Server 설치
- distcc 에서는 Server와 Client가 필요하다.
- 빌드를 수행하는 놈이 Client가 되고,
- 빌드가 분산되어서 날라오는 것을 처리해주는 애들이 Server가 된다.
- 빌드를 실행하는 놈도 같이 빌드를 수행하면 좋으므로 Client이지만, Server도 된다.
$ sudo apt-get install distcc distccmon-gnome
- [ distcc ] 설치는 당연히 진행을 해야하는 것이고,
- 그래픽컬한 모니터링을 위해서 추가로 [ distccmon-gnome ]을 설치해주면 좋다.
$ sudo nano /etc/default/distcc
STARTDISTCC="true"
ALLOWEDNETS="111.111.111.111 222.222.222.222 127.0.0.1"
ALLOWEDNETS="111.111.111.111 222.222.222.222 127.0.0.1"
LISTENER = “Server 자신의 실제 IP, not 127.0.0.1”
- distcc를 사용하기 위해서는 기본값을 설정하는 부분이 있고, 실제 실행하는 스크립트가 있다.
- 기본 설정값을 명시하기 위해서 위와 같이 작성하면 된다.
- [ ALLOWEDNETS ] 값은 분산 빌드를 받아줄 IP를 명시하는 곳이다.
- 어디에서 요청받은 것인지에 따라서 선택적으로 분산 빌드를 실행하는 것이다.
- 경험적으로 보건데, 저 나열하는 순서를 기준으로 빌드를 할당하는 것으로 보인다.
- 그러므로 당연한 이야기이지만 자신의 PC가 성능이 괜찮으면 자신을 앞으로 놓는 것이 좋을 것이고.
- 자산의 PC 성능이 나뻐서 분산 빌드를 수행하는 것이라면 다른 서버를 앞에 위치하는 것이 좋다.
- [ LISTENER ] 부분은 실제 빌드를 수행하는 Client라면 그냥 "127.0.0.1"이라고 해줘도 되지만,
외부로부터의 빌드 요청을 받는 Server라면 자신의 실제 IP를 적어줘야 한다.
2. distcc PATH
- ccache와 유사한 방식으로 동작을 하는 distcc 이므로, ccache와 같은 방식으로 환경을 맞춰주자.
$ cd /srv/install/distcc/path
$ ln -s /usr/bin/distcc arm-generic-linux-gnueabi-c++
$ ln -s /usr/bin/distcc arm-generic-linux-gnueabi-cc
$ ln -s /usr/bin/distcc arm-generic-linux-gnueabi-g++
$ ln -s /usr/bin/distcc arm-generic-linux-gnueabi-gcc
$ ln -s /usr/bin/distcc arm-generic-linux-gnueabi-gcc-4.3.2
- distcc의 장점 중 하나는 Cross-compile 환경에서도 적용이 가능하다.
- 빌드 실행 환경만 맞춰주면 된다.
- 위의 예는 freescale 환경의 Cross-compiler 들의 동적링크를 distcc로 설정한 것이다.
- [ arm-generic-linux-gnueabi-g++ ]을 실행하려고 하면, 대신에 [ /usr/bin/distcc ]가 실행되도록 하면 된다.
- 위와 같이 설정한 것을 distcc에게도 알려줘야 한다.
$ sudo nano /etc/init.d/distcc
PATH=/srv/install/distcc/path:/컴파일러경로:$PATH
- 위와 같이 설정을 했다면 이제 실행하자.
$ sudo /etc/init.d/distcc start
3, execute
- 이제 분산 빌드가 필요한 어떤 소스코드를 빌드를 해보자.
$ export PATH=/srv/install/distcc/path:$PATH
$ export MAKE="make -j8"
$ make
$ export MAKE="make -j8"
$ make
- 이렇게 하면 끝이다.
- 그냥 자기가 알아서 적당히 분산해서 빌드해주고 결과를 만들어준다.
- make j 옵션의 숫자를 좀 크게 적어주면 된다.
- 여기에서는 로컬 PC의 core 갯수가 기준이 아니다. 분산으로 쪼개서 빌드를 수행할 기준이다.
- 지금 어떻게 빌드가 되고 있는지 보고 싶다면...
$ distccmon-text
$ distccmon-gnome
$ distccmon-gnome
- 텍스트로 보는 것 보다는 예쁜 화면으로 보는 것이 보기 좋다.
- 어떻게 분산되어서 빌드가 되는지를 막대기로 보여주는데...
- 빨간색으로 표시된 부분은 분산을 해서 빌드를 하려고 했는데,
에러가 나서 그냥 로컬에서 다시 빌드를 수행한다는 의미이다.
- 즉, 분산 시도가 에러가 나면 그냥 로컬에서 빌드룰 수행함으로써 결과물에는 지장이 없도록 해준다.
4. error
- 사정이 여의치 않아서 발생하는 error 들에 대해서 집중적으로 파고들지는 못했다.
- 우선, 빌드가 수행되다 보면, 아래와 같은 메시지가 나온다.
(dcc_mkdir) ERROR: mkdir '//.distcc' failed: Permission denied
- [ .distcc ] 파일을 생성해야하는데, 권한 문제가 발생해서 제대로 하지 못했다는 것인데...
- distcc는 자신의 실행 권한을 위해서 [ distccd ]라는 계정을 만들어서 활용한다.
- 계정도 빌드 실행 계정과 distcc 계정 간의 관계도 있고 뭐 복잡하고 하니 그냥 막 권한을 풀어주면 될 것 같은데,
- 권한 문제를 풀어줘도 다른 문제가 발생하는 등 여러 이슈가 있다.
- [ zeroconf ] 문제도 이어서 발생하는데, 이걸 사용하지 않는다라고 환경 설정을 해도 여전히 발생하곤 한다.
- 이게 ubuntu에 포함된 패키지의 버그인지 검증해보기 위해서 소스 설치해서 진행해보고....해야하는데...
- 귀차니즘이.... 그냥 막....
- 위에 명시한 에러가 발생을 해도 분산 빌드가 잘 실행이 된다.
- 나중에 직접 분산빌드를 수행할 일이 생기면, 이 부분에 대해서 추가로 검증을 해보기로 하고...
- 지금 이번에는 그냥 무시~~~!!!
5. 잡소리
- 회사에서 빌드가 약 500~600분 정도 소요되는 것이 있어서 빌드시간을 단축하고자 distcc를 적용해보았다.
- 그랬더니 약 40% 이상의 시간을 단축할 수 있었다!!!! 와우~!!!
- 그 외에도 몇 건의 빌드에 적용 검증을 해보았는데, 40~60% 정도의 이득을 볼 수 있었다.
- ccache의 경우에는 탁월한 빌드 시간 단축이 가능하지만,
- 최초 빌드 시에는 1~2% 정도의 시간이 오히려 증가한다라는 단점이 있다.
- 그래서, 자료들을 찾아보면 ccache와 distcc를 동시에 적용해서 사용하는 것을 추천하곤 한다.
- QT Library 빌드도 필요해서 distcc를 적용해보았는데, 많은 문제가 있어서 결국 제외를 했다.
- QMake 라는 것을 사용하기 때문에 발생하는 문제로 보이기는 하지만.... 심도있는 분석은 다음 기회에...
- QT의 경우에는 distcc의 pump mode라는 것을 적용하면 쓸만하다는 이야기가 있지만... 잘 안되었다.
- distcc가 최근 집중하는 것은 pump mode인 것 같다.
- 하지만, 개인적으로 아직은 안정적이지는 않은 것으로 보인다.
- pump 관련하여서는 추가적으로 검증 작업을 진행 후에 적용할 계획이다.
- 기본 mode에 비해서 엄청 많이 빠르다고 하는데.... 꼭 검증해봐서 적용할 수 있으면 좋겠다.
반응형
'OS > Ubuntu' 카테고리의 다른 글
Ubuntu apt-get proxy (0) | 2012.08.10 |
---|---|
Ubuntu 터미널 접속 화면 꾸미기(시스템 정보) (0) | 2012.08.07 |
우분투 버전 확인 (lsb_release -a) (0) | 2012.06.30 |
Ubuntu in PowerPC (Mac Mini - A1103) - Wireless (4) | 2012.06.17 |
Ubuntu in PowerPC (Mac Mini - A1103) - Install (0) | 2012.06.16 |