isucon8 문제를 Go 언어로 연습하기

7482 단어 5이스콘Vagrant
전제로서는 하기, 이미 VirtualBox나 Vargrant가 인스톨 되고 있는 것.
  • macOS 10.14
  • VirtualBox 5.2
  • Vargrant 2.1.5

  • 환경 구축은 matsuu씨가 공개하고 있는 것의 1대 구성의 놈을 이용하였습니다.
    htps : // 기주 b. 코 m / 마츠 / ゔ ぁ 란 t 이스 콘 / t 에 / ms r / 이스콘 8
    $ git clone [email protected]:matsuu/vagrant-isucon.git
    $ cd vagrant-isucon/isucon8-qualifier-standalone
    

    이번은 브라우저에서도 확인하고 싶기 때문에 먼저 코멘트 아웃을 제외하고 IP 주소를 할당한다.
      config.vm.network "private_network", ip: "192.168.33.10" # 外す
      # config.vm.network "private_network", type: "dhcp" # コメントアウトする
    

    가상 머신 (CentOS7)을 시작합니다.
    # 起動
    $ vagrant up
    # Provisioningが完了したらログインできる
    $ vagrant ssh
    

    벤치마크 초기 설정



    빌드
    $ sudo -i -u isucon
    $ cd torb/bench
    $ make deps
    $ make
    

    초기 데이터 생성


    $ ./bin/gen-initial-dataset   # ../db/isucon8q-initial-dataset.sql.gz ができる
    

    데이터베이스 초기화
    $ mysql -uroot
    mysql> CREATE USER isucon@'%' IDENTIFIED BY 'isucon';
    mysql> GRANT ALL on torb.* TO isucon@'%';
    mysql> CREATE USER isucon@'localhost' IDENTIFIED BY 'isucon'; # 既にできてるため失敗する?JJ
    mysql> GRANT ALL on torb.* TO isucon@'localhost';
    
    $ ./db/init.sh
    

    참조 구현을 Perl에서 Go로 전환


    $ sudo systemctl stop    torb.perl
    $ sudo systemctl disable torb.perl
    $ sudo systemctl start   torb.go
    $ sudo systemctl enable  torb.go
    

    Perl → Go로 바뀌었는지는 아래 명령으로 확인할 수 있습니다.
    $ ps -aux | grep torb
    

    브라우저에서 애플리케이션이 실행 중인지 확인하기 위해 Vagrant 파일에 설정된 IP 주소를 엽니다.
    http://192.168.33.10



    시험에 템플릿 수정하기
    $ cd ~/torb/webapp/go
    

    views/index.tmpl
    -          <h3>開催中のイベント</h3>
    +          <h3>MY 開催中のイベント</h3>
    

    파일을 변경한 후 빌드 및 서비스를 다시 시작합니다.
    $ make
    $ sudo systemctl restart torb.go
    



    벤치마크 이동


    $ cd ~/torb/bench
    $ bin/bench -remotes=127.0.0.1 -output result.json
    
    $ jq . < result.json
    {
      "job_id": "",
      "ip_addrs": "127.0.0.1",
      "pass": false,
      "score": 0,
      "message": "負荷走行中のバリデーションに失敗しました。2019-08-04 07:04:05.514821172 +0000 UTC m=+39.621374291 [Fatal]レポートに予約id:148865の行が存在しません (GET /admin/api/reports/events/10/sales )",
      "error": [
        "2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
        "2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
        "2019-08-04 07:03:56.994053625 +0000 UTC m=+31.100606768 リクエストがタイムアウトしました (POST /admin/api/events/20/actions/edit )",
        "2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
        "2019-08-04 07:04:05.514821172 +0000 UTC m=+39.621374291 [Fatal]レポートに予約id:148865の行が存在しません (GET /admin/api/reports/events/10/sales )"
      ],
      "log": [
        "08/04 07:03:38 レスポンスが遅いため負荷レベルを上げられませんでした。/api/users/1633",
        "08/04 07:03:39 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/10",
        "08/04 07:03:40 レスポンスが遅いため負荷レベルを上げられませんでした。/",
        "08/04 07:03:41 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve",
        "08/04 07:03:42 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/10",
        "08/04 07:03:43 レスポンスが遅いため負荷レベルを上げられませんでした。/",
        "08/04 07:03:44 レスポンスが遅いため負荷レベルを上げられませんでした。/",
        "08/04 07:03:45 レスポンスが遅いため負荷レベルを上げられませんでした。/",
        "08/04 07:03:46 レスポンスが遅いため負荷レベルを上げられませんでした。/",
        "08/04 07:03:47 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
        "08/04 07:03:48 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
        "08/04 07:03:49 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
        "08/04 07:03:50 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
        "08/04 07:03:51 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
        "08/04 07:03:52 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
        "08/04 07:03:53 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
        "08/04 07:03:54 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
        "08/04 07:03:55 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
        "08/04 07:03:56 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve",
        "08/04 07:03:57 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
        "08/04 07:03:58 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
        "08/04 07:03:59 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
        "08/04 07:04:00 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
        "08/04 07:04:01 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
        "08/04 07:04:02 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/10/sheets/B/170/reservation",
        "08/04 07:04:03 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve",
        "08/04 07:04:04 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales"
      ],
      "load_level": 0,
      "start_time": "2019-08-04T07:03:26.048397335Z",
      "end_time": "2019-08-04T07:04:05.514877674Z"
    }
    

    요약



    우선 webapp/go 부하의 파일을 수정하고 빌드 → 서비스 풀 시작을 하면 수정할 수 있는 것을 확인할 수 있었다.
    로컬에서 수정할 수 있도록 마운트하는 등의 준비가 되면 보다 빨리 수정을 더할 수 있기 때문에 거기가 과제.

    (참고)
    ISUCON8 예선 문제
    ISUCON 예선 돌파의 열쇠는 과거 질문을 풀기 때문에 무료로 시도 할 수 있도록했다 (Vagrant + Ansible)

    좋은 웹페이지 즐겨찾기