math314のブログスマートフォン用の表示で見るmath314のブログ主に競技プログラミング,CTFの結果を載せますこの広告は、90日以上更新していないブログに表示しています。2018-09-17ISUCON8予選をオンメモリ戦略で通過したISUCON8の予選に参加しました。運営の皆様お疲れ様でした、今年はオーソドックスな問題だった気がします。44,295点で全体8位、予選通過のようです。今年もよろしくお願いします。以下箇条書きGoは速いだろうということでGoを選択。pythonの方が慣れているがCPU勝負になったときに不利...MacbookにGolandを入れていたが、Debuggerが起動せずに苦しんだ。なんか色々インストールする必要があるらしいが時間がないのでDebuggerなしでやることにGoのアプリのプロファイリング用にpprofというものがあるらしい、でも結局使わずmisodengakuはリモートで参加。keyを置いてもらうgitリポジトリを用意してもらう。MySQLのシンプルなもの。フロントはjsで触るところはなかった。APIと何個かのhtmlを返すエンドポイントをいい感じにする取りあえずベンチマークを走らせる。レスポンスが遅いため負荷レベルを上げられませんでした。レスポンスが遅いため負荷レベルを上げられませんでした。レスポンスが遅いため負荷レベルを上げられませんでした。レスポンスが遅いため負荷レベルを上げられませんでした。レスポンスが遅いため負荷レベルを上げられませんでした。レスポンスが遅いため負荷レベルを上げられませんでした。レスポンスが遅いため負荷レベルを上げられませんでした。以下になんかある?"/"以下と同じくらいの実装量のページ?table多い"/"がすごい量のSQLを吐き出している。本番サーバー上のMySQLで動かすとなんとレスポンスに40s+かかる。トンネルを作って接続していた。1GBメモリ少ないっぽいMySQLとGoがCPU/Memoryを食べあうことになりそうなので早めに分離。(合計時間的な意味で)MySQLに格納されているデータを見る。アプリケーションを1つしか起動しなくてもパフォーマンス十分出るよね?ISUCONだからねINSERT/UPDATEのないテーブルは改造するのに難しい点はない。nil}SELECT/INSERT/UPDATEは全てreservationStoreのデータを参照/追加/更新するINSERT/UPDATEは、アプリ/マシンの再起動に備えてMySQLにもデータを流す。}()メリット実装途中でも負荷が少なければそれなりに動く。SELECTはメモリ上のreservationStoreを参照、INSERT/UPDATEはSQLを同期的に発行しつつreservationStoreも更新という実装でも一応動くでもtransactionとか消えてるから死ぬときは死ぬ。ベンチマークは通らないGoだとSQL発行の同期/非同期の切り替えがとても簡単。非同期にしてバグったら最悪同期に戻すことでベンチマークを通すことが出来る完成してしまえばMySQL依存は無くなる。場合によってはN+1問題が発生していた箇所は放置しても爆速になっている可能性すらあるので他の改善に時間が使えるデメリット全部実装し終えないとベンチが通らないMySQLにindexを貼ったりcolumnを整理した方が早くなる場合が大半なので慎重に考えるgoroutine内(非同期)でSQLを発行することに気をつける。}()ISUCON以外でやろうとすると怒られる。みんなで着手し始めたこのあたりでsheet関係のSQLが無くなったのでベンチマークを走らせたら"座席がランダムではありません"と怒られる。ランダムじゃないとだめなのか...Fisher-Yatesのシャッフルを実装したら通った。スコアは変わらず13:30くらいになってreservation周りの半分くらいSQLを消す。全部reservation周りのSQLが全部消えたのでテストするけどfailする。UPDATEが悪さしてるなんかuserもバグってるらしい。30000点を超えて1位になったので喜ぶGoがだいぶ分かってきたのでこの調子でeventも剥がすことに。eventを剥がし終わったのでもっかいベンチを走らせるも25000点。最高得点(44295)が出る。何も変えてないのに2万点弱ブレてびっくりする目標は予選突破であって1位ではないのでこれで撤収。ホワイトなISUCONだった感想MySQLからデータを剥がしてスコアが上がるのは面白い、結局今回はindexを使わなかった気がするちゃんとindexを貼ってもスコアは上がったらしい?こっちの戦略でも良かったかな...プロファイリングが必要な段階まで行けなかったのは心残りデータ全部剥がした後適切なデータ構造で管理すればスコアは軽く倍になりそう。}).ToSlice(&reservations)Goでlinq辛すぎ問題。}).ToSlice(&eventIds)普段使わないlaptopで苦戦した。IDEのインストールとかは事前にするとよさそうbranch名を間違えてreserveのつもりがreverseになっていた。月別アーカイブmathjaxはてなブログをはじめよう!math314さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。