ISUCON12äºé¸ã«ã·ã³ã»ã¦ã¼é¦¬å ´ã¼ã¤ã¼2ã¨ãã¦åå ãã2ä½ã§äºé¸çªç ´ãã¾ãã
TL;DR
ISUCON12äºé¸ã«ã·ã³ã»ã¦ã¼é¦¬å ´ã¼ã¤ã¼2 ã¨ãã¦åºå ´ãã¾ããã çµæãäºé¸2ä½ã§æ¬é¸åºå ´ãããã¾ããããã£ããã æçµã¹ã³ã¢ã¯75800ãäºé¸ä¸ã®ãã¹ãã¹ã³ã¢ã¯76525ã§ãããæ¬é¸ãããã°ããï¼
æ¯å¹´ç´ æ´ãããã³ã³ãã¹ããéå¬ãã¦ãã ããéå¶æ§ã«ã¯æè¬ããããã¾ãããæ¬å½ã«ãããã¨ããããã¾ãï¼ï¼ï¼
ä½å¶
ãããã | ãªã¾ã | ãããã | ãã¢ãã |
---|---|---|---|
![]() |
matsuu | ããªããªå®è£ ããåè¡ | ãã©ã¤ãã¼ |
![]() |
netmarkjp | å¸ä»¤å¡+ãã³ãå®è¡+çµæè§£æ | ããã²ã¼ã¿ã¼ |
![]() |
ishikawa84g | ã»ãã¥ãªãã£+æ
å ±å®+åä½ç¢ºèª AppArmorãããã¥ã¢ã«ãå ¬å¼ã¢ãã¦ã³ã¹ã®ææ¡ããã©ã¦ã¶ã§ã®æåç¢ºèª |
ããã²ã¼ã¿ã¼ |
ä»å¹´ã3人ãå¥ã ã®å ´æãããªã¢ã¼ãåå ã§ãã ã³ãã¥ãã±ã¼ã·ã§ã³ã¯Discordã使ã£ã¦ã¾ãã3人ããããã®ç»é¢ãå ±æããªããé³å£°ãã£ããã¤ãªãã£ã±ãªãã§ãã
æå ã®ç°å¢
ã©ãã§ããã話ã§ããç©çã¹ããã¯ã§ãã
é ç® | åå |
---|---|
ã¡ã¤ã³æ© | Mac mini(M1, 2020) NEW! + ã¢ãã¿ã¼2å° |
ãã¼ãã¼ã | Magic Keyboard NEW! |
ãã¦ã¹ | logicool ELGO M575 NEW! |
ã¤ã¤ãã³ | Shokz Aeropex |
ãã¤ã¯ | marantz MPM-1000U |
æ¤ å | Ergohuman Basic NEW! |
å¤ä¸ãçºè¡¨å¾ã«ã¨ããã·ã§é§ãè¾¼ã¿è³¼å ¥ããMac miniã§ããè³¼å ¥è²»ç¨ã¯ISUCONã®åªåè³éã®ååãã§ãï¼ç®ç®ç¨ï¼ã
使ç¨ãããã¼ã«ãªã©
ãã¼ã« | ç¨é |
---|---|
sshrc | sshæ¥ç¶æã«æå ã®ç°å¢ãæã¡è¾¼ããã |
tmux | ã¿ã¼ããã«åå²ãªã© |
neovim NEW! | ã¨ãã£ã¿ |
top | ãªã½ã¼ã¹ä½¿ç¨ç¶æ³ç¢ºèª |
dstat | ãªã½ã¼ã¹ä½¿ç¨ç¶æ³ç¢ºèª |
MySQLTuner | MySQLãã©ã¡ã¼ã¿ç¢ºèª |
kataribe | ã¢ã¯ã»ã¹ãã°è§£æ |
go-mysql-query-digest NEW! | MySQLã¹ãã¼ã¯ã¨ãªã¼è§£æ |
ä»åvimããneovimã«ä¹ãæãã¾ãããè¨å®ã¯ãã¡ãã pt-query-digestãè§£æã«æéãããããã¨ã«æ¥ãç ®ããã¦æä½go-mysql-query-digestãå°å ¥ãã¾ããã
æ¹é
- ãµã¼ãä¸ã§ç´æ¥neovimã§ã½ã¼ã¹ã³ã¼ãã夿´ããã¹ã¿ã¤ã«
- æå ã§ã®åç¾ç°å¢æ§ç¯ãå¤é¨ããã®ãããã¤ã¯è¡ããªã
sshrc
ã§ç°å¢ããã¶ããªãããã«ãã¦ã¡ã³ãã¼ãã¨ã«nvim/sshç°å¢ãåé¢
- å®è£ è¨èªã¯ã¾ãã¯Rustã鏿ãåé¡ãåºããGoã鏿
- è² è·ãã¹ãä¸ã¯
top
ã¨dstat -tlamp
ãç®è¦ç¢ºèª - è² è·ãã¹ãå¾ã«ã¢ã¯ã»ã¹è§£æ
/
ã§git init
/etc
ã¨/home
ã¨è§£æçµæãå«ã/result
ãã¾ããã¨ã³ããã(å¿ è¦ã«å¿ãã¦.gitignoreã§é¤å¤)git add /
ãã¦git commit
- GitHubã®ãã©ã¤ãã¼ããªãã¸ããªã«
git push
ãªãã¸ããªã¯ç«¶æçµäºå¾ã«å ¬éãã¾ããã github.com
æçµæ§æ
å½åã¯1å°ç®ã®ã¿ã使ããæ®ã1æéã®ã¿ã¤ãã³ã°ã§è¤æ°ãµã¼ãã使ãããã«æ§æå¤æ´ãã¾ããã
ãµã¼ã | æ§æè¦ç´ | åè |
---|---|---|
1å°ç® | nginx + app(go) | nginxã¯1å°ç®ã¨3å°ç®ã®appã«round-robin |
2å°ç® | MySQL | åæå®è£ ã®ã¾ã¾ãã¼ã¸ã§ã³å¤æ´ãªã |
3å°ç® | app(go) | 1å°ç®ã®app(go)ã¨åãå®è£ |
ã¡ãªã¿ã«æ¨å¹´ãããªãã¨æ¸ãã¦ãã
— matsuu(ã·ã³ã»ã¦ã¼é¦¬å ´ã¼ã¤ã¼2) (@matsuu) 2021å¹´10æ7æ¥å½åã¯Rustã§é²ãã¦ãããã§ãããç«¶æä¸ã«RustããGoã«åãæ¿ãã¾ãããð¥
ã¹ã³ã¢æ¨ç§»
大ããªé£èºã¯ãªãé å½ã«ããã«ããã¯ãæ½°ãããããªã¹ã³ã¢æ¨ç§»ã«ãªãã¾ããã
ãã³ããã¼ã¯å±¥æ´
ä»åã¯ãã³ããåããåæ°ã¯å°ãªãã«ãªãã¾ããã
ãã£ããã¨
æé ã¹ã³ã¢ æ¦è¦
ã§ã¾ã¨ãã¦ããã¾ãã
10:04 - ééãã¦ãã¼ã¸ãã¢åé¨ãªã¼ã¸ã§ã³ã«CloudFormationã¹ã¿ãã¯ä½æãã¦ãã¾ã
éå§æ©ã ãã£ã¦ãã¾ãã¾ãããæ±äº¬ãªã¼ã¸ã§ã³ã§ä½æãã¹ãCloudFormationã¹ã¿ãã¯ããã¼ã¸ãã¢åé¨ãªã¼ã¸ã§ã³ã§ä½æãã¦ãã¾ãã¾ãããéè¯ãæ©ã段éã§æ°ã¥ãã¦ä½æå®äºããåã«åé¤ãã¦ãã¾ãã
10:06 - æ±äº¬ãªã¼ã¸ã§ã³ã§CloudFormationã¹ã¿ãã¯ãå使
ãã¼ã¸ãã¢åé¨ã§ä½æãã¦ãããã¨ã«æ°ã¥ãã¦æ±äº¬ãªã¼ã¸ã§ã³ã§ä½ãç´ãã¦ãã¾ãã
10:11 - ãµã¼ãã«SSHæ¥ç¶ãç°å¢æ§ç¯
3å°ã®ãµã¼ãã使ããããã¨ã確èªããã®ã§SSHã§æ¥ç¶ãç°å¢æ§ç¯ããã¦ãã¾ããæã
ã¯ãµã¼ãä¸ã§ç´æ¥ç·¨éããã¹ã¿ã¤ã«ã§ãã®ã§ãµã¼ãä¸ã«nvimãç¨æãã¦ãã¾ãã
nvimã¯AppImageã§æã¡è¾¼ãã§ã¾ãããä»å libfuse.so.2
ãã¤ã³ã¹ãã¼ã«ããã¦ãªãã£ãã®ã§ --appimage-extract
ã§å±éãã¾ããã
nvim --appimage-extract rm nvim ln -s squashfs-root/AppRun nvim
10:25 0 Rustã§ååãã³ã失æ
è¨èªãRustã«åãæ¿ãã¦ååãã³ããåãã¾ããã0ç¹ã§ãããdocker composeä¸ã¯runningã«ãªã®ã«æ£å¸¸ã«å¿çã§ããªãåå ã調ã¹ã¦ãããã§ããããªãã¨5åè¿ãçµéãã¦ãcargo buildãã¾ã çµãã£ã¦ãªãã£ãã¨ãããªããã¾ãããå³ãããªRustã
ç¹°ãè¿ãbuildãããã¨ãèããã¨Dockerç°å¢ã§ã¯å³ããã¨å¤æãã¦Dockerãå¥ãã対å¦ãè¡ãã¾ããã*1
å¥ããã¦åãã«ããè¡ãªã£ã¦ããéã«ãã³ãåæºåã¹ã¯ãªããããã³ãå¾è§£æã¹ã¯ãªãããè§£æç¨ã«ãã°åºåãªã©ãæ´åãã¦ãã¾ãã
10:45 2601 Rustã§ãã³ãåæå
éå§ãã45åçµéãã¦ãããããã³ãã«æåãã¾ããã ãã³ãçµæãè§£æããããã®kataribeè¨å®ãã¡ã¤ã«ã®æ´åãªã©ããã®ã¿ã¤ãã³ã°ã§å®æ½ãã¦ãã¾ãã
10:54 - 彿¥ããã¥ã¢ã«èªã¿åãã
@ishikawa84g ãæ´åãã¦ããã彿¥ããã¥ã¢ã«ã¾ã¨ãï¼ãã¬ã¼ã³è³æï¼ã®èªã¿åããããããªã£ã¦ãã¾ããå¿ è¦ãªæ å ±ã ããæ½åºãã¦ãããã®ã§ã¨ã¦ãå©ãã£ã¦ãã¾ãã
11:22 - UUIDã«ããããã¤ãããcargo buildã«ãã£ã¦ã¡ã¢ãªä¸è¶³ã§ãµã¼ããåºã¾ãGoã¸ã®ç§»è¡ã決æ
topã³ãã³ãã§mysqldã®CPU使ç¨çãé«ããã¨ã確èªããã®ã§MySQLã®ã¹ãã¼ã¯ã¨ãªã¼ã確èªãã¦ãã¼ã¯ãªãã¼ãéãåºã id_generator
ãã¼ãã«ã«å¯¾ããã¯ã¨ãªã¼ãé
ããã¨ã確èªãã¦ãã¾ãã
å½åAUTO_INCREMENTã§ããã®ã§ã¯ï¼ã¨èãã¾ããããã¼ãã«ã¾ããã§ã¦ãã¼ã¯ãªIDãå²ãæ¯ã£ã¦ãããã¨ã夿ããããæ ¼ç´å
ã®åãã¼ãã«ã®IDãVARCHAR(255)ã§ãããã¨ã確èªããã®ã§UUIDã§æ ¼ç´ããæ¹éã«ãã¾ãããuuid crateã使ã£ã¦å®è£
ãã¦ãããã§ããâ¦
ããã§ç«¶æãµã¼ã(ã¡ã¢ãª4GB)ä¸ã§nvim+rust-analyzerãéããªããcargo buildãå®è¡ããããã§ã¡ã¢ãªãæ¯æ¸ãSSHæä½ãã§ããªããªãã¾ãããohã¾ãããã¡ã¢ãªè¶³ããªããå³ããã
ãªãã¨ãAWS管çã³ã³ã½ã¼ã«ãããµã¼ããåèµ·åãã¦å¾©æ§ããããã®ã®ããã®ã¾ã¾é²ããã®ã¯é£ããã¨å¤æãã¦Rustè¨èªã諦ããGoè¨èªã¸ã®åãæ¿ããæ±ºæãã¾ããã
11:38 2493 Goã§åãã³ã
Goè¨èªãDockerããå¥ãããä¸ã§åãã³ãã宿½ãã¦ãã¾ãããããããããæã ã®ã¹ã¿ã¼ãã©ã¤ã³ã ã
11:43 3831 UUIDå®è£ ã«åãæ¿ã
Rustå®è£ ã®éã«æ¤è¨ãã¦ããUUIDã¸ã®åãæ¿ãããã®ã¿ã¤ãã³ã°ã§é©ç¨ãã¾ãããã¹ã³ã¢ãã¡ãã£ã¨ä¼¸ã³ã¦ã¾ãã
func dispenseID(ctx context.Context) (string, error) { return uuid.NewString(), nil }
12:06 4936 visit_historyãvisitã«ç½®ãæã
ã¾ã mysqldã®CPUè² è·ãé«ãã®ã§MySQLã®ã¹ãã¼ã¯ã¨ãªã¼ã確èªããã¨ãã visit_history
ãæä¸ä½ã«ãã¦ãããã¨ã確èªããããSELECTãã¦ããã®ã¯1ã¶æãããªãUPDATEãDELETEããªããã¾ãä¸çªæåã®ã¬ã³ã¼ãããå¿
è¦ããªãã¨å¤æããã®ã§ãvisit_historyã¸ã®INSERTãããã¦å¥ãã¼ãã«visit
ãä½ã£ã¦éè¨èªä½ããããå®è£
ã«åãæ¿ãããã¨ã«ãã¾ããã
CREATE TABLE visit ( `tenant_id` BIGINT UNSIGNED NOT NULL, `competition_id` VARCHAR(255) NOT NULL, `player_id` VARCHAR(255) NOT NULL, `created_at` BIGINT NOT NULL, PRIMARY KEY (tenant_id, competition_id, player_id) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4;
åæãã¼ã¿ã¯æµãè¾¼ã¿initializeã§æµãè¾¼ã¿ã
TRUNCATE TABLE visit; INSERT INTO visit (tenant_id, competition_id, player_id, created_at) SELECT tenant_id, competition_id, player_id, MIN(created_at) AS min_created_at FROM visit_history GROUP BY tenant_id, competition_id, player_id;
ããã23ç§è¿ãã¯ã¨ãªã¼ã ã£ãã®ã§ã¡ãã£ã¨ãã¤ãã¤ãã®ã§ãããããã¨ã§æµãè¾¼ã¿ã§ã¯ãªãdump/restoreæ¹å¼ã«ç½®ãæãã¦ãã¾ãã
12:08 æ¼é£ã¿ã¤ã
æ¼é£ã¯ãã£ããã¨ãã¾ããã
12:50 6785 SQLiteã«ã¤ã³ããã¯ã¹è¿½å
åã®å¯¾å¿ã§mysqldã®è² è·ã大ããä¸ãããã¢ããªå´ã®è² è·ã«ãªã£ããã¨ã確èªãã¾ããã
ããã§SQLiteã®ã¾ã¾ã§ã¯å³ããã®ã§ã¯ãªããã¨å¤æãMySQLã¸ã®ç§»è¡ãæ¤è¨ãã¦ãã¾ããwebapp/sql/é ä¸ã«ç§»è¡ã§ä½¿ããsqlite3-to-sql ã¹ã¯ãªãããåå¨ããããããã®ã¾ã¾ä½¿ããã®ã§ã¯ã¨æ¤è¨ãã§ããããã®åã«ã¾ãã¯SQLiteã«ã¤ã³ããã¯ã¹ããªãã£ãã®ã§ã¤ã³ããã¯ã¹ã追å ãã¾ãããã¤ã³ããã¯ã¹ã¯MySQLã«ç§»è¡ãã¦ãå©ç¨ã§ãã¾ããããã
CREATE INDEX player_score_idx1 ON player_score (tenant_id, competition_id, player_id, row_num DESC); CREATE INDEX player_score_idx2 ON player_score (tenant_id, competition_id, row_num DESC); CREATE INDEX competition_idx1 ON competition (tenant_id, created_at DESC); CREATE INDEX player_idx1 ON player (tenant_id, created_at);
SQLiteã®åæåã«ã¯initial_dataé ä¸ãã³ãã¼å ã«ãªã£ã¦ããã®ã§initial_dataé ä¸ã®dbãã¡ã¤ã«ã«ã¤ã³ããã¯ã¹ã追å ãã¾ãéæDBã追å ãããã®ã§webapp/tenant/10_schema.sqlã«ãä¸è¨ãçãè¾¼ãã§ãã¾ãã
14:05 5164 rankingã®N+1ãè§£æ¶
ã¤ã³ããã¯ã¹ã追å ãã¦isuportsããã»ã¹ã®%CPUã¯ä¸ãã£ããã®ã®ãsysã¨iowaitã¯ä¸ãããªããã¨ã確èªã䏿¦ã¾ãã¯SQLã®æ¹åãã§ããªããã¨èãã¦rankingã®æ¹åããæ¤è¨ãã¦ãã¾ããã¾ãrankingå ã®N+1ã¨ãªã£ã¦ããé¨åãè§£æ¶ããã¦ãã¾ãã
N+1ã®è§£æ¶ã¯ã¹ã³ã¢ãä¸ãã£ã¦ãã¾ã£ãã®ã§ãããããã¯æ¬¡ã®å¸ç³ã®ããå¿ è¦ã«ãªãã¨å¤æãã¦ãã®ã¾ã¾ç¶è¡ãã¦ãã¾ãã
14:43 13349 SQLiteã®ãã¼ã¿ãMySQLã«ç§»è¡ãã¤ã¤æçµã¹ã³ã¢è¨é²ç¨ãã¼ãã«ã®ä½æ
tenantDBã®åãã¼ãã«ã«ã¯tenant_idã«ã©ã ãå«ã¾ãã¦ãããã¡ãã¨ãã¼ã¿ãå ¥ã£ã¦ããã®ã§ããã¼ãã«ãåããå¿ è¦ã¯ãªãã¨å¤æãã¦1ã¤ã®ãã¼ãã«ã«ãã¹ã¦éç´ãããã¨ã«ãã¾ããã webapp/sql/sqlite3-to-sqlã使ã£ã¦åæãã¼ã¿ã®å ¨ãã¼ãã«ãMySQLã«æµãè¾¼ãã§ãã¾ãã
MySQLã¸ã®ãã¼ã¿æµãè¾¼ã¿ã«æéãããããã¨ãæ³å®ãã
for f in initial_data/*.db ; do echo $f ; webapp/sql/sqlite3-to-sql $f | mysql -u isucon -pisucon isuports ; done
ãªãããã®å®è¡ã«ã¨ã¦ãæéããããã®ã§ãããredo logã®ç¡å¹åãªã©ããããªã£ã¦å¦çã®è»½éåããããªã£ã¦ãã¾ãã
/etc/apparmor.d/usr.sbin.mysqld
/dev/shm/ r, /dev/shm/** rwk,
/etc/mysql/mysql.conf.d/mysqld.cnf
# æ¬çªç°å¢ã§ãã£ã¦ã¯ãããªã innodb_log_file_size = 64M innodb_doublewrite = 0 innodb_flush_log_at_trx_commit = 0 innodb_flush_log_at_timeout = 3 innodb_log_group_home_dir = /dev/shm
2022/07/31追è¨ï¼7/27ã«ãªãªã¼ã¹ãããMySQL 8.0.30ã§ãä¸è¨ãã©ã¡ã¼ã¿ããã®ã¾ã¾é©ç¨ã¯ã§ããªããªã£ã¦ãã¾ãããæ°ãã¤ããã ããã
-- æ¬çªç°å¢ã§ãã£ã¦ã¯ãããªã ALTER INSTANCE DISABLE INNODB REDO_LOG;
ã½ã¼ã¹ã³ã¼ããæ³¨ææ·±ãèªãã ã¨ãããå¿ è¦ãªã®ã¯tenant, competition, playerãã¨ã«æçµã¹ã³ã¢ã ãã ã¨å¤æã§ããã®ã§ããããè¨é²ããããã®last_player_scoreãã¼ãã«ã使ãã¾ããã
CREATE TABLE last_player_score ( 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, INDEX last_player_score_idx1 (tenant_id, competition_id, score DESC, row_num ASC), PRIMARY KEY (tenant_id, player_id, competition_id) );
player_scoreã«ã¯ãã§ã«ããããã®ã¬ã³ã¼ããç»é²ããã¦ãããããããlast_player_scoreãå«ãããã¼ã¿ã®çæãæ¯åinitializeã§ãã£ã¦ããã¨æéãããããã£ã¦ãè¶³ããªãã®ã§ãplayer, last_player_scoreã¯mysqldumpããçµæãinitializeæã«æµãè¾¼ãããã«ãã¦ãã¾ãã
INSERT INTO last_player_score SELECT tenant_id, player_id, competition_id, score, row_num, created_at, updated_at FROM player_score WHERE (tenant_id, player_id, competition_id, row_num) IN (SELECT tenant_id, player_id, competition_id, MAX(row_num) FROM player_score GROUP BY tenant_id, player_id, competition_id);
mysqldump -u isucon -pisucon isuports player > ~/webapp/sql/admin/player.dump mysqldump -u isucon -pisucon isuports last_player_score > ~/webapp/sql/admin/last_player_score.dump
15:04 20303 ã¤ã³ããã¯ã¹ã®è¿½å ã¨interpolateParamsãè¨å®
SQLiteããMySQLã«ç§»è¡ããã®ã«åããã¦ããã«ããã¯ãåã³MySQLã«ãªãã¯ããã¾ããã MySQLã®ã¹ãã¼ã¯ã¨ãªã¼ãã°ãè§£æãã¦ã¤ã³ããã¯ã¹ã追å ããã¾ãPrepareãä¸ä½ã«ããã®ã§Goå®è£ ã®å®çªè¨å®ã§ããinterpolateParams=trueã追å ãã¾ããã
ALTER TABLE player ADD INDEX (tenant_id, created_at DESC);
15:18 15672 competitionãMySQLã¸ç§»åãã¦SQLiteæ¤å»
ã¾ã SQLiteãå©ç¨ãã¦ããcompetitionãã¼ãã«ãMySQLã¸ç§»åããã¾ãããçµæã¨ãã¦ã¹ã³ã¢ã¯ä¸ããã¾ãããæ¹åæ§ã¯ééã£ã¦ããªãã¯ãã¨å¤æãã¦ãã®ã¾ã¾çªãé²ãã§ãã¾ãã
15:32 34464 åå è åãAPIã®N+1ãè§£æ¶ãã
å¼ãç¶ã MySQLã®ï¼
CPUãé«ãã®ã§ã GET /api/player/player/:player_id
ã§å¼ã°ãã¦ããcompetitionããã¼ã¹ã¨ããN+1ãJOINãããã¨ã§è§£æ¶ããã¦ãã¾ãã
15:54 43629 flockãå¤ãã¦ãã©ã³ã¶ã¯ã·ã§ã³å®è£ ã«å¤æ´
SQLiteã使ããªãå®è£ ã«ã¯åãæ¿ãã¦ãããã®ã®ãã¾ã flockã®åé¤ã¯è¡ã£ã¦ããããflockãåå ã¨æãããä½è¨ãªé å»¶ãã¢ã¯ã»ã¹ãã°ã®è§£æçµæã§ç¢ºèªãã¦ãã¾ããã ãã®ããflockãå¤ãã¤ã¤ãåé¡ãåºãªãããã«ãã©ã³ã¶ã¯ã·ã§ã³å¦çãå®è£ ãã¾ããã
16:03 44383 INSERT playerå¾ã®SELECTãåé¤
playerã¸INSERTããéãINSERTããçµæãSELECTããå®è£ ã«ãªã£ã¦ãã¾ããããINSERTæã«IDå«ãå¿ è¦ãªæ å ±ã¯ãã¹ã¦æã£ã¦ãããããSELECTãè¡ããªãå®è£ ã«å¤æ´ãã¾ããã
16:42 44268 last_player_scoreã®ãããããã¯å¯¾ç
æããéãå¢ãã¦ããã¨last_player_scoreã®DELETEãã¦ããINSERTããå¦çã§ãããããã¯ãçºçãã¦ãã¾ããã ãã®äºè±¡ã¯ä»å¹´ã®kayac社å ISUCONã§ãçºçããäºè±¡ã§ããããããé²âã¼ãã§ãã£ãã¨ããã ï¼ãã¨ãªã以ä¸ã®ããã«å¤æ´ãã¦ãã¾ãã
- 夿´åï¼ã¬ã³ã¼ããDELETEãã¦ããREPLACE
- 夿´å¾ï¼ã¬ã³ã¼ããREPLACEãã¦ããå¤ãã¬ã³ã¼ããDELETE
16:52 44051 scoreã®N+1ãé¨åçã«è§£æ¶ãã
ã¢ã¯ã»ã¹ãã°ãè§£æããã¨scoreãä¸ä½ã«æ¥ã¦ããã®ã§ãN+1ãå¯è½ãªç¯å²ã§è§£æ¶ããã¾ãããã¹ã³ã¢ã¸ã®å½±é¿ã¯å¾®å¦ã§ããããã®ã¾ã¾ã¨ãã¦ãã¾ãã
17:15 63991 ãµã¼ãåå²ï¼1å°â2å°æ§æï¼
ã¾ã æ¹åã§ããä½å°ã¯è¦ã¤ãã¦ã¯ãããã®ã®ãæ®ãã®æéå ã§ããã«è§£æ¶ã§ãããã«ãªãã£ãã®ã§ããã®ã¿ã¤ãã³ã°ã§ã¢ããªã¨DBã®ãµã¼ããåãããã¨ã«ãã¾ãããããã¾ã§ã¯1å°ã§å¦çãã¦ãã¾ããã
ãµã¼ã | 夿´å | 夿´å¾ |
---|---|---|
1å°ç® | nginx + app(go) + MySQL | nginx + app(go) |
2å°ç® | å©ç¨ãªã | MySQL |
3å°ç® | å©ç¨ãªã | å©ç¨ãªã |
æã ã®ãã¼ã ã¯åºæ¬çã«ãµã¼ãåå²ã¯ãããã¨ããªããªã£ããçµç¤ã«ãªã£ã¦ããè¡ãããã«ãã¦ãã¾ãããã®çç±ã¯ããã«ããã¯ã¨ãªãç®æã¯éæå¤ããã®ã§ãåºç¤ã«åå²ãã¦ãããã«ããã¯æ¬¡ç¬¬ã§è¼ãæ¿ãç´ãå¿ è¦ãã§ã¦ããå¯è½æ§ãããããã§ãã
17:24 62301 POST scoreã§ç©ºãã¼ã¿ãæããããå ´åã«å¯¾å¦
空ãã¼ã¿ãæãããã¦ã¨ã©ã¼ã«ãªãç¶æ³ãçºçããã®ã§ç©ºã§ãã¨ã©ã¼ã«ãªããªããã対å¦ãã¾ããã
17:39 72760 ãµã¼ãåå²ï¼2å°æ§æâ3å°æ§æï¼
å¼ãç¶ãããã«ããã¯ã¯MySQLã®ããã«è¦ããã®ã§ããããã³ãã®å¾åã§appå´ã®è² è·ãä¸ããã·ã¼ã³ãçºçãã¦ãããã¨ã確èªããã®ã§ã3å°ç®ã«ãappãè¨ç½®ãã¾ãããçµæã¹ã³ã¢ãããã«ä¼¸ã³ããã¨ã確èªãã¦ãã¾ãã
ãµã¼ã | 夿´å | 夿´å¾ |
---|---|---|
1å°ç® | nginx + app(go) | nginx + app(go) |
2å°ç® | MySQL | MySQL |
3å°ç® | å©ç¨ãªã | app(go) |
17:47 76525 åèµ·å対å¿ã¨å種ãã°ç¡å¹å
åèµ·åæã®app-db鿥ç¶ã®åé¡ãåé¿ããããç§ä¼ã®ã¿ã¬ã§ãã StartLimitBurst
ã/etc/systemd/system/isuports.serviceã«æå
¥ãã¦ãã¾ãããããã¤ã³ãã©å±ãããéç¨ã§ã«ãã¼ä½æ¦ã ã
[Service] StartLimitBurst=999
ãã®ä»ãå種ãã°ã®ç¡å¹åãè¡ããã¹ãã¹ã³ã¢ã¯76525ã§ãããåèµ·åå¾ã«å度ãã³ããè¡ã75800ãæçµã¹ã³ã¢ã¨ãªã£ã¦ããã¾ãã
*1:å¾ãã確èªããã¨targetãregistryã¯volumesã¨ãã¦ãã¦ã³ããã¦ãã®ã§dockerå ã§ã®cargoåãã«ãã¯ä¸å¿ã±ã¢ããã¦ããæ¨¡æ§