HirokiYoshida837 / isucon-docs

ISUCONのための個人Document集
0 stars 0 forks source link

ISUCON13練習用の環境構築スレッド #1

Closed HirokiYoshida837 closed 2 days ago

HirokiYoshida837 commented 2 days ago

isucon13を練習する。

HirokiYoshida837 commented 2 days ago

例によってGCPで作成。

# このコードは、Terraform 4.25.0、および 4.25.0 と後方互換性があるバージョンと互換性があります。# この Terraform コードの検証については、https://developer.hashicorp.com/terraform/tutorials/gcp-get-started/google-cloud-platform-build#format-and-validate-the-configuration をご覧ください

resource "google_compute_instance" "isucon13-base" {
  boot_disk {
    auto_delete = true
    device_name = "isucon13-base"

    initialize_params {
      image = "xxxxx"
      size  = 20
      type  = "pd-balanced"
    }

    mode = "READ_WRITE"
  }

  can_ip_forward      = false
  deletion_protection = false
  enable_display      = false
  hostname            = "xxxxx"

  labels = {
    goog-ec-src = "vm_add-tf"
  }

  machine_type = "e2-standard-2"
  name         = "isucon13-base"

  network_interface {
    access_config {
      network_tier = "PREMIUM"
    }

    queue_count = 0
    stack_type  = "IPV4_ONLY"
    subnetwork  = "xxxxx"
  }

  scheduling {
    automatic_restart   = false
    on_host_maintenance = "TERMINATE"
    preemptible         = false
    provisioning_model  = "SPOT"
  }

  service_account {
    email  = "xxxx@developer.gserviceaccount.com"
    scopes = ["https://www.googleapis.com/auth/devstorage.read_only", "https://www.googleapis.com/auth/logging.write", "https://www.googleapis.com/auth/monitoring.write", "https://www.googleapis.com/auth/service.management.readonly", "https://www.googleapis.com/auth/servicecontrol", "https://www.googleapis.com/auth/trace.append"]
  }

  shielded_instance_config {
    enable_integrity_monitoring = true
    enable_secure_boot          = false
    enable_vtpm                 = true
  }

  tags = ["http-server", "https-server", "isucon13", "isucon13-base"]
  zone = "asia-northeast1-a"
}

ssh-key管理は面倒なのでmetadataでインスタンスに付与してあげる。

HirokiYoshida837 commented 2 days ago

以下のスクリプトをinstanceにsshして直接動かす。 https://github.com/matsuu/aws-isucon/blob/main/isucon13/provision.sh

実態のAnsible playbookはこのあたり https://github.com/isucon/isucon13/blob/8f6afdc3603f0c661368de4659a7240862f59623/provisioning/ansible/application.yml

isuconユーザをインスタンス作成時にすでに作ってしまっていたのでスクリプトがコケてしまった。 自分で途中から再度Runする。

HirokiYoshida837 commented 2 days ago

毎度のことながらxbuildに時間がかかるので、provisioning時だけインスタンスサイズを上げたほうがいい。 (忘れていてまた30分くらいかけてしまった)

HirokiYoshida837 commented 2 days ago

構築したインスタンスをimage保存して、別でインスタンス作成done。

サービスは動いている。

isucon@isucon13:~$ sudo systemctl status isupipe-go.service 
sudo: unable to resolve host isucon13: Name or service not known
● isupipe-go.service - isupipe-go
     Loaded: loaded (/etc/systemd/system/isupipe-go.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2024-11-30 03:22:09 UTC; 2min 36s ago
   Main PID: 820 (isupipe)
      Tasks: 5 (limit: 9518)
     Memory: 7.3M
        CPU: 20ms
     CGroup: /system.slice/isupipe-go.service
             └─820 /home/isucon/webapp/go/isupipe

Nov 30 03:22:09 isucon13 systemd[1]: Started isupipe-go.
Nov 30 03:22:09 isucon13 isupipe[820]:    ____    __
Nov 30 03:22:09 isucon13 isupipe[820]:   / __/___/ /  ___
Nov 30 03:22:09 isucon13 isupipe[820]:  / _// __/ _ \/ _ \
Nov 30 03:22:09 isucon13 isupipe[820]: /___/\__/_//_/\___/ v4.11.1
Nov 30 03:22:09 isucon13 isupipe[820]: High performance, minimalist Go web framework
Nov 30 03:22:09 isucon13 isupipe[820]: https://echo.labstack.com
Nov 30 03:22:09 isucon13 isupipe[820]: ____________________________________O/_______
Nov 30 03:22:09 isucon13 isupipe[820]:                                     O\
Nov 30 03:22:09 isucon13 isupipe[820]: ⇨ http server started on [::]:8080

作成後のインスタンスにsshしてbenchを動かす。 ベンチ完走したのでOK

isucon@isucon13:~$ ./bench run --enable-ssl
2024-11-30T03:25:21.789Z        info    staff-logger    bench/bench.go:172      SSL接続が有効になっています
2024-11-30T03:25:21.793Z        info    isupipe-benchmarker     SSL接続が有効になっています
2024-11-30T03:25:21.793Z        info    staff-logger    bench/bench.go:193      webapp: https://pipe.u.isucon.local:443
2024-11-30T03:25:21.793Z        info    staff-logger    bench/bench.go:194      nameserver: 127.0.0.1:53
2024-11-30T03:25:21.793Z        info    isupipe-benchmarker     静的ファイルチェックを行います
2024-11-30T03:25:21.793Z        info    isupipe-benchmarker     静的ファイルチェックが完了しました
2024-11-30T03:25:21.793Z        info    isupipe-benchmarker     webappの初期化を行います
2024-11-30T03:25:31.815Z        info    isupipe-benchmarker     ベンチマーク走行前のデータ整合性チェックを行います
2024-11-30T03:26:16.786Z        info    isupipe-benchmarker     整合性チェックが成功しました
2024-11-30T03:26:16.786Z        info    isupipe-benchmarker     ベンチマーク走行を開始します
2024-11-30T03:26:16.808Z        info    staff-logger    scenario/viewer.go:32   basic viewer scenario

# 中略

2024-11-30T03:27:16.932Z        info    staff-logger    bench/bench.go:260      ベンチマーク走行時間: 1m0.146515149s
2024-11-30T03:27:16.933Z        info    isupipe-benchmarker     ベンチマーク走行終了
2024-11-30T03:27:16.933Z        info    isupipe-benchmarker     最終チェックを実施します
2024-11-30T03:27:16.933Z        info    isupipe-benchmarker     最終チェックが成功しました
2024-11-30T03:27:16.933Z        info    isupipe-benchmarker     重複排除したログを以下に出力します
2024-11-30T03:27:16.933Z        info    staff-logger    bench/bench.go:277      ベンチエラーを収集します
2024-11-30T03:27:16.933Z        info    staff-logger    bench/bench.go:285      内部エラーを収集します
2024-11-30T03:27:16.933Z        info    staff-logger    bench/bench.go:301      シナリオカウンタを出力します
2024-11-30T03:27:16.933Z        info    isupipe-benchmarker     配信を最後まで視聴できた視聴者数        {"viewers": 5}
2024-11-30T03:27:16.933Z        info    staff-logger    bench/bench.go:323      [シナリオ aggressive-streamer-moderate] 17 回成功
2024-11-30T03:27:16.933Z        info    staff-logger    bench/bench.go:323      [シナリオ dns-watertorture-attack] 4 回成功
2024-11-30T03:27:16.933Z        info    staff-logger    bench/bench.go:323      [シナリオ streamer-cold-reserve] 24 回成功
2024-11-30T03:27:16.933Z        info    staff-logger    bench/bench.go:323      [シナリオ streamer-moderate] 25 回成功
2024-11-30T03:27:16.934Z        info    staff-logger    bench/bench.go:323      [シナリオ viewer-report] 27 回成功
2024-11-30T03:27:16.934Z        info    staff-logger    bench/bench.go:323      [シナリオ viewer-spam] 19 回成功
2024-11-30T03:27:16.934Z        info    staff-logger    bench/bench.go:323      [シナリオ viewer] 5 回成功
2024-11-30T03:27:16.934Z        info    staff-logger    bench/bench.go:329      DNSAttacker並列数: 2
2024-11-30T03:27:16.934Z        info    staff-logger    bench/bench.go:330      名前解決成功数: 835
2024-11-30T03:27:16.934Z        info    staff-logger    bench/bench.go:331      名前解決失敗数: 12
2024-11-30T03:27:16.934Z        info    staff-logger    bench/bench.go:335      スコア: 1821
HirokiYoshida837 commented 2 days ago

standalone構成(インスタンス内にapp, benchが同居) は動いた。 benchを別サーバーにする構成で動かす。

HirokiYoshida837 commented 2 days ago

bench / app を別構成にする手順

変更した状態で、appサーバー側のpdnsのinitスクリプトを動かす

./webapp/pdns/init_zone.sh

うまくいかない場合は、pdnsutilで初期化

pdnsutil delete-zone u.isucon.dev

appサーバー自身から自分のipに向けてdigして、自分のIPが帰ってきてそうなことを確認。

isucon@isucon13:~$ dig pipe.u.isucon.local @10.0.0.3

; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> pipe.u.isucon.local @10.0.0.3
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36871
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;pipe.u.isucon.local.           IN      A

;; ANSWER SECTION:
pipe.u.isucon.local.    0       IN      A       10.0.0.3

;; Query time: 8 msec
;; SERVER: 10.0.0.3#53(10.0.0.3) (UDP)
;; WHEN: Sat Nov 30 04:10:52 UTC 2024
;; MSG SIZE  rcvd: 64

envを変更したので、isupipeも再起動

sudo systemctl restart isupipe-go.service

ベンチサーバーからappサーバーに向けてdigして、名前解決できてることを確認

isucon@isucon13:~$ dig pipe.u.isucon.local @10.0.0.3

; <<>> DiG 9.18.28-0ubuntu0.22.04.1-Ubuntu <<>> pipe.u.isucon.local @10.0.0.3
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16813
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;pipe.u.isucon.local.           IN      A

;; ANSWER SECTION:
pipe.u.isucon.local.    0       IN      A       10.0.0.3

;; Query time: 9 msec
;; SERVER: 10.0.0.3#53(10.0.0.3) (UDP)
;; WHEN: Sat Nov 30 04:12:22 UTC 2024
;; MSG SIZE  rcvd: 64

通っていそうなことを確認したら、nameserverを指定してbenchを動かす。完走すればOK。

./bench run --enable-ssl --nameserver 10.0.0.3
isucon@isucon13:~$ ./bench run --enable-ssl --nameserver 10.0.0.3
2024-11-30T04:05:54.312Z        info    staff-logger    bench/bench.go:172      SSL接続が有効になっています
2024-11-30T04:05:54.312Z        info    isupipe-benchmarker     SSL接続が有効になっています
2024-11-30T04:05:54.312Z        info    staff-logger    bench/bench.go:193      webapp: https://pipe.u.isucon.local:443
2024-11-30T04:05:54.312Z        info    staff-logger    bench/bench.go:194      nameserver: 10.0.0.3:53
2024-11-30T04:05:54.312Z        info    isupipe-benchmarker     静的ファイルチェックを行います
2024-11-30T04:05:54.312Z        info    isupipe-benchmarker     静的ファイルチェックが完了しました
2024-11-30T04:05:54.312Z        info    isupipe-benchmarker     webappの初期化を行います
2024-11-30T04:06:03.274Z        info    isupipe-benchmarker     ベンチマーク走行前のデータ整合性チェックを行います
2024-11-30T04:06:47.604Z        info    isupipe-benchmarker     整合性チェックが成功しました
2024-11-30T04:06:47.605Z        info    isupipe-benchmarker     ベンチマーク走行を開始します

2024-11-30T04:07:47.682Z        info    staff-logger    bench/bench.go:260      ベンチマーク走行時間: 1m0.07730674s
2024-11-30T04:07:47.682Z        info    isupipe-benchmarker     ベンチマーク走行終了
2024-11-30T04:07:47.682Z        info    isupipe-benchmarker     最終チェックを実施します
2024-11-30T04:07:47.682Z        info    isupipe-benchmarker     最終チェックが成功しました
2024-11-30T04:07:47.682Z        info    isupipe-benchmarker     重複排除したログを以下に出力します
2024-11-30T04:07:47.682Z        info    staff-logger    bench/bench.go:277      ベンチエラーを収集します
2024-11-30T04:07:47.682Z        info    staff-logger    bench/bench.go:285      内部エラーを収集します
2024-11-30T04:07:47.682Z        info    staff-logger    bench/bench.go:301      シナリオカウンタを出力します
2024-11-30T04:07:47.683Z        info    isupipe-benchmarker     配信を最後まで視聴できた視聴者数        {"viewers": 7}
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [シナリオ aggressive-streamer-moderate] 17 回成功
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [シナリオ dns-watertorture-attack] 10 回成功
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [シナリオ streamer-cold-reserve] 39 回成功, 2 回失敗
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [シナリオ streamer-moderate] 18 回成功
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [シナリオ viewer-report] 33 回成功, 4 回失敗
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [シナリオ viewer-spam] 19 回成功
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [シナリオ viewer] 7 回成功
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [失敗シナリオ streamer-cold-reserve-fail] 2 回失敗
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:323      [失敗シナリオ viewer-report-fail] 4 回失敗
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:329      DNSAttacker並列数: 2
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:330      名前解決成功数: 1472
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:331      名前解決失敗数: 5
2024-11-30T04:07:47.683Z        info    staff-logger    bench/bench.go:335      スコア: 2400
HirokiYoshida837 commented 2 days ago

競技用サーバーを2台構築して動くことが確認できたので準備完了