127 views
# ISUCON13 当日用 初動まとめ 転記 ## リンク集 - Grafana メトリクス http://g.isucon.ikura-hamu.work/d/aaee4b4e-1317-4d73-895f-59c4fed3bcb0/isucon?orgId=1&refresh=5s - user: `admin` - password: `reactive` - Grafana systemdのログ http://g.isucon.ikura-hamu.work/d/d8a18ab6-d6c8-4778-8fb8-d1919d2c6fb9/log?orgId=1&refresh=5s - adminer http://a.isucon.ikura-hamu.work/?server=s1&username=isucon - user: `reactive` - password: `reactive` - Prometheus http://pro.isucon.ikura-hamu.work/graph?g0.expr=&g0.tab=1&g0.stacked=0&g0.show_exemplars=0&g0.range_input=1h - スプレッドシート https://docs.google.com/spreadsheets/d/1E7EnZRK4FkVZg6ZHqu7c2T5xCQ0KonsBqf34Ea2hc3Y/edit?usp=sharing - pprotein http://p.isucon.ikura-hamu.work/#/group/ - github https://github.com/reactive-futakotamagawa/isucon13 --- - もしもの時のMD https://hackmd.io/p8WueKggSQmcBsGtA9GciA?view - oribeさんの講習会 https://hackmd.io/@oribe/BkGXfhKj5 - NaruseJunチートシート https://hackmd.io/Gc1eohcqS4SRNglveyjkbA - ことしの講習会 https://isucon-workshop.trap.show/?ref=trap.jp --- ## 初動 :::spoiler **Goのバージョンを上げる** :::success ```bash which go wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz rm -rf /home/isucon/local/go tar -C /home/isucon/local -xzf go1.21.4.linux-amd64.tar.gz rm go1.21.4.linux-amd64.tar.gz sudo nano .profile export PATH=$PATH:$HOME/local/go/bin ``` ::: - H1rono pproteinをコードに仕込む。 - https://github.com/reactive-futakotamagawa/private-isu/commit/8a0dafcbbaec7c51378fb78f03a2f293835b6fc4 - ↑initializeのURLは、http://p.isucon.ikura-hamu.work からコピーしたやつ - `go mod tidy` - `go build -o {ファイル名}` - `sudo systemctl restart {サービス名}` - ベンチマークを回す **pikachu サーバーに入って、設定を読む** :::success **絶対パスで** 注意: systemctlでCGroupの親プロセスを確認しておく、Dockerかどうかも確かめる。 - Git管理するリポジトリの絶対パス - `/home/isucon` - nginxのサービス名 - `sudo systemctl status nginx.service` - `nginx` - dbのサービス名 - `sudo systemctl status mysql.service` - `` - アプリのサービス名 - `sudo systemctl list-units -t service | grep -e go -e isu` を参考に。 - `isupipe-go` - プログラムが置かれてるディレクトリ - `/home/isucon/webapp/go` - バイナリのパス - `/home/isucon/webapp/go/isupipe` - Goのパス - `/home/isucon/local/golang/bin/go` - 環境変数のファイルのパス - `/home/isucon/env.sh` ::: - ikura-hamu がansible(init)の設定を入力し実行 - 実行待ちの間に計測機器にIPアドレス入れる --- - H1rono 暇な時間が出来たら 問題設定/マニュアル/コード を読む :::spoiler **pikachu Git管理を始める** :::success ``` # Go追加 # Sql追加 # マニュアル追加 # Public追加 git add webapp/sql/initdb.d git add webapp/go git add s1/etc/nginx/nginx.conf git add s1/etc/nginx/sites-available/* git add s1/etc/mysql/mysql.conf.d/mysqld.cnf git add s1/env.sh git commit -m ":tada: init s1" git push git fetch git reset --hard 09cd6d0308f5b4bc4f336b78e6cc2fac363e24c8 git add s2/etc/nginx/nginx.conf git add s2/etc/nginx/sites-available/* git add s2/etc/mysql/mysql.conf.d/mysqld.cnf git add s2/env.sh git commit -m "s2" git push git fetch git reset --hard b4a0d15873dc9e72d292a98ee3b7323a6fe12fdf git add s3/etc/nginx/nginx.conf git add s3/etc/nginx/sites-available/* git add s3/etc/mysql/mysql.conf.d/mysqld.cnf git add s3/env.sh git commit -m "s3" git push ``` - (MariaDBなら) `s*/etc/mysql/mariadb.conf.d/50-server.cnf` - `s*/環境変数ファイル` - systemdのファイル類(`s*/etc/systmed/system`)は必要になったとき? ::: - ikura-hamu 今回の問題用の設定を反映したansibleを配る --- - ikura-hamu エンドポイントごとにデーターベースの操作をまとめる :::spoiler **pikachu nginx MySQL ログ出力と秘伝のタレ** :::success MySQL ``` slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 0 log-queries-not-using-indexes skip-log-bin skip-innodb-doublewrite max_allowed_packet = 200M max_connections = 5000 # ディスクイメージをメモリ上にバッファさせる値をきめる設定値 (別鯖なら搭載メモリの80%くらい) innodb_buffer_pool_size = 3000MB # InnoDBの更新ログを記録するディスク上のファイルサイズ(innodb_buffer_pool_sizeの4分の1程度) innodb_log_file_size = 500MB # innoDBの更新ログを保持するメモリ(default: 8MB)、大量のデータの更新に効く innodb_log_buffer_size = 100MB # 1に設定するとトランザクション単位でログを出力するが 2 を指定すると1秒間に1回ログファイルに出力するようになる innodb_flush_log_at_trx_commit = 0 # データファイル、ログファイルの読み書き方式を指定する (OSによるディスクキャッシュとの2重キャッシュを防ぐ) innodb_flush_method = O_DIRECT # ORDER BYやGROUP BYのときに使われるメモリ量 innodb_sort_buffer_size = 100MB ``` nginx ``` # nginx worker の設定 worker_rlimit_nofile 8192; events { worker_connections 4096; # 128より大きくするなら、 max connection 数を増やす必要あり。さらに大きくするなら worker_rlimit_nofile も大きくする(file descriptor数の制限を緩める) # multi_accept on; # error が出るリスクあり。defaultはoff。 # accept_mutex_delay 100ms; use epoll; # 待受の利用メソッドを指定(基本は自動指定されてるはず) } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format ltsv "time:$time_local" "\thost:$remote_addr" "\tforwardedfor:$http_x_forwarded_for" "\treq:$request" "\tstatus:$status" "\tmethod:$request_method" "\turi:$request_uri" "\tsize:$body_bytes_sent" "\treferer:$http_referer" "\tua:$http_user_agent" "\treqtime:$request_time" "\tcache:$upstream_http_x_cache" "\truntime:$upstream_http_x_runtime" "\tapptime:$upstream_response_time" "\tvhost:$host"; access_log /var/log/nginx/access.log ltsv; error_log /var/log/nginx/error.log; # 基本設定 sendfile on; tcp_nopush on; tcp_nodelay on; types_hash_max_size 2048; server_tokens off; open_file_cache max=100 inactive=20s; # file descriptor のキャッシュ。入れた方が良い。 # proxy buffer の設定。白金動物園が設定してた。 proxy_buffers 100 32k; proxy_buffer_size 8k; # Keepalive 設定 # ベンチマークとの相性次第ではkeepalive off;にしたほうがいい # keepalive off; keepalive_requests 20000; keepalive_timeout 600s; http2_max_requests 20000; http2_recv_timeout 600s; lingering_close always; lingering_time 600s; lingering_timeout 600s; # Proxy cache 設定。使いどころがあれば。1mでkey8,000個。1gまでcache。 # proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=zone1:1m max_size=1g inactive=1h; # proxy_temp_path /var/cache/nginx/tmp; ```