1:HL["/_next/static/css/e0b87381b78a72d0.css",{"as":"style"}] 0:["00Nw3V7p6jjR7VBCI9FoH",[[["",{"children":["blog",{"children":[["slug","2016/10/30/isucon6","c"],{"children":["__PAGE__?{\"slug\":[\"2016\",\"10\",\"30\",\"isucon6\"]}",{}]}]}]},"$undefined","$undefined",true],"$L2",[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/e0b87381b78a72d0.css","precedence":"next"}]],"$L3"]]]] 4:I{"id":4896,"chunks":["896:static/chunks/896-da17be67249e7703.js","797:static/chunks/app/blog/[...slug]/page-a20797c105738917.js"],"name":"","async":false} 5:I{"id":3466,"chunks":["272:static/chunks/webpack-a5603073f1184a0b.js","253:static/chunks/bce60fc1-3138fc63e84359d9.js","961:static/chunks/961-177df6473dc74d43.js"],"name":"default","async":false} 6:I{"id":372,"chunks":["272:static/chunks/webpack-a5603073f1184a0b.js","253:static/chunks/bce60fc1-3138fc63e84359d9.js","961:static/chunks/961-177df6473dc74d43.js"],"name":"default","async":false} 2:[["$","html",null,{"lang":"ja","children":["$","body",null,{"children":[["$","header",null,{"children":["$","h1",null,{"id":"site-title","children":["$","$L4",null,{"href":"/","children":"apatheia.info"}]}]}],["$","main",null,{"children":["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$L6",null,{}],"templateStyles":"$undefined","notFound":["$","div",null,{"children":[["$","h2",null,{"children":"Not Found"}],["$","p",null,{"children":"Could not find requested resource"}],["$","p",null,{"children":["View ",["$","$L4",null,{"href":"/","children":"all posts"}]]}]]}],"notFoundStyles":[],"childProp":{"current":["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children","blog","children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$L6",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$","$L5",null,{"parallelRouterKey":"children","segmentPath":["children","blog","children",["slug","2016/10/30/isucon6","c"],"children"],"error":"$undefined","errorStyles":"$undefined","loading":"$undefined","loadingStyles":"$undefined","hasLoading":false,"template":["$","$L6",null,{}],"templateStyles":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined","childProp":{"current":["$L7",null],"segment":"__PAGE__?{\"slug\":[\"2016\",\"10\",\"30\",\"isucon6\"]}"},"styles":[]}],"segment":["slug","2016/10/30/isucon6","c"]},"styles":[]}],"segment":"blog"},"styles":[]}]}],["$","footer",null,{"children":["$","ul",null,{"children":[["$","li",null,{"children":"Link:"}],["$","li",null,{"children":["$","a",null,{"href":"https://twitter.com/f440","children":"Twitter"}]}],["$","li",null,{"children":["$","a",null,{"href":"https://github.com/f440","children":"Github"}]}],["$","li",null,{"children":["$","a",null,{"href":"https://pinbaord.in/u:f440","children":"Pinbaord"}]}]]}]}]]}]}],null] 3:[["$","meta","0",{"charSet":"utf-8"}],["$","title","1",{"children":"ISUCON 6 - aptheia.info"}],["$","meta","2",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","link","3",{"rel":"alternate","type":"application/rss+xml","href":"/atom.xml"}]] 8:Td10,
今年もISUCONに参加した。
例年に比べて十分な予習・復習をすることができず、メンバー内の得手・不得手を十分に理解できない状態だったので、不安を残したままコンテストを迎えることとなった。
最初にAzure Resource Managerテンプレートで環境を作るのだが、プロビジョニングに失敗したり、作業ミス(AppArmorを削除したら一緒にMySQLが消された)などで、結局3回くらい環境の構築をしなおしてだいぶ焦ったりした。
問題の内容としてはいわばはてなキーワードで、記事の投稿により別の記事内のリンクが増えるといったものだった。
参考実装ではオンデマンドにリンクを計算してページをレンダリングするのだが、これでは遅いので事前に計算結果をキャッシュする方針とした。ただ、ページが投稿されるごとに過去の記事も再生成する必要があり、これについては影響を受けるページだけを絞り込んでキャッシュを破棄することで対応しようとした。
方針が決まり、試しに雑なキャッシュをアプリに組み込んで見るとベンチマークを流すと毎回同じ箇所でベンチマークが失敗判定される。どうやらベンチマークは特定のページでリンクを確認しており、それ以外については問題があっても完走できる模様である。このことに気づいてからはベンチマークの挙動に合わせてキャッシュの再生成箇所を絞り込むなどを行った。
これだけでかなりスコアは伸びるようになったのだが、あとは地道にDBからRedisへの切り替えなどをしていった。
運営側と多少の行き違いがあり、スコアが計算されない事態が発生して肝を冷やしたが、最終的には対応してもらいなんとか本戦にたどり着くことができた。
問題としてはリアルタイム性のあるお絵かきアプリという非常にこったものであった。利用されている技術としては Docker / React / SSE (Server-sent events) といったところで、慣れていないこともあり初動が遅くなってしまった。
画像の表示部分で詰まっているような状態だったので、このあたりをなんとかしようという話ができはじめたのが昼から夕方にかけてで、いろいろ手を出しては失敗しを繰り返しているうちにタイムアップになってしまった。
今年も非常に楽しく行えた。やり応えのある問題、快適な会場の提供、その他もろもろ運営の方々には頭が下がるばかりである。
本戦の結果についてはとにかく悔しい。この記事を書いている時点で一週間が経ったが、未だに後悔が残るばかりである。ただ、自分の未熟さを痛感させてくれるという意味でとても有意義であったと思う。今後も参加したいので、末永く続いてくれることを願う。
7:["$","article",null,{"children":[["$","h1",null,{"children":"ISUCON 6"}],["$","p",null,{"id":"article-info","children":["2016.10.29"," ",[["$","span","isucon",{"children":[["$","$L4",null,{"href":"/blog/categories/isucon","children":"isucon"}]," "]}],["$","span","performance",{"children":[["$","$L4",null,{"href":"/blog/categories/performance","children":"performance"}]," "]}]]]}],["$","div",null,{"dangerouslySetInnerHTML":{"__html":"$8"}}]]}]