ISUCON 9 예선은 Docker로만 진행됩니다.
최종 품목은 다음과 같습니다.
https://github.com/s2terminal/isucon9-qualify-docker
환경
생성 과정
우선
git clone
.$ git clone [email protected]:isucon/isucon9-qualify.git
$ cd isucon9-qualify
미리 준비하다
저장소에 없는 초기 이미지 파일을 다운로드해야 하지만 1.5GB가 있기 때문에 먼저 떨어집니다.
$ wget https://github.com/isucon/isucon9-qualify/releases/download/v2/bench1.zip
$ wget https://github.com/isucon/isucon9-qualify/releases/download/v2/initial.zip
다운로드가 완료되면 압축을 풀고 각각 규정된 디렉터리로 이동합니다.$ unzip bench1.zip
$ unzip initial.zip
$ mv v3_initial_data webapp/public/upload
$ mv v3_bench1 initial-data/images
초기 데이터를 준비합니다.여기서 perl의 Docker 컨테이너를 사용하여 SQL 등을 생성하는 것 같습니다.$ cd initial-data
$ make
루비 환경 준비
루비 응용 프로그램을 실행할 준비를 하세요.
webapp/ruby
디렉토리에 Dockerfile을 배치합니다.webapp/ruby/Dockerfile
FROM ruby:2.7.1
WORKDIR /app
RUN apt-get update \
&& apt-get install -y \
mariadb-client \
less
COPY ./Gemfile ./
COPY ./Gemfile.lock ./
RUN bundle install
CMD /bin/sh -c "while sleep 1000; do :; done"
mariadb-client
가 필요합니다.다른 것만 넣었지만less
추가할 게 있으면 언제든 넣어요.Isucon을 사용하면 들어가서 뭔가를 하고 싶으니까 캐시를 삭제하지 마세요.CMD /bin/sh -c "while sleep 1000; do :; done"
, 컨테이너를 계속 세우다.프로젝트 루트에 배치
docker-compose.yml
.docker-compose.yml
version: '3'
services:
ruby:
build: ./webapp/ruby
volumes:
- .:/app
ports:
- 127.0.0.1:5555:5555
- 127.0.0.1:7000:7000
- 127.0.0.1:8000:8000
environment:
- MYSQL_HOST=db
- MYSQL_USER=root
- MYSQL_PASS=secret
ySQL 환경 준비
데이터베이스를 준비하다.참조DB만 Docker를 사용하여 ISUCON9 환경 구축 - teru_0x01.log, 생성
webapp/sql/conf/my.cnf
.$ mkdir webapp/sql/conf
webapp/sql/conf/my.cnf[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
slow_query_log = 1
long_query_time = 5
[client]
default-character-set = utf8mb4
# Custom config should go here
!includedir /etc/mysql/conf.d/
docker-compose.yml
에 다음 내용을 추가합니다.docker-compose.yml
db:
image: mysql:5.7
volumes:
- ./webapp/sql:/docker-entrypoint-initdb.d
- ./webapp/sql/conf:/etc/mysql/conf.d
- ./datadir:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_HOST=127.0.0.1
- MYSQL_USER=root
- MYSQL_PASS=secret
ports:
- 127.0.0.1:3306:3306
응용 프로그램 시작
루비 컨테이너에 들어간 후 다음을 수행합니다.
$ docker-compose exec ruby /bin/bash
처음 시작할 때나 DB를 복원할 때 등 DB의 초기화 처리를 실행합니다.# ./webapp/sql/init.sh
isucon9-qualify 프로필의 서비스 정의 디렉터리 애플리케이션을 시작합니다.# cd webapp/ruby && bundle exec rackup --port 8000 --host 0.0.0.0
액세스http://localhost:8000/하고 ISUCARI를 표시하면 성공합니다.다음 오류 화면이 나타나면 루비의 오류 로그를 확인하십시오.(내 경우 데이터베이스 연결 문자열 오류)
git 관리 시 MySQL의 데이터를 불러오는 데 사용할 디렉터리
.gitignore
에 넣습니다.겸사겸사 말씀드리지만, 다운로드한 파일을 tmp/
디렉터리에 넣었습니다. 마음에 드세요..gitignore
datadir/
tmp/
데이텀 태그 구성하기
저장소에 실행 데이텀 태그가 없는 바이너리 파일은 Go에서 작성해야 합니다.구축에 사용할 용기를
docker-compose.yml
에 추가합니다.docker-compose.yml
golang:
image: golang:1.14.6
volumes:
- .:/app
working_dir: /app
command: /bin/sh -c "while sleep 1000; do :; done"
벤치 표시Makefile
는 프로젝트 루트 디렉터리에 있습니다. 다음 명령을 사용하여 구축하십시오.$ docker-compose exec golang make
Go에 의존하는 다른 곳이 있을 것 같아서docker-compose.yml
에 기술하고 시작했지만 이 벤치 표지의 구축을 한 번만 사용했다.아마 한 번$ docker run
만 했으면 좋겠어요.데이텀 실행
rack을 시작한 상태에서 루비의 컨테이너
$ ./bin/benchmarker
에서 데이텀을 실행할 수 있습니다.그러나 이번에 사용한 환경(Chromebook C434TA Core i5Crostini+Docker)은 너무 무거웠는지 점수를 기록하기 전/initialize
의 컴퓨터 자체 검사에서 시간을 초과해 득점하지 못했다.확인해 보니
init.sh
SQL 흐름이 1분 이상 걸리는 것 같습니다.$ time ./webapp/sql/init.sh
(中略)
real 1m2.555s
user 0m1.872s
sys 0m0.536s
ISUCON9 예선 안내서의 POST/initialize는 20초 이내입니다., 그런 것 같아요.이것은 아마도 규칙을 위반한 것 같지만, 먼저
init.sh
의 SQL을 수동으로 재생한 후, SQL 실행을 건너뛴 후에 데이텀을 이동하는 것으로 수정하여 마침내 점수를 얻었다.webapp/sql/init.sh
export LANG="C.UTF-8"
cd $CURRENT_DIR
-cat 01_schema.sql 02_categories.sql initial.sql | mysql --defaults-file=/dev/null -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER $MYSQL_DBNAME
+# cat 01_schema.sql 02_categories.sql initial.sql | mysql --defaults-file=/dev/null -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER $MYSQL_DBNAME
# ./bin/benchmarker
(中略)
{"pass":true,"score":810,"campaign":0,"language":"ruby","messages":[]}
스코어는 810점이다.벤치 마크의 설치도 20초 동안 시간 초과, Chromebook의 Linux 가상 환경과 그 위에 Docker를 설치하는 이중 비용이 성능을 떨어뜨렸는지 여부.참고 자료
DB만 Docker를 사용하여 ISUCON9 환경 구축 - teru_0x01.log
Reference
이 문제에 관하여(ISUCON 9 예선은 Docker로만 진행됩니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/suzuki_sh/items/6192647a6dd6d6c1b396텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)