isucon8 문제를 Go 언어로 연습하기
환경 구축은 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)
Reference
이 문제에 관하여(isucon8 문제를 Go 언어로 연습하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/shuntakeuch1/items/5a4b54297d5626b5bd32텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)