Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

作業スレ #1

Open
23 of 45 tasks
minhquang4334 opened this issue Jul 22, 2022 · 6 comments
Open
23 of 45 tasks

作業スレ #1

minhquang4334 opened this issue Jul 22, 2022 · 6 comments

Comments

@minhquang4334
Copy link
Collaborator

minhquang4334 commented Jul 22, 2022

最初の作業 (40分で終わないといけない)

  • リポジトリを作成する (isucon12q)
  • ポータルサイトにログインしてsshできることを確認
  • インスタンスにログインしてsshできることを確認

インフラ担当

  • ssh-keygenして鍵をdeploy keyに登録する
  • コードをリポジトリにpushする
  • Makefileを適切に修正する
  • Go実装に切り替えてベンチマークを流す (if any)
  • 何もせずにベンチマークを流す
  • Access to each server for fist time pull github
  • nginxで計測できるようにして(alpを使う)、mysqlでSlowlogを計測できるようにする (mysqldumpslowを使う)
    • Mysql の設定をBestPracticesに沿って設定する (my.cnf)
  • 必要なパッケージなどインストール (必須: alp, graphviz)
  • 初回の結果をスコア履歴で投稿する (必須:score, top, alp, slowlog)
    • fix alp command to aggregates api url
  • pprof 設定する
  • ハードウェアの構成を調べ (mysql versionなど, nginx http version)
  • MySQL・画像などのバックアップを開発環境用に作成
  • マニュアルを読み取って気になることを記載する
  • Nginx 通信は Http 1.1で設定したのか
  • Nginx のWorker Connectionsとworker_rlimit_nofileを十分ふやす (=OSの ulimitふやす)
  • 静的ファイルをNginx経由で通信しているか (js/css/gif/ico)
  • NginxのCPUが高すぎる場合、gzipをoffにしておく (試してみて、点数上がれば追加する)
  • Net 通信を設定したのか (/etc/ .cnf) (試してみて、点数上がれば追加する)

アプリケーション担当1

  • スコア履歴と作業スレ作成
  • マニュアルを読み取って、きになることを記載する
  • Web 画面を見て、機能を確認する
  • スキーマ一覧を共有
  • 各テーブルのサイズを共有
  • 各テーブルのレコード数を共有
  • initialize の動作を確認する
  • 気になることや解決しないといけないところ洗い出す

競争中:忘れないといけないこと

インフラ担当

  • Setup Server 3 become to Remote DB (can connect remote)
  • 同じクエリパラメータで同じ結果を返すAPIがあれば、Nginxでちゃんとキャッシューできているか (nginx.confのSectionsでcached_endpointの例を使う) (試してみる)
  • mysql 8 の場合、bin log出力を止めておく (check /var/lib/mysql/)

アプリケーション担当

  • sql.DBに接続する箇所に interpolateParams=true追加する
  • exec.Commandをよく呼ばれている箇所はgolangのライブラリを使う
  • sql.DBに接続するConnections数と Idle Connections数を適切に設定する
  • maxConnections and maxidleConnections の値を調整する (25, 40, 100, 150)
  • jsonを使う場合、gocy-jsonを使うように修正する
  • アプリケーションログを出力しないようにする

終了する時に

  • nginx access log off
  • slow log off
  • off pprof
  • disable unused services (mysql, nginx, app)
  • 再起動試験
    • sudo systemctl reboot
@minhquang4334
Copy link
Collaborator Author

minhquang4334 commented Jul 23, 2022

マニュアル
EC2 インスタンス (c5.large)x 3

NAME: isucon
ACcount ID: 0001

Database Init: ~isucon/webapp/sql/init.sh

一部APIは他のリクエストへの反映までに許容される猶予時間があります

  • POST /api/organizer/competition/:competition_id/finish (3秒の猶予)
    • GET /api/organizer/billing
    • GET /api/admin/tenants/billing
  • POST /api/organizer/player/:player_name/disqualified (3秒の猶予)
    • GET /api/player/:player_name
    • GET /api/player/competition/:competition_id/ranking
    • GET /api/player/competitions

429 Too many Request もあるので、問題ない

スコア計算:https://gist.github.com/mackee/4320c18919c8f6f1867849378a17e651#%E3%82%B9%E3%82%B3%E3%82%A2%E8%A8%88%E7%AE%97

エラーが発生した場合は、負荷走行スコアから (エラーの数 × 1)% が減点されます。ただしCriticalなエラーについては、負荷走行スコアから (エラーの数 × 10)% が減点されます

@minhquang4334
Copy link
Collaborator Author

@minhquang4334
Copy link
Collaborator Author

DROP TABLE IF EXISTS competition;
DROP TABLE IF EXISTS player;
DROP TABLE IF EXISTS player_score;

CREATE TABLE competition (
  id VARCHAR(255) NOT NULL PRIMARY KEY,
  tenant_id BIGINT NOT NULL,
  title TEXT NOT NULL,
  finished_at BIGINT NULL,
  created_at BIGINT NOT NULL,
  updated_at BIGINT NOT NULL
);

CREATE TABLE player (
  id VARCHAR(255) NOT NULL PRIMARY KEY,
  tenant_id BIGINT NOT NULL,
  display_name TEXT NOT NULL,
  is_disqualified BOOLEAN NOT NULL,
  created_at BIGINT NOT NULL,
  updated_at BIGINT NOT NULL
);

CREATE TABLE player_score (
  id VARCHAR(255) NOT NULL PRIMARY KEY,
  tenant_id BIGINT NOT NULL,
  player_id VARCHAR(255) NOT NULL,
  competition_id VARCHAR(255) NOT NULL,
  score BIGINT NOT NULL,
  row_num BIGINT NOT NULL,
  created_at BIGINT NOT NULL,
  updated_at BIGINT NOT NULL
);
  • admin
CREATE DATABASE IF NOT EXISTS `isuports`;
CREATE USER isucon IDENTIFIED BY 'isucon';
GRANT ALL PRIVILEGES ON isuports.* TO 'isucon'@'%';

SET PERSIST local_infile=1;
USE `isuports`;

DROP TABLE IF EXISTS `tenant`;
DROP TABLE IF EXISTS `id_generator`;
DROP TABLE IF EXISTS `visit_history`;

CREATE TABLE `tenant` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `display_name` VARCHAR(255) NOT NULL,
  `created_at` BIGINT NOT NULL,
  `updated_at` BIGINT NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;

CREATE TABLE `id_generator` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `stub` CHAR(1) NOT NULL DEFAULT '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `stub` (`stub`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;

CREATE TABLE `visit_history` (
  `player_id` VARCHAR(255) NOT NULL,
  `tenant_id` BIGINT UNSIGNED NOT NULL,
  `competition_id` VARCHAR(255) NOT NULL,
  `created_at` BIGINT NOT NULL,
  `updated_at` BIGINT NOT NULL,
  INDEX `tenant_id_idx` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;

@minhquang4334
Copy link
Collaborator Author

Initialize reload db

SQLiteのデータベースを初期化

MySQLを初期化

mysql -u"$ISUCON_DB_USER"
-p"$ISUCON_DB_PASSWORD"
--host "$ISUCON_DB_HOST"
--port "$ISUCON_DB_PORT"
"$ISUCON_DB_NAME" < init.sql

rm -f ../tenant_db/.db
cp -r ../../initial_data/
.db ../tenant_db/

@minhquang4334
Copy link
Collaborator Author

Table Size

+---------------+-----------+
| Table         | Size (MB) |
+---------------+-----------+
| visit_history |       265 |
| id_generator  |         0 |
| tenant        |         0 |
+---------------+-----------+
3 rows in set (0.01 sec)



mysql> select count(*) from visit_history
    -> ;
+----------+
| count(*) |
+----------+
|  3225448 |
+----------+

Vist history very big

@minhquang4334
Copy link
Collaborator Author

  • Mỗi lần add tenants sẽ tạo ra 1 db mới của tenant đó tenantsAddHandler

  • connectToTenantDB using sqlite

  • SetCacheControlPrivate
    API

  • テナント管理者向けAPI - 参加者追加、一覧、失格

  • SaaS管理者向けAPI (add tenant, billing)

  • テナント管理者向けAPI - 大会管理, make competition, competition billing

  • // 参加者向けAPI : Get ranking, get info

  • adminDB.SetMaxOpenConns(10)

Problem

  • Tạo mới unique id = sql => có thể dùng go command (dispenseID)
  • Init Sql Logger (initializeSQLLogger) need logger????

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant