1st, 2nd에서 DOMserver를 실행시키고 관리자로 로그인해보았습니다.
마지막으로 제출된 코드를 채점해주는 Judhost를 연결해주겠습니다.
Docker Hub에 게시되어 있는 공식 메뉴얼에는 단일 judgehost를 실행시키는 방법만 나와있습니다.
20이하의 소규모 대회가 아닌 이상 여러개의 judgehost가 필요할 것으로 예상됩니
docker container를 실행시키기 전에 linux 제어 그룹에 대한 설정을 해주어야합니다.
Judgedaemon의 프로세스 격리를 위해 Linux 제어 그룹 또는 cgroup을 사용합니다.
grub구성 편집
grub구성을 편집하여 cgroup 메모리와 swap accounting을 부팅 옵션에 추가해줍니다.
두 곳의 GRUB_CMDLINE_LINUX_DEFAULT 부분에 "cgroup_enable=memory swapaccount=1"을 추가해줍니다.
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1"
$ sudo vi /etc/default/grub.d/50-cloudimg-settings.cfg
GRUB_CMDLINE_LINUX_DEFAULT="console=tty1 console=ttyS0 nvme_core.io_timeout=4294967295 cgroup_enable=memory swapaccount=1"
update-grub
이제 인스턴스를 재부팅해준다.
자세한 사항은 공식 메뉴얼 >> Installation of the judgehosts >> Linux Control Groups 에서 확인할 수 있다.
(공식 메뉴얼 :www.domjudge.org/docs/manual/7.3/install-judgehost.html)
Judgehost user 생성
Judgehost가 domserver에 접속하기 위해서 judgehost 계정이 필요합니다.
domserver를 설치하면 기본적으로 judgehost의 권한을 가진 user계정이 하나 생성됩니다. 이 계정의 비밀번호가 랜덤으로 설정되어 있어서 비밀번호를 찾을 수도 있지만 간단하게 Domserver 관리자 페이지에서 수정하겠습니다.
admin으로 접속해서 Jury interface >> User로 접속한다.
기본적으로 3개의 계정이 있습니다. 그 중 judgehost의 비밀번호를 쉽게 변경해줍니다. 저는 judgehostpw로 설정했습니다.
Judgehost Container
이제 마지막으로 judgehost container를 실행시킨면 됩니다.
docker run -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name judgehost-0 --link domserver:domserver --hostname judgedaemon-0 -e DAEMON_ID=0 domjudge/judgehost:latest
공식 메뉴얼에 있는 실행 명령어입니다. 하나씩 보면 아래와 같이 설정되어있습니다.
docker run
-it
--privileged
-v /sys/fs/cgroup:/sys/fs/cgroup:ro
--name judgehost-0
--link domserver:domserver
--hostname judgedaemon-0
-e DAEMON_ID=0
domjudge/judgehost:latest
추가적으로 있는 환경변수들의 기본값은 아래와 같습니다.
여기서 서버와의 연결을 --link가 아닌 --network로 설정, CONTAINER_TIMEZONE을 서울로, BASEURL은 http://[DOMserver EC2의 public ip], JUDGEDAEMON_USERNAME, PASSWORD는 금방 위에서 설정했던 것으로 나머지는 기본값으로 수정해서 실행시켜줍니다.
$ sudo docker run -it --network host --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name judgehost --hostname judgedaemon0 -e CONTAINER_TIMEZONE=Asia/Seoul -e DOMSERVER_BASEURL=http://3.35.210.229/ -e JUDGEDAEMON_USERNAME=judgehost -e JUDGEDAEMON_PASSWORD=judgehostpw -e DAEMON_ID=0 -e RUN_USER_UID_GID=62860 domjudge/judgehost:latest
정상적으로 실행되면 No submissions in queue 메시지와 함께 연결된 것을 확인 할 수있습니다.
이것을 DOMserver로 보면 상단의 첫번째 메뉴에 Judgehosts에서 새로운 host가 연결된 것을 확인할 수 있습니다.
Judgehost는 CPU에 바인딩되어 실행되기 때문에 host가 가지고 있는 CPU 수 만큼의 Judgehost를 실행시킬 수 있습니다. 예를 들어 한 vCPU가 2인 AWS EC2로 Judgehost를 서버를 실행시키면 해당 EC2에서는 2개의 Judgehost를 실행시킬 수 있습니다.
더 많은 수의 Judgehost를 사용하고 싶다면 Judgehost의 권한을 가진 User를 여러개 생성해서 Judgehost Container를 실행시키는 run 명령어의 환경변수에서 JUDGEDAEMON의 USERNAME과 PASSWORD를 User에 맞게 설정하고 EC2와 같은 호스트에서 각각 실행시키면 됩니다.
20팀의 한개의 judgehost정도가 적당하다고 합니다.
AWS EC2는 위에서 grub구성 편집까지 완료하고 AMI로 만들어서 여러개 실행시키면 좋을 것 같습니다. 이전에서 봤듯이 JVM을 시키기 위해서 2GiB 메모리가 필요하다는 점도 중요합니다.
다음에 DOMserver에서 대회 세팅하는 방법 살펴보겠습니다.
'Domjudge' 카테고리의 다른 글
Domjudge 7.3 -4th (sudo: unable to resolve host judgedaemon0) (0) | 2021.09.04 |
---|---|
Domjudge 7.3 - 2nd (Mariadb, DOMserver Docker container실행) (0) | 2021.02.13 |
Domjudge 7.3 - 1st (AWS EC2실행 및 Docker 설치) (1) | 2021.01.01 |