강좌 & 팁
글 수 2,412
2011.09.03 23:40:03 (*.138.143.120)
41415
distcc 이용하기
리눅스에서 머신에서 할수 있는 일은 참 많습니다.
그중에서도 개발에서 가장 기본적인 일은 에디터와 컴파일일 것입니다.
에디터는 터미널에서는 vi & emacs 가 자리 잡고 있고
gui 환경에서는 윈도우에서 사용되던 Ultraedit 까지도 사용되고 있습니다..
컴파일은 리눅스 머신에서 할수 있는 흥미로운 일중의 하나인데 간단한 응용프로그램이야 순식간에 빌드가 끝나지만
커널만 하더라도 몇분씩 걸리고 안드로이드 컴파일의 경우 몇시간까지도 걸리기도 합니다.
한번이야 그렇다 치지만 하루종일 커널 컴파일하면서 작업하는 사람에게는 30번만 컴파일을 돌려도
한두시간은 컴파일만 하게 됩니다..
그러면.... 한달이면 20시간이상을 컴파일만 하면서 보내는 결과를 가져옵니다.
그시간을 70-80%를 아낄수 있다면 당연히 투자를 해야 겠죠.
더군다나 일당이 비싼 개발자들에게는 컴파일 시간이 너무 아까운 시간이 됩니다.
경험상 잠깐 남는 컴파일 시간에 코딩을 하게 되면 컴파일 하던 코드의 결과와
현재 수정하고 있는 내용을 혼돈하는 경우까지 있습니다.
이제 컴파일을 빨리 할수 있는 방법을 찾아 보겠습니다.
쉽게 하기 위해서 커널 컴파일이라고 생각하고 진행합니다.(이후의 예에서도 모두 커널 컴파일을 시도하도록 합니다.)
커널 컴파일을 병렬로 처리하는 것은 'j' 옵션으로 컴파일을 하는 것입니다.
기본적으로 컴파일시에 아래와 같은 명령을 사용합니다.
root@boggle70-desktop:linux-2.6# pwd
/staff/boggle70/distcc/linux-2.6
root@boggle70-desktop:linux-2.6# make zImage
이것을 병렬컴파일하게 하는 방법은 아래와 같습니다.
root@boggle70-desktop:linux-2.6# pwd
/staff/boggle70/distcc/linux-2.6
root@boggle70-desktop:linux-2.6# make -j 5 zImage
옵션뒤에 붙는 숫자는 병렬로 진행할 프로세스의 갯수입니다.
보통 해당 머신의 cpu 갯수 * 1.2 정도가 최대치라고 합니다.
즉 cpu 가 4개짜리인 경우는 5,
8개짜리인 경우는 9-10 개 정도가 최대치이고 그 이상으로 늘려도 효과가 없다고 합니다.
주의할 점은 옵션뒤에 숫자를 붙이지 않으니까 프로세스를 계속 만들면서 시스템이 고갈되더군요.
한개의 머신에서 커널을 조금 빨리 컴파일 하기 위한 방법입니다.
그렇다면 두개이상의 머신에서 동시에 컴파일을 할수는 없을까요?
네 방법이 있습니다. distcc 라는 유틸리티를 사용하는 방법입니다.
해당 프로젝트는 http://code.google.com/p/distcc/ 에서 진행되고 있습니다.
대문에는 아래와 같이 소개하고 있습니다.
distcc: a fast, free distributed C/C++ compiler
커널에서 j 옵션으로 컴파일 하는 것은 오브젝트간의 의존성을 고려해서 의존성이 없는 경우
여러개의 프로세스로 나누어서 컴파일을 진행하는 것입니다.
당연히 두개이상의 머신에 데몬을 설치하고 네트워크로 데이타를 보내 컴파일하고 오브젝트 코드만을
호스트에서 받아서 링크를 거치면 항상 동일한 결과를 얻을수 있습니다.
실은 이것을 좀더 많은 분야에 응용해 보기 위해서, 실은 크로스 컴파일을 distcc 를 이용해서 하기 위해
테스트를 했었는데 잘 안되었었습니다.
이번에는 X86 기반에서 시도를 먼저 하고, 크로스 컴파일러를 이용한 distcc 를 세팅하는 과정을 시도하기로 했습니다.
많은 소개글에서 성공한 내용만을 소개하는데 저는 실패한 내용까지 모두 올려 보기로 하겠습니다.
몇군데 소개글이 있는 곳을 적어 봅니다.
http://www.ibm.com/developerworks/kr/library/l-distcc.html
http://www.gentoo.org/doc/en/cross-compiling-distcc.xml
첫번째 사이트는 소개와 x86 머신에서 진행하는 것을 보여주고 있고,
두번재는 크로스 컴파일을 하는 것을 소개하고 있습니다.
그럼 다음시간에...