Closed HirokiYoshida837 closed 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でインスタンスに付与してあげる。
以下のスクリプトを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する。
毎度のことながらxbuildに時間がかかるので、provisioning時だけインスタンスサイズを上げたほうがいい。 (忘れていてまた30分くらいかけてしまった)
構築したインスタンスを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
standalone構成(インスタンス内にapp, benchが同居) は動いた。 benchを別サーバーにする構成で動かす。
bench / app を別構成にする手順
isucon@isucon13:~$ cat env.sh
ISUCON13_MYSQL_DIALCONFIG_NET="tcp"
ISUCON13_MYSQL_DIALCONFIG_ADDRESS="127.0.0.1"
ISUCON13_MYSQL_DIALCONFIG_PORT="3306"
ISUCON13_MYSQL_DIALCONFIG_USER="isucon"
ISUCON13_MYSQL_DIALCONFIG_DATABASE="isupipe"
ISUCON13_MYSQL_DIALCONFIG_PARSETIME="true"
ISUCON13_POWERDNS_SUBDOMAIN_ADDRESS="10.0.0.3" # <- ここのsubdomain addressを bench用サーバーからみたIPに変更。
ISUCON13_POWERDNS_DISABLED="false"
変更した状態で、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
競技用サーバーを2台構築して動くことが確認できたので準備完了
isucon13を練習する。