Boinc 은 과학 프로젝트를 위한 그리드 컴퓨팅 프로그램입니다. SETI 프로젝트로 유명하죠.
Boinc 의 시작은 SETI@home 으로 SETI 프로젝트에서 관측한 어마어마한 양의 데이터를 처리하기 버거워서 이를 자신들이 소유한 슈퍼컴퓨터가 아닌 수많은 자원봉사자들의 컴퓨터를 묶어서 분산 컴퓨팅을 하기 위해 개발되었습니다.
이후 이 분산 컴퓨팅 시스템을 활용하고 싶어하는 많은 학자들의 요구를 수용하고, 보안성을 높이며, 자원봉사자들의 참여도를 높이기 위해 Boinc 을 개발했고, Boinc 는 현재 수백만명의 참여자를 가지고 세계 슈퍼컴퓨터 순위 5위권 안에 드는 엄청난 계산 능력을 보여 주고 있습니다.
Boinc 의 작동 방식은 간단합니다.
- Boinc을 설치하고
- 컴퓨팅 환경 설정을 하고
- 참여하고 싶은 프로젝트에 가입한 다음
- Boinc 클라이언트에서 프로젝트를 추가하면
- Boinc 클라이언트에서 에서 설정한 대로 연산(태스크)을 수행합니다.
- 연산을 다 끝내면 연산 결과를 프로젝트 서버로 보내고
- 계산이 정상적으로 잘 되었을 경우 크래딧을 받습니다.
CPU나 램, 디스크 등을 얼마나 사용할지 세부적으로 설정할 수 있기 때문에 성능에 미치는 영향이 적습니다.
NAS 는 24시간 동작하니 이런 그리드 컴퓨팅을 하기에 안성맞춤입니다.
그럼 설치해보도록 하겠습니다.
환경 구성하기
리눅스 에뮬레이션
Boinc 는 FreeBSD 를 지원합니다. pkg로 간편하게 설치할 수 있지요. 그런데 문제가 있습니다. 많은 수의 프로젝트들이 FreeBSD 를 지원하지 않는다는 것입니다.
사실 당연한 이야기인것이, FreeBSD 보다 리눅스나 윈도우 사용자가 더 많으니 프로젝트 개발자 입장에서는 어쩔 수 없는 선택일 것이기 때문입니다.
하지만 리눅스 프로젝트를 돌리지 못하는 것은 아닙니다. FreeBSD 는 리눅스 운영 체제와 바이너리 호환성을 제공하는데, 이를 리눅스 애뮬레이션이라 합니다. 말 그대로 리눅스 환경을 애뮬레이트 하는 거죠. 리눅스도 unix-like os 이다 보니 FreeBSD 와 구조가 비슷해 크게 부담이 가지 않고, 호환성 문제가 별로 발생하지 않습니다. 심지어 리눅스에서보다 더 빠른 경우도 있다고 합니다.
커널 로드
호스트에서 실행해야 합니다.
kldload linux
kldload linux64
sysctl kern.elf32.fallback_brand=3
리눅스 호환성을 로드해 준 것입니다.
시작 스크립트 등록
재부팅 시에도 자동으로 커널 모듈이 로드되도록 WebUI 의 Tasks – Init/Shutdown Scripts 로 이동해서 명령어를 등록합니다.
Type 은 Command
Command 에는 kldload linux
When 에는 Post Init
Enabled 가 활성화되어 있는지 확인하고
SAVE 를 눌러 저장합니다.
같은 방법으로 kldload linux64 도 추가합니다.
FreeNAS 가 시작될 때 마다 리눅스 호환성 모듈을 로드하도록 설정한 것입니다.
환경 변수 추가
System – Tunables 로 이동해서 값을 추가합니다.
Variable 은 kern.elf32.fallback_brand
Value 는 3
Type 은 sysctl
Enabled 가 활성화되어 있는지 확인한 후
SAVE 를 눌러 저장합니다.
Jail 만들기
고급 설정에서 만들어야 합니다.
Jail 의 이름은 Boinc
네트워크는 Vnet
Auto-Start 설정
Custom Preperties 에서 mount_linprocfs 체크
이 부분이 중요합니다. 리눅스 시스템을 로드한 것입니다.
필요한 패키지 설치
iocage console Boinc
레포를 최신으로 바꿔 준 다음
pkg install linux-c7 boinc-client boinc-setiathome portupgrade
linux-c7 은 centos 7 호환성 패키지입니다. linux-c7 을 설치하면 centos 7 환경을 에뮬레이션 합니다.
boinc-setiathome 은 가장 유명한 boinc 프로젝트인 seti 프로젝트를 위한 패키지입니다. seti 는 FreeBSD 태스크가 있으니, 리눅스 태스크가 아니라 FreeBSD 태스크를 받아 오게 설정함으로서 좀더 효율적으로 연산을 할 수 있게 합니다. SETI@Home 프로젝트에 참가하지 않는다면 이 패키지는 설치하지 않아도 됩니다.
Boinc 컴파일
패키지로 설치할 경우 리눅스용 프로젝트를 실행할 수 없습니다. 리눅스 프로젝트를 실행하기 위해선 Boinc 을 리눅스 프로젝트를 받아들일 수 있게 컴파일 해야 합니다. FreeBSD 용 프로젝트보다 리눅스 프로젝트가 훨씬 많기 때문에 리눅스 프로젝트를 실행할 수 있도록 컴파일 해 주는 것이 좋습니다.
portsnap auto
포트 트리를 받아 주고
cd /usr/port/net/boinc-client/
make config
boinc-client 의 컴파일 옵션에서
LINUX Accept Linux science applications 체크
X11 Build graphics API 체크 해제
으로 컴파일 옵션을 설정해 줍니다.
pkg remove boinc-client
패키지로 설치한 boinc 을 제거한 다음
make install clean BATCH="YES"
boinc 를 설치해 줍니다.
pkg lock boinc-client
pkg 가 boinc 를 수정할 수 없도록 잠급니다.
우선순위 문제
현재 시점 기준으로 Boinc 시작 스크립트를 열어 보면
#!/bin/sh # # $FreeBSD: head/net/boinc-client/files/boinc-client.in 458988 2018-01-14 18:29:19Z ler $ # # PROVIDE: boinc-client # REQUIRE: LOGIN networking # KEYWORD: nostart shutdown # # Add the following lines to /etc/rc.conf to enable the BOINC client: # # boinc_client_enable (boolean) Set to "YES" to enable boinc_client # (default is "NO"). # boinc_client_flags (string) Additional flags for boinc_client. . /etc/rc.subr name="boinc_client" rcvar=boinc_client_enable load_rc_config ${name} : ${boinc_client_enable="NO"} command="/usr/local/bin/boinc_client" pidfile="/var/run/${name}.pid" boinc_client_user=boinc command_args="--redirectio --dir /var/db/boinc" start_cmd=boinc_client_start stop_postcmd=boinc_client_poststop boinc_client_start() { local pid pid=$(check_pidfile "${pidfile}" "${command}") if [ -n "${pid}" ]; then echo 1>&2 "${name} already running? (pid=${pid})." return 1 fi echo "Starting ${name}." idprio 31 daemon -u ${boinc_client_user} -p ${pidfile} -f ${command} ${boinc_client_flags} ${command_args} || return 1 } boinc_client_poststop() { rm -f "${pidfile}" } run_rc_command "$1"
앞서 보아 왔던 시작 스크립트랑은 조금 다릅니다. 눈에 띄는 부분이 보이는군요.
idprio 31 daemon -u ${boinc_client_user} -p ${pidfile} -f ${command} ${boinc_client_flags} ${command_args} || return 1
idprio 31 이게 뭘까요?
idprio 명령어는 리얼 타임 프로세스 스케쥴링 명령어로서 nice 명령어 보다 더 낮은 우선순위로 프로그램을 실행할 수 있게 해 줍니다. boinc 시작 스크립트는 boinc 를 idprio 31 으로 실행하는데, boinc 가 최저 리얼타임 우선순위로 동작하게 설정합니다.
간단하게 말해서 nice 로 설정할 수 있는 우선순위보다 더 낮은 시스템상 최하위 우선 순위로 동작하게 한다는 의미입니다. (nice 20 의 경우 우선순위 52, idprio 31 의 경우 우선순위 155). 이렇게 하면 최하위 우선 순위로 동작하기 때문에 Boinc 연산이 다른 프로그램의 실행에 영향을 끼치지 않습니다.
그런데, idprio 명령어는 감옥 안에서 사용할 수 없습니다. 사용하려고 하면 아래와 같은 오류가 납니다.
idprio: RTP_SET: Operation not permitted
권한이 없답니다. root 로 실행해도 똑같습니다.
이유는 idprio 는 권한 있는 사용자 (호스트의 경우 root) 만이 사용 가능한데, 감옥 안에 있는 root 를 포함한 모든 유저는 ‘권한 없는’ 사용자이기 때문입니다.
이를 해결하기 위한 방법에는 3가지가 있습니다.
- host 에서 sysctl security.bsd.unprivileged_idprio=1 명령어를 통해 권한 없는 유저가 idprio 명령어를 사용할 수 있게 하는 것입니다. 간단하지만 위험하죠.
- idprio 명령 대신 nice 명령을 사용하는 것입니다. nice 명령어는 감옥 안에서도 사용이 가능하니 nice -n 20 으로 최하위는 아니지만, 낮은 우선순위로 실행할 수 있습니다. 단, 이 경우에는 같은 우선순위를 가진 PLEX나 백업 등이 간섭을 받을 수도 있습니다.
- 감옥 외부에서 idprio 명령어로 boinc 을 실행해 주는 것입니다. 특정한 우선 순위로 실행한 프로그램이 다른 프로그램을 실행할 경우 실행된 프로그램도 같은 우선순위를 가집니다. (백업하기-우선순위 참고) 즉, idprio 31 iocage exec service boinc-client start 라는 명령어를 실행시 boinc 감옥 안에서 최저 우선 순위로 boinc-client 가 실행됩니다. 가장 번거롭지만 가장 깔끔한 방법입니다.
이 포스팅에서는 세 번째 방법을 사용하도록 하겠습니다.
Boinc 시작 스크립트 수정
vi /usr/local/etc/rc.d/boinc-client
boinc-client 시작 스크립트를 열어서
# KEYWORD: shutdown 를
# KEYWORD: nostart shutdown 으로 바꿔 주세요.
부팅시 자동으로 시작되지 않도록 설정한 것입니다.
# REQUIRE: LOGIN 을
# REQUIRE: LOGIN networking 으로 바꾸어 주세요.
네트워크가 구성되어야 실행되도록 설정했습니다.
idprio 31 daemon -u ${boinc_client_user} -p ${pidfile} -f ${command} ${boinc_client_flags} ${command_args} || return 1 에서 idprio 31 을 지워 주세요.
모두 수정했다면 저장하고 나와 주신 다음
cp /usr/local/etc/rc.d/boinc-client /root/boinc.rc.d
수정한 시작 스크립트를 백업해 주세요.
시작 옵션 설정
sysrc linux_enable="YES"
리눅스 호환성을 실행하도록 설정
sysrc boinc_client_flags="--allow_remote_gui_rpc"
boinccmd 나 boincmgr 을 사용할 수 있도록 설정
sysrc boinc_client_enable="YES"
Boinc-client 을 서비스에 등록
Jail 시작시 Boinc 자동 시작 설정
boinc 이 자동으로 시작되지 않게 만든 이유는 idprio 명령어가 제거 된 상태로 boinc-client 를 실행시 일반 우선 순위로 boinc 가 동작하게 됩니다. 최저 우선 순위로 감옥 시작시 boinc 을 실행시키기 위해선 감옥 시작시 외부에서 boinc 을 실행시켜 주어야 합니다.
그런데 문제가 있습니다. ‘어덯게’ 감옥이 시작될 때 외부에서 명령을 실행하느냐는 겁니다.
iocage 는 이에 대한 해결 방안을 제시합니다. 바로 poststart_cmd 입니다.
poststart_cmd 는 감옥이 시작된 직후 호스트에서 실행되는 명령어입니다. 이것을 이용해 감옥 시작시 boinc 을 최저 우선 순위로 시작하도록 하겠습니다.
WebUI 의 jails 에서 Boinc 감옥을 수정해 주세요.
jail properties 탭에서 poststart_cmd 를 수정해 주세요.
/usr/bin/true 를
/usr/sbin/idprio 31 /usr/local/bin/iocage exec Boinc service boinc-client start 으로 바꾸어 주세요.
idprio 31 iocage exec Boinc service boinc-client start 명령어가 감옥이 시작된 후 호스트에서 실행됩니다.
boinc 제어 스크립트
boinc 외부에서 실행한다면 제어 스크립트가 있으면 편할 것입니다. 그러니 만들어주겠습니다.
vi /mnt/System/data/script/boinc.sh
#!/bin/sh if [ "${1}" = "start" ]; then idprio 31 iocage exec Boinc service boinc-client start elif [ "${1}" = "restart" ]; then iocage exec Boinc service boinc-client stop idprio 31 iocage exec Boinc service boinc-client start elif [ "${1}" = "stop" ]; then iocage exec Boinc service boinc-client stop else echo An error occurred or no arguments were specified. fi
아주 간단합니다. boinc.sh start 하면 시작이고 boinc.sh stop 하면 정지고 boinc.sh restart 하면 재시작입니다.
감옥이 시작되기 전에는 사용하지 마세요.
Boinc 설정
사실 boinc 설정에 관한 건 딱히 쓸 생각이 없었습니다. 그런데 한국어 자료가 딱히 없더라구요. 그래서 쓰기로 했습니다.
Boinc 클라이언트를 설정하기 위해선 boinccmd 라는 CLI 기반 프로그램을 이용하거나, boincmgr 이라는 GUI 기반 프로그램을 이용하는 방법이 있습니다. 이 중 boincmgr 을 사용하는게 편합니다. CLI 보다 직관적이기도 하고, 설정하거나 프로젝트 추가하고 가입하는게 간편하거든요. 하지만 문제가 있습니다.
boincmgr 이나 boinccmd 는 boinc-client 의 일부분입니다. SoftEtherVPN 에서 했던 것 처럼 관리 프로그램만 설치할 방법이 없습니다. 그러니깐 boincmgr 을 사용하려면 결국 데스크탑에도 boinc 를 설치해야 한다는 것인데, 그건 좀 불친절한 것 같습니다.
그러니 포스팅에서는 boinccmd를 이용해서 설정을 하도록 하겠습니다. 하지만 데스크탑에서도 boinc을 굴리고 싶은 분들이 있을 수도 있으니, 윈도우에 boinc 설치하고 설정하기 에서 boincmgr 을 이용하는 방법을 써 놓았으니 참고하시길 바랍니다.
전역 환경 설정 파일 수정
iocage console Boinc
cd /var/db/boinc
boinc 가 설치된 디렉토리입니다. 다른 프로그램들과 달리 /usr/local/ 아래가 아니라 /var/db/ 디렉토리를 사용합니다.
프로젝트에 가입하기 전에, 환경 설정부터 하도록 하겠습니다.
Boinc 는 어느 정도의 컴퓨팅 자원을 사용할지 매우 상세하게 설정할 수 있습니다.
vi global_prefs_override.xml
전역 설정 재정의 파일을 엽니다.
<global_preferences> <run_on_batteries>0</run_on_batteries> <!--배터리로 동작시 태스크 실행 여부 0==false 1==true--> <run_if_user_active>1</run_if_user_active> <!--컴퓨터가 사용중일 때 실행 여부--> <run_gpu_if_user_active>1</run_gpu_if_user_active> <!--컴퓨터가 사용중일 떄 GPU 연산 실행 여부--> <idle_time_to_run>5.000000</idle_time_to_run> <!--~분 동안 미사용일 시 유후 시간으로 판정할지--> <suspend_cpu_usage>30.000000</suspend_cpu_usage> <!--Boinc 이 아닌 다른 프로세스의 CPU 사용량이 ~%를 넘어 갈 떄 멈출지--> <start_hour>0.000000</start_hour> <!--작동 시간을 제한할 경우, Boinc 가 연산을 시작할 시간--> <end_hour>0.000000</end_hour> <!--끝낼 시간--> <net_start_hour>0.000000</net_start_hour> <!--네트워크 전송 시간을 제한할 경우, 네트워크 전송 허용이 시작되는 시간--> <net_end_hour>0.000000</net_end_hour> <!--끝나는 시간--> <leave_apps_in_memory>1</leave_apps_in_memory> <!--일시 중지 시 태스크를 메모리에 남겨 둘지--> <confirm_before_connecting>0</confirm_before_connecting> <!--인터넷 접속 전에 확인--> <hangup_if_dialed>0</hangup_if_dialed> <!--전송이 완료되면 접속 끊기--> <dont_verify_images>0</dont_verify_images> <!--이미지 파일 검증 뛰어넘기--> <work_buf_min_days>0.500000</work_buf_min_days> <!--최소한 ~일치 작업을 받아온다--> <work_buf_additional_days>0.800000</work_buf_additional_days> <!--추가적으로 ~일치 작업량을 유지한다--> <max_ncpus_pct>50.000000</max_ncpus_pct> <!--몇 개의 프로세서를 사용할 것인지 (8개의 프로세서를 가진 cPU의 경우, 75%이면 6개 사용)--> <cpu_scheduling_period_minutes>120.000000</cpu_scheduling_period_minutes> <!--태스크를 ~분 마다 전환--> <disk_interval>60.000000</disk_interval> <!--태스크를 ~초마다 디스크에 기록--> <disk_max_used_gb>20.000000</disk_max_used_gb> <!--쵀대 디스크 사용량 (Gb)--> <disk_max_used_pct>40.000000</disk_max_used_pct> <!--쵀대 ~%까지 사용 가능--> <disk_min_free_gb>50.00000</disk_min_free_gb> <!--최소한 ~Gb 는 남겨둔다--> <vm_max_used_pct>50.000000</vm_max_used_pct> <!--최대 스왑 사용량--> <ram_max_used_busy_pct>50.000000</ram_max_used_busy_pct> <!--컴퓨터 사용시 최대 램 사용량--> <ram_max_used_idle_pct>50.000000</ram_max_used_idle_pct> <!--컴퓨터 미 사용시 최대 램 사용량--> <max_bytes_sec_up>0.000000</max_bytes_sec_up> <!--최대 업로드 속도--> <max_bytes_sec_down>0.000000</max_bytes_sec_down> <!--최대 다운로드 속도--> <cpu_usage_limit>70.000000</cpu_usage_limit> <!--CPU 사용 시간 (75%이면 3초간 연산, 1초간 유후)--> <daily_xfer_limit_mb>0.000000</daily_xfer_limit_mb> <!--네트워크를 ~mb 까지 사용 가능하다--> <daily_xfer_period_days>0</daily_xfer_period_days> <!--~ 일 동안 (daily_xfer_limit_mb와 같이 구성되는 설정.)--> </global_preferences>
설정 파일의 예시입니다. 설정값은 다를 수 있습니다. 원래 주석은 안 붙어 있습니다. 정상입니다. 설정 파일을 수정해주도록 하겠습니다.
<run_on_batteries>0</run_on_batteries>
0으로 설정합니다. 서버에는 배터리가 없으니 별 의미가 없는 설정이긴 하지만, 일단 false 로 설정합니다.
<run_if_user_active>1</run_if_user_active>
‘컴퓨터가 사용중’ 이라는 것은 마우스가 움직일 때 라는 의미인데, FreeNAS는 Headless OS 이니 의미 없는 설정입니다.
<run_gpu_if_user_active>1</run_gpu_if_user_active>
컴퓨터가 사용중일 때 GPU를 사용할지에 대한 설정입니다. 마찬가지로 의미 없는 설정입니다. 애초에 GPU도 없으니깐요.
<idle_time_to_run>5.000000</idle_time_to_run>
5분동안 미사용시 유후 시간으로 판정한다는 의미입니다. 마찬가지로 서버에선 의미 없는 설정입니다.
<suspend_cpu_usage>30.000000</suspend_cpu_usage>
Boinc 이 아닌 다른 프로세스가 30%이상 사용중일 경우 일시정지 하는 설정입니다. 그런데 문제가 있는 것이, jail 내부에 Boinc를 설치하게 되면 jail 외부의 프로세스를 알 수가 없어서 외부에 어떤 프로세스가 얼마만큼의 CPU를 사용하는지 알 수가 없습니다. 그러니 이 환경에서는 별 의미 없는 설정입니다.
#Boinc는 idpro 31 로 실행되기 때문에 다른 프로세스의 실행에 영향을 끼치지 않습니다.
<start_hour>0.000000</start_hour>
<end_hour>0.000000</end_hour>
Boinc작동 시간을 제한할 경우 제한 시간 설정입니다. 만약 7시부터 21시까지 연산을 하겠다면 start_hour 는 7.000000, end_hour 는 21.000000 이 됩니다.
<net_start_hour>0.000000</net_start_hour>
<net_end_hour>0.000000</net_end_hour>
네트워크 사용 시간을 제한할 경우 제한 시간 설정입니다. 이건 딱히 설정할 필요가 없는 것이, Boinc 에서 사용하는 네트워크 사용량은 매우 낮습니다. 1시간에 up/down 합해서 3mbit~10mbit 정도 사용합니다. 하루 종일 돌려도 최대 30mb 정도 사용한다는 것인데, 특수한 조건 (전화선을 사용한다던가… 시간별 인터넷 요금이 있는 곳이라던가…) 이 있지 않은 한 제한 할 필요가 없습니다.
<leave_apps_in_memory>1</leave_apps_in_memory>
일시 중지 시 태스크를 메모리에 남겨둘지 설정합니다. 만약 0 (false) 로 설정할 경우, 태스크가 일시정지 되면 메모리에서 내려가게 되는데, 다시 시작 될 때 가장 최근에 디스크에 저장한 부분부터 다시 시작합니다.
<confirm_before_connecting>0</confirm_before_connecting>
인터넷 접속 전에 인터넷 환경을 확인합니다. VPN이나 프록시 등을 통하거나, ISDN을 사용하거나 하는 경우 유용합니다. 특수한 환경이 아니라면 설정할 필요가 없습니다. 0
<hangup_if_dialed>0</hangup_if_dialed>
전송이 완료되면 연결을 끊는 설정입니다. 위와 마찬가지로 특수한 환경에 아니라면 설정할 필요가 없습니다.
<dont_verify_images>0</dont_verify_images>
IPS 가 이미지 파일을 건드리는 경우 설정합니다. 설정할 필요 없습니다. 0.
<work_buf_min_days>0.500000</work_buf_min_days>
프로젝트 서버에 요청 시 최소한 0.5일치 작업량을 요구합니다. 하루 치 작업량은 Boinc 의 자체적인 벤치마크 결과에 따라 설정됩니다. 1 (1일) 분량을 받아 오게 하는 것을 추천합니다. NAS 는 24시간 돌아가니깐요.
<work_buf_additional_days>0.800000</work_buf_additional_days>
위 설정에서 추가적으로 0.8일치 작업을 더 받아옵니다. 전 이걸 0.4 정도로 설정해 둡니다.
<max_ncpus_pct>50.000000</max_ncpus_pct>
몇 개의 프로세서를 사용할지 설정합니다. 8스레드 프로세서일 경우 50%이면 프로세서 4개를 사용합니다.
<cpu_scheduling_period_minutes>120.000000</cpu_scheduling_period_minutes>
여러 개의 프로젝트를 돌릴 경우, 얼마나 자주 프로젝트를 바꾸어 가며 실행할지 설정합니다. 만약 SETI 프로젝트와 Rosetta, LHC 프로젝트를 실행하고, 120분으로 설정하였다면 2시간씩 돌아가며 3개의 프로젝트를 실행합니다.
<disk_interval>60.000000</disk_interval>
몇 초 마다 디스크에 태스크를 저장할 지 설정합니다. 태스크가 일시정지되어 메모리에서 내려갔을 경우, 위 설정에 따라 디스크에 저장된 시점부터 재시작합니다. 너무 짧게 설정하면 디스크에 부담을 주게 되고, 너무 길게 설정하면 비효율적일 수 있습니다. 60~120초 정도가 적당합니다.
<disk_max_used_gb>20.000000</disk_max_used_gb>
최대 디스크 사용량(Gb)을 설정합니다. 적당하게 주시길 바랍니다. 그런데 Boinc 는 디스크를 별로 사용하지 않습니다. 필자의 서버에 30Gb 를 사용하도록 설정해 두었는데 실제로는 1.6Gb 를 사용하더라구요. 디스크에는 별 다른 부담이 가지 않습니다.
<disk_max_used_pct>40.000000</disk_max_used_pct>
최대 디스크 사용량 (%)를 설정합니다. 마찬가지로 적당하게 설정해 주세요. 최대 디스크 사용량을 설정하였다면 설정할 필요는 없습니다. 0으로 설정하면 비활성화됩니다.
<disk_min_free_gb>50.00000</disk_min_free_gb>
최소한 몇 Gb 의 여유 공간을 남겨 둘지 설정합니다. 디스크의 여유 공간 설정이라서 너무 크게 설정하면 Boinc 이 사용할 공간이 없으니 주의해 주세요.
최대 디스크 사용량을 설정하였다면 설정할 필요는 없습니다. 0으로 설정하면 비활성화됩니다.
<vm_max_used_pct>50.000000</vm_max_used_pct>
최대 SWAP 사용 비율을 설정합니다.
<ram_max_used_busy_pct>50.000000</ram_max_used_busy_pct>
컴퓨터 미사용시 최대 램 사용량(%)을 설정합니다. 적당하게 설정해 주세요. 필자는 어덯게든 메모리를 쥐어 짜야 하는 상황이라 5%로 설정했습니다ㅠ
<ram_max_used_idle_pct>50.000000</ram_max_used_idle_pct>
컴퓨터 사용시 램 사용량입니다. 위와 동일하게 설정해 주세요.
<max_bytes_sec_up>0.000000</max_bytes_sec_up>
최대 업로드 속도를 제한합니다. 그런데 최대 속도가 500kbps 를 넘는 걸 본적이 없는지라 딱히 제한 할 필요는 없습니다.
<max_bytes_sec_down>0.000000</max_bytes_sec_down>
최대 다운로드 속도를 제한합니다. 위와 동일합니다.
<cpu_usage_limit>70.000000</cpu_usage_limit>
CPU 사용 시간을 제한합니다. 75% 면 3초간 실행하고 1초 쉬는 것을 반복합니다.
<daily_xfer_limit_mb>100.000000</daily_xfer_limit_mb>
~mb 를
<daily_xfer_period_days>2</daily_xfer_period_days>
~일동안 사용 가능하다 라는 설정입니다. 이 경우에는 2일동안 100mb 사용 가능합니다. 마찬가지로 설정할 필요가 없습니다. 둘다 0(비활성) 으로 해 주세요.
다 설정하였다면 저장해 주세요.
GUI RPC 비밀번호 생성
cat gui_rpc_auth.cfg ; echo
gui_rpc_auth.cfg 는 rpc 비밀번호가 저장되는 파일입니다. 만약 이 파일이 없거나, 텅 비어 있다면 임의의 33자리 숫자와 영어로 구성된 비밀번호를 만들어 주시면 됩니다.
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 33 >> gui_rpc_auth.cfg
이렇게 하면 무작위 33자리 비밀번호가 저장됩니다.
전역 설정 파일 적용
boinccmd 는 boinc-client 를 설정하는 프로그램입니다. /var/db/boinc 에서 실행해야 인증 없이 접속됩니다.
boinccmd --read_global_prefs_override
앞서 작성한 global_prefs_override.xml 을 적용합니다.
Operation failed: authentication error
이라는 문구가 나타났다면 올바른 경로에서 실행하지 않았거나, gui_rpc_auth.cfg 파일이 없거나, boinc-client 실행 옵션에 –allow_remote_gui_rpc 인수를 주지 않았기 때문입니다.
프로젝트 가입
Boinc-client 에서 태스크를 실행하기 위해선 프로젝트에 가입을 해야 합니다. 프로젝트의 수가 꾀나 많은데, 마음에 드시는 프로젝트에 가입하시면 됩니다. 여기 필자가 참가하고 있는 몇 가지 프로젝트의 링크를 걸어 두겠습니다.
모든 프로젝트의 목록은 아래 링크에서 확인할 수 있습니다. 공식 boinc 프로젝트 목록입니다.
https://boinc.berkeley.edu/projects.php
프로젝트는 2가지 유형이 있는데, 매니저 프로그램을 이용해서 가입이 가능한 프로젝트와, 해당 프로젝트 홈페이지에 가서 가입을 해야 하는 프로젝트가 있습니다. 먼저 매니저 프로그램을 이용해 가입이 가능한 프로젝트부터 가입 해 보도록 하겠습니다.
Boinccmd 를 이용해 가입
가장 대표적인 프로젝트인 SETI@home 에 가입해 보도록 하겠습니다.
boinccmd --create_account
계정을 만드는 명령어입니다.
boinccmd --create_account "가입할 프로젝트의 URL" "이메일 주소" "비밀번호" "닉네임"
SETI@Home 의 프로젝트 URL 은 http://setiathome.berkeley.edu/입니다.
참고로, 프로젝트 URL은 그 프로젝트의 홈페이지 URL과 동일합니다.
boinccmd --create_account "http://setiathome.berkeley.edu/" "admion@example.com" "passwordforthisaccount1234" "admion"
status: Success poll status: operation in progress poll status: operation in progress poll status: operation in progress poll status: operation in progress account key:arm3Acm1Xcved41ca1Caa113vs3cAc
위와 같이 출력 되면 정상적으로 가입 된 것입니다. account key 가 중요합니다. 계정에 접근하기 위한 열쇠이기 때문입니다.
프로젝트 홈페이지에서 가입
다음은 프로젝트 홈페이지에서 가입해야 하는 프로젝트인데, Science United 라는 과학 프로젝트에 참가 해 보도록 하겠습니다.
Join Science United 를 눌러 가입합니다.
별명, 이메일, 비밀번호를 입력하고 관심 있는 분야를 체크한 다음, 로봇이 아니라는걸 증명해 주면 가입이 끝납니다.
그럼 이런 페이지로 이동될 텐데, boinc-client 를 다운로드 받으라는 의미입니다. 데스크탑에서 돌릴 생각이시라면 ‘윈도우에 boinc 설치하고 설정하기’ 를 참고해 주시고, 아니시라면 click here to finish 을 눌러줍니다.
그럼 이러한 간단한 안내 페이지로 이동됩니다. 맨 아래 continue to your home page 을 눌러 주시면
자신의 계정 정보 페이지가 나타납니다. 대부분의 프로젝트들은 이러한 계정 정보 페이지를 가지고 있습니다. 계정 정보 페이지에는 얼마나 많은 크레딧을 가지고 있는지, 어떤 컴퓨터에서 연산을 하고 있는 지 등이 표시됩니다.
Boinc-client 에 프로젝트 등록
계정 키 알아 오기
boinccmd --lookup_account
‘이미 가입되어 있는’ 프로젝트의 계정 키를 알아오는 명령어입니다.
boinccmd --lookup_account "프로젝트 URL" "이메일" "비밀번호"
Science United 의 프로젝트 URL 은 https://scienceunited.org/ 입니다.
boinccmd --lookup_account "https://scienceunited.org/" "admion@example.com" "password_for_this_project"
status: Success poll status: operation in progress poll status: operation in progress poll status: operation in progress account key: 1kcma04kcmalvn10cxkityn12xck1nvc9
이러한 출력이 나타나면 정상적으로 실행된 것입니다.
프로젝트 등록하기
boinccmd --project_attach
프로젝트를 등록하는 명령어입니다.
boinccmd --project_attach "프로젝트 URL" 계정키
여기서 계정 키를 사용합니다.
boinccmd --project_attach "http://setiathome.berkeley.edu/" arm3Acm1Xcved41ca1Caa113vs3cAc
위 명령어를 입력했을 때, 아무런 출력이 나오지 않는다면 정상적으로 처리 된 것입니다.
다른 프로젝트를 추가할 때도 동일한 방법으로 추가하면 됩니다.
프로젝트를 추가하면 boinc-client 는 설정한 대로 자동으로 태스크를 받아와 실행합니다.
위 설정을 모두 하였다면 이제 boinc-client 는 설정한 프로젝트의 태스크를 받아와 실행하고, 연산 결과를 프로젝트 서버로 보냅니다. 그리고 프로젝트 서버에서는 그것을 검토해 크래딧을 줍니다.
시간대 별로 사용량 제한하기
Boinc 는 시간대 별로 실행 여부를 설정할 수는 있지만, 특정 시간대에 얼마 정도의 연산을 할 지 설정할 수는 없습니다. 1시부터 7시 까지는 CPU 80%, 8시부터 12시까지는 50% 사용하는 등의 설정이 가능하다면 서버 사용률이 낮은 밤에 더 많은 연산을 하게 설정할 수 있을 텐데 말입니다.
하지만 이렇게 할 만한 약간의 트릭이 있습니다. 바로 설정 파일을 이용하는 것이죠.
위에서 설정 파일을 수정한 것을 기억 하실 것입니다. 그리고 boinccmd 의 명령어를 이용해 그것을 적용한 것도 기억하실 것입니다.
간단하게, 밤 설정 파일과 낮 설정 파일을 만들어서 시간대별로 스위칭 하면 됩니다.
vi day_profile.xml
낮 시간대 설정 파일을 작성합니다.
<global_preferences> <run_on_batteries>0</run_on_batteries> <run_if_user_active>1</run_if_user_active> <run_gpu_if_user_active>1</run_gpu_if_user_active> <suspend_cpu_usage>25.000000</suspend_cpu_usage> <start_hour>0.000000</start_hour> <end_hour>0.000000</end_hour> <net_start_hour>0.000000</net_start_hour> <net_end_hour>0.000000</net_end_hour> <leave_apps_in_memory>0</leave_apps_in_memory> <confirm_before_connecting>0</confirm_before_connecting> <hangup_if_dialed>0</hangup_if_dialed> <dont_verify_images>0</dont_verify_images> <work_buf_min_days>1.000000</work_buf_min_days> <work_buf_additional_days>0.300000</work_buf_additional_days> <max_ncpus_pct>75.000000</max_ncpus_pct> <cpu_scheduling_period_minutes>120.000000</cpu_scheduling_period_minutes> <disk_interval>180.000000</disk_interval> <disk_max_used_gb>20.000000</disk_max_used_gb> <disk_max_used_pct>100.000000</disk_max_used_pct> <disk_min_free_gb>40.000000</disk_min_free_gb> <vm_max_used_pct>50.000000</vm_max_used_pct> <ram_max_used_busy_pct>5.000000</ram_max_used_busy_pct> <ram_max_used_idle_pct>5.000000</ram_max_used_idle_pct> <max_bytes_sec_up>0.000000</max_bytes_sec_up> <max_bytes_sec_down>0.000000</max_bytes_sec_down> <cpu_usage_limit>50.000000</cpu_usage_limit> <daily_xfer_limit_mb>0.000000</daily_xfer_limit_mb> <daily_xfer_period_days>0</daily_xfer_period_days> </global_preferences>
위는 설정 예시입니다. 필자가 실제로 사용하는 설정인데, 여러분 환경에 맞게 수정해서 사용하시길 바랍니다. 이 설정에 따르면, 낮 시간대에는 75% CPU (6 프로세서)를 50% 사용합니다.
vi night_profile.xml
밤 시간대 설정 파일을 작성합니다.
<global_preferences> <run_on_batteries>0</run_on_batteries> <run_if_user_active>1</run_if_user_active> <run_gpu_if_user_active>1</run_gpu_if_user_active> <suspend_cpu_usage>25.000000</suspend_cpu_usage> <start_hour>0.000000</start_hour> <end_hour>0.000000</end_hour> <net_start_hour>0.000000</net_start_hour> <net_end_hour>0.000000</net_end_hour> <leave_apps_in_memory>0</leave_apps_in_memory> <confirm_before_connecting>0</confirm_before_connecting> <hangup_if_dialed>0</hangup_if_dialed> <dont_verify_images>0</dont_verify_images> <work_buf_min_days>1.000000</work_buf_min_days> <work_buf_additional_days>0.300000</work_buf_additional_days> <max_ncpus_pct>87.500000</max_ncpus_pct> <cpu_scheduling_period_minutes>120.000000</cpu_scheduling_period_minutes> <disk_interval>180.000000</disk_interval> <disk_max_used_gb>20.000000</disk_max_used_gb> <disk_max_used_pct>100.000000</disk_max_used_pct> <disk_min_free_gb>40.000000</disk_min_free_gb> <vm_max_used_pct>50.000000</vm_max_used_pct> <ram_max_used_busy_pct>5.000000</ram_max_used_busy_pct> <ram_max_used_idle_pct>5.000000</ram_max_used_idle_pct> <max_bytes_sec_up>0.000000</max_bytes_sec_up> <max_bytes_sec_down>0.000000</max_bytes_sec_down> <cpu_usage_limit>80.000000</cpu_usage_limit> <daily_xfer_limit_mb>0.000000</daily_xfer_limit_mb> <daily_xfer_period_days>0</daily_xfer_period_days> </global_preferences>
설정 예시입니다. 마찬가지로 알맞게 수정해서 사용하세요. 이 설정에 따르면 밤 시간대에는 87.5% (7프로세서) 를 80% 사용합니다.
vi switch_day.sh
낮 시간대 설정 파일을 적용하는 스크립트를 작성합니다.
#!/bin/sh cd /var/db/boinc/ cp day_profile.xml global_prefs_override.xml /usr/local/bin/boinccmd --read_global_prefs_override
vi switch_night.sh
밤 시간대 설정 파일을 적용하는 스크립트를 작성합니다.
#!/bin/sh cd /var/db/boinc/ cp night_profile.xml global_prefs_override.xml /usr/local/bin/boinccmd --read_global_prefs_override
chown boinc:boinc day_profile.xml night_profile.xml switch_night.sh switch_day.sh
권한 설정을 해 주고
vi /etc/crontab
0 2 * * * boinc sh /var/db/boinc/switch_night.sh 0 8 * * * boinc sh /var/db/boinc/switch_day.sh
2시부터 밤 프로파일을 적용하고 8시부터 낮 프로파일을 적용하도록 설정하였습니다.
업데이트
iocage exec Boinc 'service boinc-client stop'
Boinc 를 정지하고
iocage exec Boinc 'portsnap auto'
porttree 를 받아 온 다음
iocage exec Boinc 'pkg update && pkg upgrade -y'
패키지를 업데이트하고
iocage exec Boinc 'pkg unlock -y boinc-client'
boinc-client 의 잠금을 해제한 다음
iocage exec Boinc 'portupgrade boinc-client'
port 로 boinc-client 를 업데이트하고
iocage exec Boinc 'pkg lock -y boinc-client'
다시 패키지를 잠궈 줍니다.
iocage exec Boinc 'mv /usr/local/etc/rc.d/boinc-client /root/boinc-client.org'
패키지를 업데이트 하고 나면 가끔 시작 스크립트가 갱신되는 경우가 있습니다. 그 때마다 스크립트를 재작성하는 것은 귀찮으므로, 원본 스크립트를 백업하고
iocage exec Boinc 'cp /root/boinc.rc.d /usr/local/etc/rc.d/boinc-client'
작성해 둔 시작 스크립트로 대체하는 것입니다.
업데이트를 한 직후에는 서비스를 바로 시작하지 말고, 스크립트가 이전과 비교해서 바뀐 것이 있는지 확인해 주시길 바랍니다.
idprio 31 iocage exec Boinc 'service boinc-client start'
그리고 문제가 없다면, 최저 우선순위로 boinc-client 를 시작합니다.
마치면서
이것으로 감옥에 Boinc 을 설치하고 설정하는 방법을 알아 보았습니다.
boinc 을 윈도우에서도 실행하고 싶다면 ‘윈도우에서 boinc 설치하고 설정하기‘ 를 보시길 바랍니다.