ISUCON 9 예선은 Docker로만 진행됩니다.

11068 단어 Dockerisucon
Docker를 사용하여 로컬 환경에서 구축isucon/isucon9-qualify됩니다.ySQL 및 Go를 설치하지 않고 Docker로만 이동합니다.응용 프로그램은 Ruby를 사용합니다.(루비를 설치할 필요도 없음)
최종 품목은 다음과 같습니다.
https://github.com/s2terminal/isucon9-qualify-docker

환경

  • ASUS Chromebook Flip C434TA(Core i5 모델)
  • ChromeOS Crostini (Linux) Debian 9.11
  • Docker 19.03.4
  • 생성 과정


    우선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를 설치하는 이중 비용이 성능을 떨어뜨렸는지 여부.

    참고 자료

  • 맥북 프로는 3000 정도 나와요.
  • 로컬 환경에서 이동 ISUCON9 예선 문제: ISUCON 공식 블로그
  • 최종 품목은 다음과 같습니다.
    DB만 Docker를 사용하여 ISUCON9 환경 구축 - teru_0x01.log

    좋은 웹페이지 즐겨찾기