ã“ã®ãƒ–ãƒã‚°ã¯ç§»è»¢ã—ã¾ã—ãŸ
下記ã«ç§»è»¢ã—ã¾ã—ãŸã€‚
ISUCON8予é¸1日目ã«ãƒãƒ¼ãƒ 「SELinuxã¯Enforcing以外ã‚ã‚Šå¾—ãªã„ã€ã§å‚åŠ ã—ã¦æœ€çµ‚スコアã¯26,221ã§ã—ãŸ
ã‚‚ã¯ã‚„ã“ã®ãƒ–ãƒã‚°ã¯ISUCONå‚åŠ è¨˜ã«æˆã‚Šä¸‹ãŒã£ã¦ã—ã¾ã£ã¦ã¾ã™ãŒã€‚
今年も@ishikawa84g ã€@netmarkjpã€@matsuuã®3人ã§ISUCON8ã«æŒ‘ã‚“ã§ãã¾ã—ãŸã€‚ã“ã®ã‚¹ã‚³ã‚¢ã˜ã‚ƒä»Šå¹´ã‚‚本é¸é€²å‡ºã¯é›£ã—ãã†ã§ã™ã。ãŒã£ãã—。
ãƒãƒ¼ãƒ åã®ã¨ãŠã‚Šã€Disabledã ã£ãŸSELinuxã¯Enforcingã«ã—ã¦ãƒ•ã‚£ãƒ‹ãƒƒã‚·ãƒ¥ã§ã™ã€‚
ã‚„ã£ãŸã“ã¨
3人ã§ä½œæ¥åˆ†æ‹…ã‚’ã—ã¦ãŸã®ã§ã€åŸºæœ¬çš„ã«è‡ªåˆ†ãŒã‚„ã£ãŸã“ã¨ã‚’ã¾ã¨ã‚ã¾ã™
- ベンãƒå‰ã®æº–備スクリプトã¨ãƒ™ãƒ³ãƒå¾Œã®é›†è¨ˆã‚¹ã‚¯ãƒªãƒ—ト(kataribe, pt-query-digest)を用æ„
- getEvent内ã®N+1ã‚’ã‚„ã£ã¤ã‘ã‚‹
- ORDER BY RAND()を消ã—ã¦ã¿ãŸã‚‚ã®ã®ãƒ©ãƒ³ãƒ€ãƒ ã˜ã‚ƒãªã„ã¨æ€’られるã®ã§å·®ã—戻ã—
- sheetsã¯å¢—減ã—ãªã„上ã«sheet_idã‹ã‚‰ç®—出ã§ãã‚‹ã®ã§ã€ã§ãã‚‹ã ã‘利用ã—ãªã„よã†ã«å®Ÿè£…変更(sheetsã²ã£ãºãŒã—)
- /api/users/:id ã®N+1ã‚’ã‚„ã£ã¤ã‘ã‚‹
- 残å¸æ•°(remain)ã¯eventsã«ã‚«ãƒ©ãƒ ã‚’è¿½åŠ ã—ã¦æ ¼ç´ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ã—ãŸã‚‚ã®ã®ã€ãƒ‡ãƒƒãƒ‰ãƒãƒƒã‚¯ãŒç™ºç”Ÿã™ã‚‹ã®ã§remainsテーブルを別途作æˆã—ã¦æ ¼ç´ã™ã‚‹ã‚ˆã†ã«ï¼ˆã—ã‹ã—最終的ã«failã«ãªã‚‹ã®ã§å·®ã—戻ã—)
- /api/events/:id/actions/reserve 内㮠ORDER BY RAND() をやらãªã„ãŸã‚ã«å…¨sheetã«ä¹±æ•°ã®ã‚«ãƒ©ãƒ ã¨ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’è¿½åŠ ã—ã¦ã‚½ãƒ¼ãƒˆã™ã‚‹ã‚ˆã†ã«ï¼ˆã—ã‹ã—最終的ã«failã«ãªã‚‹ã®ã§å·®ã—戻ã—)
- 1å°ç›®ã®h2oã¨webappã¨mariadbã¯ãã®ã¾ã¾ã€2å°ç›®ã¨3å°ç›®ã«webappを稼åƒã•ã›ã€/initializeã®ã‚¢ã‚¯ã‚»ã‚¹ä»¥å¤–ã¯2å°ç›®ã¨3å°ç›®ã«æŒ¯ã‚‹ã‚ˆã†ã«å®Ÿè£…変更(ã—ã‹ã—最終的ã«failã«ãªã‚‹ã®ã§å·®ã—戻ã—)
ã¾ã¨ã‚
上記スクリーンショットã«ã‚‚ã‚ã‚‹ã¨ãŠã‚Šã€ç›´å‰ã§ã‚‚success/failã—ã¦ãŠã‚Šãªã‹ãªã‹åŽ³ã—ã„内容ã§ã—ãŸã€‚
今回ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã‚’ãã¡ã‚“ã¨æ„è˜ã—ãŸä¸Šã§æ”¹ä¿®ã§ãã‚‹ã‹ãŒè‚ã ã£ãŸã¨ã®èªè˜ãªã®ã§ã™ãŒã€ã‚る程度性能ãŒä¸ŠãŒã£ã¦ãã‚‹ã¨failãŒç™ºç”Ÿã—ã¦ã—ã¾ã„ã€çµå±€å¤ã„コミットã«ã¾ã§å·®ã—戻ã—ã¦ï¼ˆãã‚Œã§ã‚‚ãŸã¾ã«failãŒå‡ºã‚‹ï¼‰ç„¡é›£ãªã‚¹ã‚³ã‚¢ã§ãƒ•ã‚£ãƒ‹ãƒƒã‚·ãƒ¥ã›ã–ã‚‹ã‚’å¾—ãªã„苦ã—ã„展開ã§ã—ãŸã€‚ã¤ã‚‰ã„。
自分ã§å¤‰æ›´ã—ãŸå®Ÿè£…ã«å•é¡ŒãŒã‚ã£ãŸå¯èƒ½æ€§ãŒ9割以上ã‚ã‚‹ã®ã§ã™ãŒã€ã‚‚ã—ã‹ã—ãŸã‚‰Go実装ã§getEvents内ã®getEvent呼ã³å‡ºã—ãŒåŒä¸€ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³ã«ãªã£ã¦ã„ãªã‹ã£ãŸã®ãŒã‚る種ã®ç½ ã«ãªã£ã¦ã„ãŸã®ã§ã¯ãªã„ã‹ã¨è€ƒãˆã¦ã„ã¾ã™ã€‚ã‚‚ã—ã‹ã—ãŸã‚‰getEventsã®N+1を退治ã™ã‚Œã°çµæžœã¨ã—ã¦è§£æ¶ˆã—ãŸã®ã§ã¯ã¨æ€ã†ã¨ã€ã†ãƒ¼ã‚“æ‚”ã—ã„。å•é¡ŒãŒå…¬é–‹ã•ã‚ŒãŸã‚‰è¿½è©¦ã—よã†ã¨æ€ã„ã¾ã™ã€‚
手を抜ã実装ã«ã—ãŸã‚‰ã—ã£ã‹ã‚Šãƒ™ãƒ³ãƒãƒžãƒ¼ã‚«ãƒ¼ãŒæ¤œçŸ¥ã—ã¦ã¦ãƒ ムムやるãªã€ã¨æ€ã‚ãšå”¸ã‚‹è‰¯ã„実装ã ã£ãŸã¨æ€ã„ã¾ã™ã€‚ã™ã¹ã¦ã®ã‚µãƒ¼ãƒãƒ¼ã‚µã‚¤ãƒ‰ãƒ—ãƒã‚°ãƒ©ãƒžãƒ¼ã¯ãƒˆãƒ©ãƒ³ã‚¶ã‚¯ã‚·ãƒ§ãƒ³å‡¦ç†ã¨ã¯ã©ã†ã„ã†ã“ã¨ã‹ã¨ã„ã†ã®ã‚’å¦ã¶è‰¯ã„æ•™æã«ãªã‚‹ã®ã§ã¯ãªã„ã§ã—ょã†ã‹ã€‚ã¿ã‚“ãªéŽåŽ»å•ã‚„ã‚ã†ãªã€‚
ISUCON7予é¸1日目ã«ãƒãƒ¼ãƒ 「ãƒãƒã‚¦ã€ã§å‚åŠ ã—ã¦æœ€çµ‚スコアã¯205148ã§ã—ãŸ
Webサービスをã„ã„æ„Ÿã˜ã«ãƒ‘フォーマンスãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°ã™ã‚‹ã‚³ãƒ³ãƒ†ã‚¹ãƒˆ
ISUCON7予é¸1日目㫠@netmarkjp, @ishikawa84g, @matsuu ã§ãƒãƒ¼ãƒ 「ãƒãƒã‚¦ã€ã«ã¨ã—ã¦å‚åŠ ã—ã¾ã—ãŸã€‚最終スコア㯠205148 ã§ã—ãŸã€‚
考察
netmarkjp
- 例年通りã®å½¹å‰²åˆ†æ‹…ãŒã—ã£ã‹ã‚Šæ©Ÿèƒ½ã—ã¦æ°—æŒã¡ã‚ˆãã§ããŸ
- 視点を変ãˆãŸã‚Šä¼‘憩ã¨ã£ãŸã‚ŠãŒã„ã„æ„Ÿã˜ã«ã§ããŸ
- 去年ã®ä½•ã‚‚ã§ããªã‹ã£ãŸç„¡å¿µã¯å¤šå°‘供養ã§ããŸ
- ç·´ç¿’ã‚’ãã¡ã‚“ã¨æ´»ã‹ã›ãŸ
- ベンãƒãŒå®‰å®šã—ã¦ã¦ã™ã”ãよã‹ã£ãŸ
- BGMã¯æ±äº¬ã‚¹ã‚«ãƒ‘ラダイスオーケストラã§ã—ãŸ
matsuu
- トラフィックãŒãƒœãƒˆãƒ«ãƒãƒƒã‚¯ã«ãªã‚‹å•é¡Œã‚’ãªã‹ãªã‹è§£æ±ºã§ããšã«ã„ãŸãŒã€Cache-Controlã«publicを入れるã“ã¨ã‚’æ€ã„ã¤ã‘ãŸ
- 304å¿œç”ãŒå®‰å®šã—ã¦ç™ºç”Ÿã—ãªã„ç†ç”±ãŒç”Ÿæˆã•ã‚Œã‚‹ç”»åƒã®æ›´æ–°æ—¥æ™‚ãŒã‚µãƒ¼ãƒæ¯Žã«ç•°ãªã‚‹ãŸã‚ã§ã‚ã‚‹ã“ã¨ã«æ°—ã¥ã‘ãŸè‡ªåˆ†ã‚’褒ã‚ã¦ã‚ã’ãŸã„
- tcpdumpã§ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚’tcpdumpã—ã¦ã¿ãŸã®ãŒå¤§ãã‹ã£ãŸ
- Pixiv社内ISUCONを使ã£ã¦ã˜ã£ãã‚Šãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°ã—ãŸã¨ãã®çµŒé¨“ãŒã¨ã¦ã‚‚å½¹ã«ç«‹ã£ãŸã€‚ã‚ã‚ŠãŒã¨ã†Pixiv
- Discordãƒãƒ£ãƒƒãƒˆãŒçµæ§‹ã‚ˆã‹ã£ãŸã€‚ゲームã˜ã‚ƒãªãã¦ã‚‚ã“ã†ã„ã£ãŸã‚¤ãƒ™ãƒ³ãƒˆã«ã¨ã¦ã‚‚å‘ã„ã¦ã„ã‚‹ã¨æ€ã†ã®ã§ã‚ªã‚¹ã‚¹ãƒ¡
- NEW GAME!!ã‚’åˆã‚ã¦è¦‹ãŸãŒã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ã‚ã‚‹ã‚ã‚‹ã§ã‚°ãƒƒã¨ããŸã€‚ãªã‚‹ã»ã©ã€‚
ishikawa84g
- Microsoft Wireless Display Adapter ã¯ä¾¿åˆ©ã€‚
- ãŸã ã—ã€6時間ãらã„連続稼åƒã™ã‚‹ã¨ãƒãƒ³ã‚°ã™ã‚‹ã“ã¨ã‚‚ã‚るよã†ã§ã™ã€‚ã—ã°ã‚‰ãå¯ã‹ã›ã‚‹ã¨å¾©æ´»ã—ãŸã€‚
- 開始時間ãŒä¼¸ã³ã¦ã„ãŸãŒæ…Œã¦ãšãƒªãƒ©ãƒƒã‚¯ã‚¹ã—ã¦é–‹å§‹ã§æ¥ãŸã€‚(æµçŸ³ã¿ã‚“ãªãƒˆãƒ©ãƒ–ル慣れã—ã¦ã„ã‚‹ãœï¼)
- Discordã§ãŠã™ã™ã‚ã•ã‚ŒãŸNEW GAME!ã¯3話ã¾ã§è¦‹ã¾ã—ãŸã€‚
- 常ã«ç·Šå¼µçŠ¶æ…‹ã‚ã‚‹å¿…è¦ã¯ãªãã€ç· ã‚ã‚‹ã¨ã“ã‚ã‚’ç· ã‚ã‚Œã°å•é¡Œãªã—ï¼
- Discordã®ã‚³ãƒžãƒ³ãƒ‰ã«FF14ã®Wikiを検索ã™ã‚‹ã¨ã‹ã‚ã£ãŸã€‚
最終構æˆ
[nginx -- (varnish) -- gunicorn]x2 -- [mysql]x1
- 当åˆæ§‹æˆã‹ã‚‰ã‚ã¾ã‚Šå¤‰ãˆãš
- ベンãƒå…ˆã¯å…ˆé 2å°
- ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ãƒœãƒˆãƒ«ãƒãƒƒã‚¯ã®é–“ã¯3å°ã«æŒ¯ã£ãŸã‘ã©ã€çµå±€DBサーãƒã®CPUãŒè¶³ã‚Šãšæˆ»ã—ãŸ
- 投稿ã•ã‚ŒãŸç”»åƒã¯é™çš„ファイルã¨ã—ã¦å‡ºåŠ›ã—ã€nginxã§é™çš„ファイルを返å´
/icons/*
ã¯ãƒ•ã‚¡ã‚¤ãƒ«ã«å‡ºåŠ›ã—基本的ã«nginxã‹ã‚‰ã€‚ãªã‘ã‚Œã°varnishを経由ã—ã¦ã‚¢ãƒ—リã§ãƒ•ã‚¡ã‚¤ãƒ«ç”Ÿæˆ- ãã®ä»–ã®ãƒ‘スã¸ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã¯varnishを経由ã›ãšç›´æŽ¥gunicornã¸
- varnishã¯
/icons/*
ã®Thunerding Herd対ç–ã¨ã—ã¦å°Žå…¥ - ãã®ä»–MySQLã€nginxã€ã‚¢ãƒ—リã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°ã‚’実施
事å‰æº–å‚™
ãƒãƒ¼ãƒ 内体制ã®æ§‹ç¯‰
- ãƒãƒ£ãƒƒãƒˆã¯Slackã§
- gitリãƒã‚¸ãƒˆãƒªã¯ Gitlab.com ã§
- 使ã£ãŸã“ã¨ãŒãªã„ツールを使ã£ã¦ã¿ã‚ˆã†ã¨ã„ã†ã“ã¨ã§ç’°å¢ƒæ§‹ç¯‰ã¯itamaeã§ãƒ—ãƒãƒ“ジョニング
- åˆæœŸæ§‹ç¯‰ä»¥é™ã¯çŸæœŸæ±ºæˆ¦ã®ãŸã‚itamaeã§ç®¡ç†ã—ãªã„
- git pushベースã®CIプãƒãƒ“ジョニングã¯å®Ÿæ–½ã—ãªã„
- 事å‰ç·´ç¿’ã§è©¦ã—ãŸã‚‚ã®ã®çŸæœŸæ±ºæˆ¦ã§ã¯ã©ã†ã‚„ã£ã¦ã‚‚é…ã„
- サーãƒã§ç›´æŽ¥Vimを使ã£ã¦ç·¨é›†
- ä»–ã®äººãŒç·¨é›†ã—ã¦ã‚‹å ´åˆã¯
vim -R
ã§å‚ç…§
- ä»–ã®äººãŒç·¨é›†ã—ã¦ã‚‹å ´åˆã¯
環境構築用レシピを用æ„
itamaeを使ã£ã¦ä»¥ä¸‹ã®ãƒ—ãƒãƒ“ジョニングを自動化
- githubã‹ã‚‰SSH公開éµã‚’å–å¾—ã€è¨å®š
- 以下ã®è§£æžãƒ„ールをインストール
- dstat
- kataribe
- MySQLTuner
- netdata
- Percona Toolkit pt-query-digestã®ãŸã‚
- gprof2dot Pythonã®WSGIプãƒãƒ•ã‚¡ã‚¤ãƒ©Werkzeugã®ã‚°ãƒ©ãƒ•åŒ–ツール
- 以下ã®ãƒŸãƒ‰ãƒ«ã‚¦ã‚§ã‚¢ã‚’インストール
- ベンãƒãƒžãƒ¼ã‚¯ã‚’ã‹ã‘ã‚‹å‰ã®åˆæœŸåŒ–処ç†/ã‹ã‘ãŸå¾Œã®è§£æžå‡¦ç†ã‚’実行ã™ã‚‹ã‚¹ã‚¯ãƒªãƒ—トを用æ„
- åˆæœŸåŒ–処ç†
- MySQLスãƒãƒ¼ã‚¯ã‚¨ãƒªãƒ¼ãƒã‚°ã‚’削除ã—ã¦
mysqladmin flush-logs
- nginxã®ã‚¢ã‚¯ã‚»ã‚¹ãƒã‚°ã‚’削除ã—ã¦
systemctl reload nginx
- アプリプãƒãƒ•ã‚¡ã‚¤ãƒ©ã®å‡ºåŠ›ã‚’削除ã—ã¦ã‚¢ãƒ—リケーションプãƒã‚°ãƒ©ãƒ ã®å†èµ·å‹•
- MySQLスãƒãƒ¼ã‚¯ã‚¨ãƒªãƒ¼ãƒã‚°ã‚’削除ã—ã¦
- 解æžå‡¦ç†
- MySQLスãƒãƒ¼ã‚¯ã‚¨ãƒªãƒ¼ã«å¯¾ã—ã¦
pt-query-digest
を実行 - MySQLTunerを実行
- nginxã®ã‚¢ã‚¯ã‚»ã‚¹ãƒã‚°ã«å¯¾ã—ã¦
kataribe
を実行 - pythonプãƒãƒ•ã‚¡ã‚¤ãƒ©Werkzeugã®å‡ºåŠ›ã«å¯¾ã—ã¦
gprof2dot
ã¨graphviz
を実行ã—ã¦ã‚°ãƒ©ãƒ•ç”Ÿæˆ
- MySQLスãƒãƒ¼ã‚¯ã‚¨ãƒªãƒ¼ã«å¯¾ã—ã¦
- åˆæœŸåŒ–処ç†
éŽåŽ»å•ã‚’解ã„ã¦äºˆè¡Œæ¼”ç¿’
事å‰å…¬é–‹ã®ãƒ¬ã‚®ãƒ¥ãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã‚’熟èª
大事
当日作æ¥
9:00 - 10:00
集åˆ
é›»æºã€æ¤…åã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ã®è¨å–¶ã¾ã§ã‚„ã£ã¦ã€ã‚ã¨ã¯ãƒžãƒƒã‚¿ãƒª
大事ãªã®ã¯æ¨ªä¸¦ã³ã«åº§ã‚‹ã“ã¨
11:30 昼食
è½ã¡ç€ã„ã¦ç¾Žå‘³ã—ã„昼食。ãƒãƒ³ãƒãƒ¼ã‚¬ãƒ¼ç”»åƒã‚’å‚åŠ è€…ãƒãƒ£ãƒƒãƒˆã«æŠ•ä¸‹
12:00 - 13:00 ※開始å‰
ISUCONå‚åŠ è€…å°‚ç”¨ãƒãƒ£ãƒƒãƒˆã§NEW GAME!!ã®è©±é¡ŒãŒç››ã‚Šä¸ŠãŒã£ãŸãŸã‚Amazonビデオã§è¦–è´é–‹å§‹
13:00 開始予定時刻
ãƒãƒ¼ã‚¿ãƒ«ã‚µã‚¤ãƒˆãŒ...オープンã—ãªã„
13:10 é‹å–¶ã‚ˆã‚ŠDiscordã§ç·Šæ€¥é€£çµ¡
methane - 今日 åˆå¾Œ1時10分 ã‚‚ã†ã¡ã‚‡ã£ã¨ã€ã”ã‚ã‚“ï¼
13:13 開始
SSH接続ã§ããªã„トラブルã«è¦‹èˆžã‚れるもã®ã®ã€ãã®é–“ã«åˆå›žãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯å®Ÿè¡Œã¨å½“日レギュレーションを熟èª
13:30 ãƒã‚°ã‚¤ãƒ³å¾Œ
予ã‚用æ„ã—ã¦ã„ãŸç’°å¢ƒæ§‹ç¯‰ãƒ¬ã‚·ãƒ”を実行
並行ã—ã¦ã€å„マシンã®ã‚¹ãƒšãƒƒã‚¯ã¨ã€ä½¿ã‚ã‚Œã¦ã„るミドルウェアを確èª
サービスã®ç”»é¢ã‚’見ãŸã‚Šã‚³ãƒ¼ãƒ‰ã‚’èªã‚“ã§ã€ã©ã‚“ãªã‚¢ãƒ—リãªã®ã‹ã–ã£ãり把æ¡
ãƒãƒ¼ã‚¿ãƒ«ä¸Šã§ã‚µãƒ¼ãƒãŒé™é †ã§ä¸¦ã‚“ã§ã¦ã€ã€Œå…ˆé 2å°ã€ãŒã©ã‚Œãªã®ã‹ã¡ã‚‡ã£ã¨æ··ä¹±ã—ãŸ
MySQLã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°ã§/dev/shmã«æ ¼ç´ã—よã†ã¨ã—ãŸã¨ã“ã‚AppArmorã«å¼•ã£ã‹ã‹ã£ãŸãŸã‚ã€AppArmorを調整
/etc/apparmor.d/usr.sbin.mysqld
ã«ä»¥ä¸‹ã‚’追記
# ISUCON2017 /dev/shm/ r, /dev/shm/** rw, /proc/** r, /sys/devices/system/node/ r, /sys/devices/system/node/** r,
変更後ã€Profileをリãƒãƒ¼ãƒ‰ã—ã€MySQLã‚’å†èµ·å‹•ã™ã‚‹ã€‚
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld sudo systemctl restart mysql.service
14:01 webappé…下をgit管ç†ã«
pythonã§å®Ÿè£…ã™ã‚‹æ–¹é‡ã«ã—ãŸãŸã‚ã€publicディレクトリã¨pythonディレクトリをgitã«çªã£è¾¼ã¿commit
14:08 インデックス追åŠ
スãƒãƒ¼ã‚¯ã‚¨ãƒªãƒ¼ã‹ã‚‰é…ã„リクエストを調ã¹ã¦ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹è¿½åŠ
ALTER TABLE image ADD INDEX (name); ALTER TABLE message ADD INDEX (channel_id);
14:30
一瞬ã ã‘1ä½ç²å¾—
https://twitter.com/matsuu/status/921609614881202178
netdata見ãŸã®ã¯ã“ã®é ƒã¾ã§ã§ã€ã‚ã¨ã¯dstatã¨top
tmuxã§3å°åˆ†ä¸¦ã¹ã¦è¡¨ç¤ºã€‚æ“作ã¯tmuxã®synchronized-paneã§æ¥½ã€…実施
14:33 /icons/ã®é™çš„ファイル化
DBã«æ ¼ç´ã•ã‚Œã¦ã„ã‚‹ç”»åƒãƒ‡ãƒ¼ã‚¿ã‚’é™çš„ファイルã¨ã—ã¦å‡ºåŠ›ã™ã‚‹å®Ÿè£…ã‚’è¡Œã†
def get_images(): cur = dbh().cursor() cur.execute("SELECT name, data FROM image") for row in cur.fetchall(): output = "/home/isucon/images/{}".format(row['name']) with open(output, 'wb') as file: file.write(row['data'])
出力ã—ãŸç”»åƒã¯nginxã‹ã‚‰ç›´æŽ¥å¿œç”ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´
location /icons/ { expires 60s; alias /home/isucon/images/; try_files $uri @upstream; } location @upstream { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:5000; }
14:34é ƒ DBã¨ã‚¢ãƒ—リ間ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯æ”¹å–„
dstatã§è¦‹ã¦ã„ã‚‹ã¨DBã¨WEBã®é–“ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå¤šã„ã®ã«ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚«ãƒ¼ã¨WEBã®é–“ã®ãƒˆãƒ©ãƒ•ã‚£ãƒƒã‚¯ãŒå°‘ãªã„ã“ã¨ã«æ°—ã¥ã。
åŒã˜å†…容ã®ç”»åƒãŒåŒã˜ãƒ•ã‚¡ã‚¤ãƒ«åã§é‡è¤‡ç™»éŒ²ã•ã‚Œã¦ãŠã‚Šç„¡é§„ã«DBã‹ã‚‰ã®å–å¾—ãŒç™ºç”Ÿã—ã¦ã„ã‚‹ã“ã¨ã«æ°—ã¥ã„ãŸã®ã§1è¡Œã ã‘å–å¾—ã™ã‚‹ã‚ˆã†ä¿®æ£
cur.execute("SELECT * FROM image WHERE name = %s", (file_name,)) cur.execute("SELECT * FROM image WHERE name = %s LIMIT 1", (file_name,))
14:57 é™çš„ファイルã®gzip_static化
é™çš„ファイルを予ã‚gzipã—ã¦ä¿å˜ã—ã¦ãŠãã€nginxã® gzip_static
ã§å¿œç”ã™ã‚‹ã‚ˆã†ã«
gzip_static on; gzip_types image/svg+xml text/css text/javascript application/javascript application/font-wof f application/vnd.ms-fontobject;
15:21é ƒ ç”»åƒã‚’生æˆã™ã‚‹
ç”»åƒã‚’INSERT時やSELECT時ã«å‡ºåŠ›ã™ã‚‹ã‚ˆã†å¤‰æ›´ã€‚
ã—ã‹ã—サーãƒã”ã¨ã«ç”»åƒã‚’生æˆã™ã‚‹å®Ÿè£…ã®ãŸã‚ã“ã®å¾Œã—ã°ã‚‰ãスコアãŒä¼¸ã³æ‚©ã‚€
- ç”»åƒã«expiresを付ã‘ã¦ã¿ã‚‹â†’多少改善ã™ã‚‹ã‚‚ã®ã®æ ¹æœ¬è§£æ±ºã«ã¯ãªã‚‰ãš
- /fetchã®1秒待機を外ã—ã¦ã¿ã‚‹â†’効果ãªã—
- 206レスãƒãƒ³ã‚¹ã‚’è¿”ã—ã¦Rangeヘッダーã§è¿”ã›ã°ã„ã„ã®ã§ã¯ï¼Ÿâ†’206å¿œç”ã‚’ç°¡å˜ã«å®Ÿè£…ã™ã‚‹æ–¹æ³•ãŒã‚ã‹ã‚‰ãš
- limit_rateã§ä»£ç”¨ã—ãŸã‚‰ã‚¿ã‚¤ãƒ アウト
- 302リダイレクトã§å¿œç”ã‚’é…らã›ã‚Œã°ã„ã„?→302リダイレクトã¯ã‚¨ãƒ©ãƒ¼ã«ãªã£ãŸ
17:24é ƒ /fetchã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°
SQLを見直ã—ã¦N+1を解消
SELECT channel.id AS channel_id, CASE WHEN message_id IS NULL THEN (SELECT COUNT(*) FROM message WHERE channel_id = channel.id) ELSE (SELECT COUNT(*) FROM message WHERE channel_id = channel.id AND message_id < id) END AS unread FROM channel LEFT JOIN haveread ON channel.id = haveread.channel_id AND user_id = ?
18:17é ƒ ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«ç”Ÿæˆæ™‚ã«æ›´æ–°æ—¥æ™‚ã‚’åˆã‚ã›ã‚‹
ベンãƒãƒžãƒ¼ã‚¯ã‹ã‚‰ã®HTTPリクエストをtcpdumpã§è¨˜éŒ²ã—ã¦ã©ã®ã‚ˆã†ãªãƒªã‚¯ã‚¨ã‚¹ãƒˆãŒå±Šã„ã¦ã„る確èªã—ã¦ã¿ã‚‹
tcpdump -w dump tcp port 80
ãã®çµæžœã‚’Wiresharkã«é£Ÿã‚ã›ã¦ç¢ºèªã—ã¦ã„ãŸã¨ã“ã‚ã€If-Modified-Sinceヘッダーを見ã¤ã‘ã¦æ€ã„ã¤ã„ãŸã€‚
「画åƒãƒ•ã‚¡ã‚¤ãƒ«ã®æ›´æ–°æ—¥æ™‚ã‚’åˆã‚ã›ã¦ãªã„ã‹ã‚‰304å¿œç”ã‚’è¿”ã›ã¦ã„ãªã„ã®ã ã€ã¨ã€‚エウレカï¼
def write_image(data, name): output = "/home/isucon/images/{}".format(name) with open(output, 'wb') as file: file.write(data) os.utime(output, (1508559193, 1508559193))
1508559193
㯠2017/10/21 13:13:13
ã€ISUCON7予é¸1日目ã®é–‹å§‹æ—¥æ™‚。
18:33
帯域ãŒå¤šå°‘マシã«ãªã£ãŸã®ã§webサーãƒã®CPUè² è·ã‚’下ã’ã‚‹ãŸã‚ã« gzip off
18:51é ƒ /messageã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°
SQLを見直ã—ã¦N+1を解消
if last_message_id > 0: cur.execute("SELECT message.id, name, display_name, avatar_icon, message.created_at, content FROM message JOIN user ON message.user_id = user.id WHERE message.id > %s AND channel_id = %s ORDER BY message.id DESC LIMIT 100", (last_message_id, channel_id)) else: cur.execute("SELECT message.id, name, display_name, avatar_icon, message.created_at, content FROM message JOIN user ON message.user_id = user.id WHERE channel_id = %s ORDER BY message.id DESC LIMIT 100", (channel_id, ))
19:00é ƒ ç”»åƒãƒ•ã‚¡ã‚¤ãƒ«ç”Ÿæˆæ™‚ã®å‡ºåŠ›å…ˆã‚’/dev/shm/ã«ã™ã‚‹
with tempfile.TemporaryFile(dir="/dev/shm/") as f:
19:10 Pythonプãƒãƒ•ã‚¡ã‚¤ãƒ©Werkzeugã®å°Žå…¥
打ã¤æ‰‹ãŒå°‘ãªããªã£ã¦ããŸã®ã§Werkzeugã§ã®ãƒ—ãƒãƒ•ã‚¡ã‚¤ãƒ«ã‚’実施。
from werkzeug.contrib.profiler import ProfilerMiddleware app.wsgi_app = ProfilerMiddleware(app.wsgi_app, profile_dir="/tmp/profile")
gprof2dotを使ã£ã¦dotファイルを生æˆã—ã€graphvizを使ã£ã¦pngファイルを生æˆã€‚
gprof2dot -f pstats --colour-nodes-by-selftime --show-samples /tmp/profile/* > profile.dot dot -Tpng profile.dot > profile.png
19:48é ƒ rapidjsonã®å°Žå…¥
Werkzeugã«ã‚ˆã‚‹ãƒ—ãƒãƒ•ã‚¡ã‚¤ãƒ«ã®çµæžœã€JSON生æˆã«æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã‚‹ã“ã¨ãŒåˆ¤æ˜Žã—ãŸãŸã‚ã€flask.jsonify()ã‚’rapidjsonã«å·®ã—替ãˆã€‚
20:15é ƒ WSGIサーãƒã‚’meinheldã«å·®ã—替ãˆâ†’å·®ã—戻ã—
WSGIサーãƒã‚’gunicornã‹ã‚‰meinheldã¸å·®ã—替ãˆã¦ã¿ãŸã‚‚ã®ã®å¤§å¹…ã«æ€§èƒ½ãŒä¸‹ãŒã‚Šæ–念。
20:27
sleep対応ã§gunicornã®ãƒ¯ãƒ¼ã‚«ãƒ¼ã‚’減らã—ã¦ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’大幅ã«UP
/etc/systemd/system/isubata.python.service
ã§--workers=1 --threads=1000
ã¨è¨å®š
20:31 MySQLパラメータ調整
アプリå´ã§ Too many connections
ãŒå‡ºã¦ã„ãŸã®ã§MySQLè¨å®šå¤‰æ›´
max_connections = 8192
㨠open_files_limit ã‚’è¨å®š- /lib/systemd/system/mysql.service ã«
LimitNOFILE=65535
を追記
20:35é ƒ テンプレートエンジンJinja2ã®ãƒãƒ¥ãƒ¼ãƒ‹ãƒ³ã‚°
jinja2ã®bytecode_cacheを有効ã«
app.jinja_options = app.jinja_options.copy()
app.jinja_options['bytecode_cache'] = jinja2.FileSystemBytecodeCache()
20:49 ç”»åƒãƒ‡ãƒ¼ã‚¿ã®è¨ç½®å‘¨ã‚Šã‚’ä¿®æ£
アップãƒãƒ¼ãƒ‰ã•ã‚ŒãŸç”»åƒã‚’tmpファイルã«å‡ºåŠ›ã—ãŸéš›ã«æœ€çµ‚çš„ãªè¨ç½®å ´æ‰€ã«ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯
os.link(f.name, output)
20:50éŽãŽ å†èµ·å‹•ãƒ†ã‚¹ãƒˆ
å†èµ·å‹•ãƒ†ã‚¹ãƒˆå®Ÿæ–½
å†èµ·å‹•å¾Œã«ãƒ™ãƒ³ãƒå®Ÿè¡Œã—ãŸã‚‰ã‚¹ã‚³ã‚¢ãŒä¹±é«˜ä¸‹ã—ãŸã®ã§ã„ã„æ„Ÿã˜ã«ãªã‚‹ã¾ã§ç¹°ã‚Šè¿”ã—ベンãƒå®Ÿè¡Œ
ä¸Žè² è·å´ãŒå®‰å®šã—ã¦ã¦é«˜é€Ÿã§åŠ©ã‹ã£ãŸ
21:07 ベストスコアãŒã§ã‚‹ã¾ã§ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚’ç¹°ã‚Šè¿”ã™
本日ã®ãƒ™ã‚¹ãƒˆã‚¹ã‚³ã‚¢ 205148
ãŒå‡ºã¦æ“声
21:13 終了
ãŠç–²ã‚Œæ§˜ã§ã—ãŸã€‚
書ç±ã€ŒLinuxステップアップラーニングã€
著者ã§ã‚ã‚‹ @ryosuke927 ã•ã‚“ã‹ã‚‰ã”æµè´ˆã«ä¸Žã‚Šã¾ã—ãŸã€‚æ„Ÿè¬ã€‚
Linuxステップアップラーニング
- 作者: 沓å亮典
- 出版社/メーカー: 技術評論社
- 発売日: 2017/04/11
- メディア: 大型本
- ã“ã®å•†å“ã‚’å«ã‚€ãƒ–ãƒã‚°ã‚’見る
Ubuntu 16.04 LTSをベースã«Linuxã®åŸºæœ¬æ“作をå¦ã¹ã‚‹åˆå¿ƒè€…å‘ã‘書ç±ã§ã™ãŒã€ã“ã®æœ¬ã®ç´ 晴らã—ã„ã¨ã“ã‚ã¯ã»ã¼ã™ã¹ã¦ã‚·ã‚§ãƒ«ã§ã®æ“作方法をã¾ã¨ã‚上ã’ã¦ã‚‹ã¨ã“ã‚。ç¾å ´ä¸»ç¾©ã®ä¸€å†Šã¨ã—ã¦ç´ 晴らã—ã„。
環境構築ã¨ã—ã¦VirtualBoxを紹介ã™ã‚‹ã®ã‚‚ç†ã«ã‹ãªã£ã¦ã‚‹ã‚“ã§ã™ã‚ˆã。ドライãƒãªã©æœ¬ç‹ã¨ã¯ç•°ãªã‚‹éƒ¨åˆ†ã§èº“ãã®ã¯å®Ÿã«ã‚‚ã£ãŸã„ãªã„ã®ã§ç¾å®Ÿçš„ã§è‰¯ã„ã¨æ€ã„ã¾ã™ã€‚
ãŸã ã€ã“ã®æ›¸ç±ã®1ã¤æ®‹å¿µãªã¨ã“ã‚ã¯ã€pp.12-13ã®ã€Œä¸»ãªLinuxディストリビューションã€ã«GentooãŒãªã„ã¨ã“ã‚ã§ã™ã。マジã‹ã€‚今やChromebook*1ã‚„Dockerホスト*2ã€Pepperå›*3ãªã©ã§ä¸–界をå¸å·»ã—ã¤ã¤ã‚ã‚‹Gentooç³»OSãŒç´¹ä»‹ã•ã‚Œãªã„ãªã‚“ã¦ã€ç§ã¯æ‚²ã—ã„。
4/11発売ã§ã™ã€‚å£ç¯€æŸ„ã€æ–°äººæ•™è‚²ã«ã‚‚最é©ã ã¨æ€ã„ã¾ã™ã€‚是éžã¨ã‚‚ã”検討ãã ã•ã„。
ISUCON6本é¸ã§å誉é‹å–¶ã¨ã—ã¦ãŠæ‰‹ä¼ã„ã—ã¦ãã¾ã—ãŸ
@matsuu #isucon ã”å”力ã„ãŸã ãèª ã«ã‚ã‚ŠãŒã¨ã†ã”ã–ã„ã¾ã—ãŸï¼ãƒãƒ¼ãƒ ã¨ã—ã¦ã¯æ®‹å¿µãªçµæžœã¨ãªã‚Šã¾ã—ãŸãŒã€äºˆé¸ã«ãŠã„ã¦å¤šå¤§ãªã‚‹ã”尽力をã„ãŸã ãã¾ã—ãŸã®ã§matsuuã•ã‚“ã‚’å誉é‹å–¶ã¨ã—ã¦æœ¬é¸ã«ã”招待ã—ãŸã„ã¨æ€ã„ã¾ã™ï¼ˆæœ¬é¸å‡ºå ´ã§ã¯ãªãé‹å–¶ã¨ã—ã¦ã®å‚åŠ ã§ã™ï¼‰ã”検討ãã ã•ã„ã¾ã›
— ISUCONå…¬å¼ (@isucon_official) 2016å¹´9月18æ—¥
ã“ã®è©±ã‚’é ‚ã„ãŸæ™‚ã¯æ£ç›´ã€Œå誉é‹å–¶ã¨ã¯ã€ã¨æ€ã£ãŸã®ã§ã™ãŒã€æœ¬é¸ã«é€²ã‚€ã¤ã‚‚ã‚Šã§äºˆå®šã‚‚é–‹ã‘ã¦ãŸã—ã¨äºŒã¤è¿”事ã§å¼•ãå—ã‘ã‚‹ã“ã¨ã«ã—ã¾ã—ãŸã€‚
本é¸é‹å–¶ã®ãŠæ‰‹ä¼ã„ã¨ã—ã¦ã‚„ã£ãŸã“ã¨ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šã€‚
Azure関連
Azureã®ç‰¹æ€§ã‚’è¸ã¾ãˆãŸä¸Šã§ã®æ§‹æˆæ¤œè¨Žã‚„ワンクリックデプãƒã‚¤ã®ãŸã‚ã®ãƒ†ãƒ³ãƒ—レート作æˆãªã©ã‚’è¡Œã„ã¾ã—ãŸã€‚
予é¸ã§ã¯ãƒ‡ãƒ—ãƒã‚¤ã®ä»•çµ„ã¿ã«customData使ã‚ã‚Œã¦ã„ã¾ã—ãŸãŒã€customDataã¯å®Ÿè¡Œã‚¹ã‚¯ãƒªãƒ—トをbase64ã«å¤‰æ›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã€å¤‰æ›´ã®ãŸã³ã«æ‰‹é–“ãŒã‹ã‹ã‚‹ã®ã§ã€カスタムスクリプト拡張機能を用ã„ã¦ãƒ‡ãƒ—ãƒã‚¤ã™ã‚‹ã“ã¨ã«ã—ã¾ã—ãŸã€‚
customDataã¯Ubuntuãªã©ä¸€éƒ¨ã®Linuxã§ã—ã‹å‹•ä½œã—ãªã„ãŸã‚ã€ã‚«ã‚¹ã‚¿ãƒ スクリプト拡張を利用ã™ã‚‹ã®ãŒã‚ªã‚¹ã‚¹ãƒ¡ã§ã™ã€‚
ã¾ãŸã€ã›ã£ã‹ãã ã‹ã‚‰Azureã®ã‚µãƒ¼ãƒ“スを有効活用ã—よã†ã¨ã®æµã‚Œã‹ã‚‰ã€Azureã®Log Analyticsを用ã„ã¦ç«¶æŠ€è€…ã®å„サーãƒã«メトリックス情報を収集する拡張機能もインストールã™ã‚‹ã‚ˆã†ã«ã—ã¾ã—ãŸã€‚
ISUCON用ã®azureインスタンスã§OMS Agent(==fluentd)ãŒå‹•ã„ã¦ã‚‹ãžâ€¦â€¦ï¼
— tagomoris (@tagomoris) 2016å¹´10月22æ—¥
ãã†ãã‚Œãれ。ã§ã‚‚実ã¯ç§ã®ãƒŸã‚¹ã§OMSå´ãŒã†ã¾ãå‹•ã‹ãªã‹ã£ãŸã‚“ã§ã™ã‘ã©ã…。
CIã®æ§‹ç¯‰
本é¸ã®æº–å‚™ã¯GitHubã®ãƒ—ライベートリãƒã‚¸ãƒˆãƒªã§é€²ã‚ã¦ã„ãŸã®ã§ã™ãŒã€Azureã®ãƒ¯ãƒ³ã‚¯ãƒªãƒƒã‚¯ãƒ‡ãƒ—ãƒã‚¤ã‚’実ç¾ã™ã‚‹ãŸã‚ã«ã¯å…¬é–‹é ˜åŸŸã«ãƒ†ãƒ³ãƒ—レートを置ãå¿…è¦ãŒã‚ã‚‹ã“ã¨ã¨ã€ãƒ‡ãƒ—ãƒã‚¤ç”¨ã®ãƒ•ã‚¡ã‚¤ãƒ«ä¸€å¼ã‚’固ã‚ãŸãƒ•ã‚¡ã‚¤ãƒ«ã‚’生æˆã™ã‚‹å¿…è¦ãŒã‚ã£ãŸãŸã‚ã€CI環境を作æˆã—ã¾ã—ãŸã€‚
CIサービスã¯ãƒ—ライベートリãƒã‚¸ãƒˆãƒªã§ã‚‚ç„¡æ–™ã§ä½¿ãˆã‚‹Werckerを採用ã—ã¾ã—ãŸã€‚
ã¾ãŸã€ä»Šå›žã®æœ¬é¸ã¯Docker環境ã ã£ãŸã®ã§ã™ãŒã€Dockerã®ãƒ“ルドãŠã‚ˆã³å‹•ä½œãƒ†ã‚¹ãƒˆã‚’è¡Œã†ãŸã‚ã«åˆ¥é€”Jenkinsサーãƒã‚‚用æ„ã—ã¾ã—ãŸã€‚Dockerã®ãƒ†ã‚¹ãƒˆã«Werckerを使用ã—ãªã‹ã£ãŸã®ã¯ã€ç¾çŠ¶Dockerのビルド環境としてWerckerは使えないãŸã‚ã§ã™*1。
Python実装
本é¸ã®Python実装ã¯ç§ãŒæ‹…当ã•ã›ã¦ã„ãŸã ãã¾ã—ãŸã€‚
ç§ãŒæœ¬è·ãƒ—ãƒã‚°ãƒ©ãƒžãƒ¼ã ã£ãŸé ƒã¯ä¸»ã«Perl/PHPを生æ¥ã¨ã—ã¦ãŠã‚Šã€ã‚¤ãƒ³ãƒ•ãƒ©ã‚¨ãƒ³ã‚¸ãƒ‹ã‚¢ãªä»Šã¯ã¡ã‚‡ã£ã¨ã—ãŸãƒ„ール作æˆã«Pythonを書ãã“ã¨ãŒå¤šã„ã‚‚ã®ã®Pythonã§Webアプリケーションを実装ã—ãŸçµŒé¨“ã¯ã»ã¼ã‚¼ãƒã€‚ã¨ã¦ã‚‚ä¸å®‰ã§ã—ãŸãŒãªã‚“ã¨ã‹å®Ÿè£…ã™ã‚‹ã“ã¨ãŒã§ãã¾ã—ãŸã€‚
当åˆã¯Twistedベースã®å®Ÿè£…ã‚’ä¾é ¼ã•ã‚ŒãŸã®ã§ã™ãŒã€ç€æ‰‹ã—ã¦ã¿ãŸã¨ã“ã‚自分ã®åŠ›é‡ã§ã¯ç„¡ç†ã ã¨åˆ¤æ–ã—ã€Flaskã§å®Ÿè£…ã—ãªãŠã—ã¦ã„ã¾ã™ã€‚
ã¾ãŸã€Python3+Gunicorn(sync)ã ã¨Server Side Eventsã®å®Ÿè£…ã§yield周りãŒã†ã¾ãå‹•ã‹ãšã€ã‚®ãƒªã‚®ãƒªã«ãªã£ã¦æ€¥é½Python2+Gunicornã«ç½®ãæ›ãˆãŸã‚Šã—ã¾ã—ãŸã€‚
残念ãªãŒã‚‰Pythonで予選を通過したチームはいなかったよã†ãªã®ã§èª°ã‹ã‚‰ã‚‚試ã•ã‚Œã¦ã„ãªã„å¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚ã‚‚ã—良ã‹ã£ãŸã‚‰Python実装ã§å•é¡Œã‚’解ã„ã¦ã¿ã¦ãã ã•ã„ã。
自分ã®çŸ¥è¦‹ã«åŸºã¥ãアドãƒã‚¤ã‚¹
ãã®ä»–ã€è‡ªåˆ†ã®çŸ¥è¦‹ã«åŸºã¥ã„ãŸã‚¢ãƒ‰ãƒã‚¤ã‚¹ã‚’ã„ãã¤ã‹ã•ã›ã¦ã„ãŸã ãã¾ã—ãŸã€‚
途ä¸ã‹ã‚‰ã®é‹å–¶å‚åŠ ã§è‰²ã€…ã¨å£ã‚’挟むã¨å¿«ãæ€ã‚ãªã„人もã„ã‚‹ã‹ã‚‚ã—ã‚Œãªã„ã¨æ€ã„ã€ã‚ã¾ã‚Šå‡ºã—ゃã°ã‚‰ãªã„よã†ã«å¿ƒãŒã‘ã¦ã¾ã—ãŸã€‚
ã§ã‚‚çµæžœã¨ã—ã¦å‡ºã—ゃã°ã£ã¦ã¾ã—ãŸã。ã”ã‚ã‚“ãªã•ã„ã”ã‚ã‚“ãªã•ã„。
ã„ã‚„ãé‹å–¶ã£ã¦ã“ã‚“ãªã«å¤§å¤‰ã ã£ãŸã‚“ã§ã™ã
ç§ã¯ãŸã ã®ãŠæ‰‹ä¼ã„è¦å“¡ã§ã—ãŸãŒã€ãã‚Œã§ã‚‚çµæ§‹å¤§å¤‰ã§ã—ãŸã€‚ISUCONé‹å–¶ã£ã¦ã“ã‚“ãªã«å¤§å¤‰ã ã£ãŸã‚“ã§ã™ã。
ãŸã ã®ãŠæ‰‹ä¼ã„ã§ã“ã‚Œã ã‘大変ãªã®ã«ã€ãƒ¡ã‚¤ãƒ³ã®é‹å–¶ã®çš†æ§˜ãŒã©ã‚Œã ã‘大変ã‹ã¯æƒ³åƒã‚‚ã¤ãã¾ã›ã‚“。
皆ã•ã‚“é‹å–¶ã®æ–¹ã€…ã«æ„Ÿè¬ã—ã¾ã—ょã†ã€‚ã‚ã‚ŠãŒã¨ã†ã‚ã‚ŠãŒã¨ã†ã€‚🙏
*1:ã§ããªãã¯ãªã„。Qiitaã«Werckerã§Dockerビルドをやる記事ã‚ã‚Šã¾ã™
ISUCON6予é¸ã§æ•—退ã—ã¾ã—ãŸãŒAzureã«è©³ã—ããªã‚Œã¾ã—ãŸ
AppArmor Goã¨ã—㦠@netmarkjp, @ishikawa84g, @matsuu ã§å‚戦ã—ã¾ã—ãŸãŒæ®‹å¿µãªãŒã‚‰åŽ»å¹´ã«ç¶šã予é¸æ•—退(推定)ã¨ãªã‚Šã¾ã—ãŸã€‚最終スコアã¯24000ãらã„ã§ã™ã€‚
åºç›¤
- デプãƒã‚¤ãŒçµ‚ã‚ã£ã¦ä½•ã‚‚変更ã—ã¦ã„ãªã„状態(デフォルトã®perl実装)ã§ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯å›žã™
- →スコア0
- Go言語ã«åˆ‡ã‚Šæ›¿ãˆã¦ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯å›žã™
- →スコア0
- MySQLã«é©åˆ‡ãªã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹è¿½åŠ ã€htmlifyã®æ£è¦è¡¨ç¾ç”Ÿæˆã‚’切り出ã—ã¦entryã®è¿½åŠ /削除ãŒã‚ã‚‹ã¾ã§æ£è¦è¡¨ç¾ã‚’ã‚ャッシュã—ã¦ä½¿ã„ã¾ã‚ã™
- →スコア0
ãˆãƒ¼ã“ã‚Œã§ã‚‚ダメã‹ãƒ¼ã¨æ€ã„ã¤ã¤æ˜¼é£Ÿã§æ°—分転æ›ã€‚
ä¸ç›¤
昼食ã§æ€ã„ã¤ãã¾ã—ãŸã€‚
- åˆæœŸçŠ¶æ…‹ã§entryã”ã¨ã«ãƒžãƒƒãƒã™ã‚‹ã‚ーワードを予ã‚抽出ã—ã¦ã‚ャッシュã—ã€entryã®è¿½åŠ /削除ãŒã‚ã‚‹ã”ã¨ã«entryã”ã¨ã®ã‚ーワードã‚ャッシュをã„ã„æ„Ÿã˜ã«èª¿æ•´ã™ã‚‹ã“ã¨ã§æ£è¦è¡¨ç¾ç”Ÿæˆã®ã‚³ã‚¹ãƒˆã‚’下ã’よã†ã¨ã™ã‚‹
- Goã®regexp.Regexpã®åˆ©ç”¨ã‚’諦ã‚ã¦PCRE実装を試ã¿ã‚ˆã†ã¨ã™ã‚‹
- →実ç¾å¯èƒ½æ€§ã‚’ç–‘ã£ã¦ã—ã¾ã„ã‚ã¾ã‚Šæ‰‹ãŒé€²ã¾ãªã„
- ã“ã®ã‚ãŸã‚Šã‹ã‚‰å³å¾€å·¦å¾€
ヤãƒã‚¤ãƒ¤ãƒã‚¤ã¨ã“ã®ã‚ãŸã‚Šã§å°‘ã—焦り始ã‚る。
終盤
ã“ã®æ™‚点ã§16:30ã€æœªã スコア0ã®ã¾ã¾ã€‚
- Goを一旦諦ã‚Perlã«åˆ‡ã‚Šæ›¿ãˆã€htmlifyã®æ£è¦è¡¨ç¾ç”Ÿæˆã‚’ã‚ャッシュã™ã‚‹ã¨ã“ã‚ã¾ã§å®Ÿè£…
- →スコア10000ã¡ã‚‡ã„を記録。ã¾ã˜ã‹ã‚ˆF***。Goã¤ã‚‰ã„。
- よã†ã‚„ãスタートラインã ã€Perlã§ãƒœãƒˆãƒ«ãƒãƒƒã‚¯ã‚’調ã¹ã¦æ½°ã—ã¦ã„ã“ã†
- 久々ã®Perlã§ã™ã£ã‹ã‚ŠDevel::NYTProfã®ä½¿ã„方を忘れã¦ã—ã¾ã£ã¦ãŠã‚Šã€ãƒœãƒˆãƒ«ãƒãƒƒã‚¯ã‚’ãã¡ã‚“ã¨æŠŠæ¡ã§ããªã„ã¾ã¾ã®æ‚ªæˆ¦è‹¦é—˜
最後ã«ã‚¹ã‚³ã‚¢24000ãらã„を記録ã—ã¦ãƒ•ã‚£ãƒ‹ãƒƒã‚·ãƒ¥ã§ã—ãŸã€‚ã¤ã‚‰ã„。
åçœä¼š
Goã§æ£è¦è¡¨ç¾ã®CompileãŒé…ã„ã®ã¯äº‹å‰ã«æŠŠæ¡ã—ã¦ã„ãŸã®ã§ã™ãŒã€ãれをã©ã†ã«ã‹ã™ã‚‹æ–¹æ³•ãŒæ€ã„ã¤ã‹ãšæƒ¨æ•—ã§ã—ãŸã€‚ã¾ãŸGoを諦ã‚る判æ–ã‚‚é…ã‹ã£ãŸã—Go以外も勉強ã—ã¦ãŠã‘ã°ã‚ˆã‹ã£ãŸã€‚複数ã®è¨€èªžã«å¯¾å¿œã§ãるよã†ã«ã—ã¦ãŠãã“ã¨ã¯å¤§äº‹ã§ã™ã。
ã‚ã¨ã§èžã„ãŸè©±ã«ã‚ˆã‚‹ã¨golangã§ã‚ã‚Œã°strings.Replacer ãŒä½¿ãˆã‚‹ã‚‰ã—ã„ã§ã™ã€‚ãªã‚‹ã»ã©ãƒ¼ã€‚ã—ã‹ã—自分ã®çŸ¥è˜ã¨ã‚°ã‚°ãƒ©ãƒ“リティã§ã¯ãã®æƒ…å ±ã«ãŸã©ã‚Šç€ãã“ã¨ã¯ã§ããªã‹ã£ãŸã§ã—ょã†ã€‚å—無。
ã¾ã¨ã‚
予習ã®ãŠã‹ã’ã§Azureã«éšåˆ†è©³ã—ããªã‚Œã¾ã—ãŸã€‚今後ã®ä»•äº‹ã«å¤§ã„ã«å½¹ç«‹ã¡ãã†ãªæ°—ãŒã—ã¾ã™ã€‚
ISUCONã§ã¯è² ã‘ã¾ã—ãŸãŒã€å¤§ããªæˆ¦æžœã‚’å¾—ã‚‹ã“ã¨ãŒã§ãã¾ã—ãŸã€‚ã‚ã‚ŠãŒã¨ã†é‹å–¶ã•ã‚“ã‚ã‚ŠãŒã¨ã†ISUCON!
ISUCON6予é¸ã®éŽåŽ»å•Vagrantも作り始ã‚ã¦ã¾ã™ã€‚乞ã†ã”期待。
ISUCONã®ç·´ç¿’ã«ä½¿ãˆã‚‹ç’°å¢ƒã‚’å„種ã”用æ„ã—ã¦ãŠã‚Šã¾ã™
å‰å›žã®è¨˜äº‹ã‚‚ISUCONãƒã‚¿ã ã£ãŸmatsuuã§ã™ã€‚ISUCONã®ã“ã¨ã—ã‹æ›¸ã„ã¦ãªã„ãŒãªã€‚
ISUCONで良いスコアを叩き出すためには過去問を解くことが大事ã¨1å¹´å‰ã«ã‚‚書ã‹ã›ã¦é ‚ãã¾ã—ãŸãŒã€ä»Šå›žã‚‚様々ãªç’°å¢ƒã§éŽåŽ»å•ã«ãƒãƒ£ãƒ¬ãƒ³ã‚¸ã§ãるよã†ã«ã—ã¾ã—ãŸã€‚ã©ã†ãžã”査åŽãã ã•ã„。
Microsoft Azure
今回ã®ISUCON6ã¯Microsoft Azure上ã§è¡Œã‚れるã¨ã„ã†ã“ã¨ã§ã€Azure用テンプレートを用æ„ã—ã¾ã—ãŸã€‚クリックã™ã‚‹ã ã‘ã§Azure環境ã«ãƒ‡ãƒ—ãƒã‚¤ãŒå¯èƒ½ã§ã™ã€‚
https://github.com/matsuu/azure-isucon-templates
ISUCON5予é¸ã¨Pixivã•ã‚“ã®ç¤¾å†…ISUCONをデプãƒã‚¤ã™ã‚‹ãƒ†ãƒ³ãƒ—レートを用æ„ã—ã¦ãŠã‚Šã¾ã™ã€‚
内部的ã«ã¯çœŸã£ã•ã‚‰ãªOS上ã§Ansibleã«ã‚ˆã‚‹ãƒ—ãƒãƒ“ジョニングを行ã£ã¦ã„ã‚‹ãŸã‚構築ã«1時間弱ã‹ã‹ã‚Šã¾ã™ã®ã§ã”了承下ã•ã„。
今回åˆã‚ã¦ãƒ†ãƒ³ãƒ—レートを作ã£ãŸã®ã§æŠœã‘æ¼ã‚ŒãŒã‚ã‚‹ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。å•é¡ŒãŒã‚ã‚Œã°éšæ™‚ã”指摘ãã ã•ã„。
Vagrant
å‰å›žã®Vagrant環境も更新ã—ã¾ã—ãŸã€‚
https://github.com/matsuu/vagrant-isucon
https://github.com/matsuu/vagrant-pixiv-isucon2016
vagrant upを実行ã™ã‚Œã°Ansibleã«ã‚ˆã‚‹ãƒ—ãƒãƒ“ジョニングãŒå§‹ã¾ã‚Šã¾ã™ã€‚boxã®é…布ã¾ã§ã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。ã”ã‚ã‚“ãªã•ã„。
Ansible
åŒæ§˜ã«Ansible環境も更新ã—ã¦ã„ã¾ã™ã€‚
https://github.com/matsuu/ansible-isucon
Pixivã•ã‚“ã®ç¤¾å†…ISUCONã¯公式リポジトリのAnsibleã‚’ã”利用ãã ã•ã„。
Terraform
éŽåŽ»å•ã®æœ¬å®¶AMIãªã©ã‚’èµ·å‹•ã™ã‚‹ãŸã‚ã®Terraformも用æ„ã—ã¦ã„ã¾ã™ã€‚
https://github.com/matsuu/terraform-isucon
https://github.com/matsuu/terraform-pixiv-isucon2016
移æ¤ç‰ˆã‚‚å«ã¾ã‚Œã¦ã¾ã™ã€‚移æ¤ç‰ˆã¯ãƒ—ãƒãƒ“ジョニングã«AnsibleãŒä½¿ã‚れるã®ã§æ§‹ç¯‰ã«æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚ã”注æ„ãã ã•ã„。
Docker
今回テスト的ã«Docker環境も用æ„ã—ã¦ã¿ã¾ã—ãŸã€‚
https://github.com/matsuu/docker-isucon
ã¨ã‚Šã‚ãˆãšä½œã‚Šã‚„ã™ãã†ãªISUCON4予é¸ã§ä½œã£ã¦ã¿ã¾ã—ãŸãŒã€Ansibleã‹ã‚‰Dockerfileã¸ã®æ›¸ãæ›ãˆã§ã‹ãªã‚Šç–²å¼Šã—ãŸãŸã‚ã‚‚ã†ä½œã‚ŠãŸãã‚ã‚Šã¾ã›ã‚“。
Docker Hubã§AUTOBUILDを回ã—ã¦ã„ã‚‹ã®ã§dockerコマンドã§ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰å¯èƒ½ã§ã™ã€‚å„言語ã”ã¨ã®docker-compose.ymlも用æ„ã—ã¦ã„ã¾ã™ã€‚
ã¾ã¨ã‚
環境構築ã°ã‹ã‚Šã‚„ã£ã¦ã„ã¦éŽåŽ»å•ã‚’解ã時間ãŒãªã„ã§ã™ã€‚何やã£ã¦ã‚“ã 。
ã¿ãªã•ã‚“ã®ãŠå½¹ã«ç«‹ã¦ã°å¹¸ã„ã§ã™ã€‚