ソバガラマクラスマートフォン用の表示で見るソバガラマクラこの広告は、90日以上更新していないブログに表示しています。mizkeiとチームを組んで参加しました。Redは赤でCompは粉です。なんか色々な感じでした。VMs、repo準備マニュアル記載のテンプレートボタンをぽちっとして競技用のVMを用意。今度は焦らず再起動を待ち、初期状態でベンチ実行。初期はperl実装にベンチがかかり1800点前後。goな人なので言語はgoを選択。goはマニュアルに記載されていた初期実装ベンチが0点な言語でしたが、とにかくアプリ読んでから考えようということに。index張るmizkeiがアプリを読んでいる傍ら、データのバックアップをとったりついでにindexを張ったり。keyword(keyword);くらいだった気がする。タイムアウトしてしまいこの時点でも0〜200点くらい。今回の問題で特徴的だったのはアプリケーションが複数存在し、httpによるデータ交換を行っている点でした。作りは面白いのですが、特に別アプリになっているメリットがなく(笑)、ひとつのアプリに統合することに。いった変更はbranchを切って行い、ベンチマークの結果次第でmasterに取り込むかどうかを決める、というルールでやっていたのですが、この時点でもタイムアウトによる減点のためかスコアは0〜200点くらい...この変更はとりあえず保留に...htmlify対策とりあえずスコアが出ないことには効いてるのかどうかもわからん!ということで一番のボトルネックであるhtmlifyに着手。やばい!となってstrings.Replaceにここまでやってやっと1800点くらい。時刻は16:00くらい。普段業務でgoを書けない鬱憤を晴らすかの如く、喜び勇んで手を動かしてたmizkeiもだいぶ意気消沈して来てたwさらばgolang結局のところperlの初期実装を超えられておらず、ボトルネックは文字列処理。perl使えばいいじゃないということでmizkeiがgo書いてる裏でそれを私がperlでも実装。setからkeywordを取得するようにしたところでスコアが40000点くらいまで伸びISUCON始まった!(でももう17:00)そこからisutarの統合やらnginxの調整やら大急ぎでやって、最終的には70000点位のスコアは見ることが出来ました。結果・振り返りスコア的に期待はしてなかったけどやっぱり結果は予選落ち、残念。振り返るともっと早い段階でgo捨ててperlにしとけばよかったのでは?となりそうですが、そうでもない。みんgo第一章にある通りgoの正規表現はパフォーマンスが悪いし、perlはそういうの得意だけど、問題のキモは正規表現の生成速度ではなく、その頻度を減らすことだったり更新後の参照可能性の担保。文字列比較やリンクとしての置き換えの回数自体を減らす方向でアプローチしていけばgoでもスコアは出せたんじゃないかなぁと思います。言え初期実装がベンチ0点で、最大のボトルネックを取り去るまで進捗が見えないのはつらかった...まとめ今回もとても楽しく参加させていただきました。mizkeiありがとうございました!そして運営の皆さん、お疲れ様でした!本選も応援しています。P.S.みんなのGo言語買いました!まだちょっとしか読んでませんがとても良さげ。@m0t0k1ch1予選を無事に突破し、本選に参加してきました。やったこと問題の形式は各チーム3台のマシンが与えられ、その全てで同じアプリケーションが起動しているbenchmarkは実行時に指定した1台に対して実行される3台すべてを使う必要はないという感じです。アプリの内容は予選よりも軽めで、幾つかの外部サービスAPIをユーザー指定のクエリで定期取得するというもの。データ表示用の画面の他に、クエリ設定画面、ログイン/signup画面などが実装されていました。初期ベンチは1000点前後。1台でkey-pairを作り共有。全台にsshできるようになったところでnsshを利用してtool類を整備していきました。mysqlこの辺でアプリを眺めてた@MacoTasuが「mysql繋げない」と。psqlわかんねーぞ...となりました。slowクエリ見たりindex張ったり、my.cnf的なものはどれぞ?といろいろ不安を感じ、DBをpostgreからmysqlにしてしまおうと大きくかじを切りました。「初期化されたpostgreからcsvを吐いてmysqlに流す。」と書くとまあ行けそうな感じがしたの。結果としてはそんなにうまくいくはずもなく、csvの一部になったjson部分をシングルクオートで囲んだりしてた。(Vimのマクロは直感的で便利!!!)データにはマルチバイトもあったので、csv吐くところか取り込むところあたりで文字化けにも悩まされてスコアを落とすことに...。これは結局どこで起きてたのかわからないまま終わってしまった。initializeがpostgreの方にかかっていたり細かなミスもあって、一部文字化けしてるけどとりあえずmysqlでアプリが動いたのが15時くらい。speedup時間もない中tryしたこととしては外部APIのendpointのリストをキャッシュ認証の方式を変更リクエストを1台のnginxで受けてアプリを2台にetc.初期実装ではsignup時に決定されるsaltとpasswordからsha-512で生成したhash値をDBに保存し、取得時には毎回postgreのdigest()で再計算していました。ここの計算コストをカットするために単純にmailアドレスのドメイン部分をpasswordとして置き換えてしまい簡略化しました。(レギュレーション的にokなのか?)あとは外部APIにリクエストするところが一番のネックになっていたので、ここを並列にしようとParallel::ForkManagerでざっくり書いて見るも結局うまく動かせず...。しているうちに決定打を打てないままタイムアップとなってしまいました。振り返りmigrate?結果から振り返るとDBの入れ替えは良い選択ではありませんでした。「migrationが思ったより詰まったなぁ」とか「いやそもそもpostgreももうちょいいじれないと...」というのもありましたが、本質的には今回の出題、DBはほとんどネックになっていなかったのです。推測するな、計測せよですね。切り戻し変更は基本的に各自のbranchで多種の変更を同時に(同じbranchで)行わないpush前にbenchが実行中かどうかを確認benchにfailしたもの、スコアが上がらなかったものはmasterに取り込まない予選では割りとできてたことが全然できてなかったなぁ。benchのfail率も予選に比べてかなり高くて、心やすまる時がありませんでした。殆どの時間fail見てた。慌てていろいろやってたらいつの間にか外暗くなっててさらに焦ったり。使用言語chatzmersは予選と同様使い慣れたperlを選択しましたが、今回の出題ならgolangとかのほうがスコア上げやすいかなと思ったり。なんにせよ問題見てからいろいろ選べるようだと強いですね。{}とか初見だったしperl力もまだまだ足りない...。successそれでも予選の反省を活かして競技終了前に再起動試験を行い、結果としてはスコアを残すことができました。激遅ですが僕らのサーバーはリクエストされたページを返します!これができないと入社1年目に舞い戻ってしまいますのでsuccessできてよかったです。まとめ本選も楽しかった!みんなで同じ会場に集まるのいいですね。ランキング眺めて一喜一憂したり。練習も含めてISUCONを通してとても良い経験ができました。出題/運営の皆様には感謝してもしきれません。次回も参加して、もっとスコアをあげられるよう精進したいと思います。@m0t0k1ch1というわけで当日周辺の出来事、やったことなどを振り返りつつ戦いの記録を残します。実はあまりよく覚えていないが、いつの間にかメンバーになっていたらしい。予選当日から一月程前に肉を食いながらチーム名を決めました。m0t0k1ch1st0ryを参照ください。'z'を付けたのは私です。repo作成を行いました。練習ぶっつけ本番はまずかろうということで事前に練習を行いました。集まれたのは2回ほど。Storageオブジェクトとして提供されていたためそちらを実際に解いていく形でやりました。決めた私の分担範囲としてはアプリケーションに対する変更をdeployしたり、同時にbenchmarkを走らせたりという環境整備でした。結果をslackに通知といったあたりをpush以降自動で行えるように整備しました。hookを実際に動かせたので良い練習になりました。idを渡すものだというあたりに小一時間ハマったりしていた。い慣れた会社の会議スペースを借り、準備しました。ご覧いただくとわかるように、起床がISUCON参加者たちの最初にして最大の難関であります。chatzmersは開始1時間前には全員が揃っており、無事に競技開始を迎えられました。やったことまずは練習と同じくdeploy環境、benchmark環境を用意するということをやりました。repoは練習と同じものをディレクトリを切って使ったのでツール類はほとんどpathの書き換えくらいでしたが、systemd慣れしていなかったことと、benchmarkが専用のポータルサイトからリクエストする形式でしたので、pushしたらcheckoutするよ、というくらいのところまでになってしまいました。アプリを読みまくるというような分担で進めていました。この辺り、誰かが待ちになってしまうようなことなく、作業に入れたのは非常に良かったと思います。一通り計測ツール、deploy環境が整ったあたりで@Maco_Tasuがめぼしいボトルネックを挙げ、それを分担して改善していきました。問題のアプリは少し懐かしい香りのするSNSサイトでISUCON4に比べるとかなり重厚。ユーザー、フレンド、記事、コメント、足あとなどを主な機能とするものでした。私は主に足あと周りとコメント周りを担当しました。byの無駄な指定を省きました。setだなーというアイディアはありましたが、一旦保留に。コメントは、redisを使って参照の高速化を図りましたが、mysqlから初期データを読み出すところでinitializeの時間制限に関するレギュレーションに違反してしまい、うまく行きませんでした。set案も諦めてしまいました。答え合わせidobataでfujiwara組(予選総合1位)からaofで〜というのが出ててなるほど流石という感じ。m0t0k1ch1st0ry方針、暗黙のチームルールっぽいもの実はこの3人、新卒時に社内で行われたミニISUCONに(それぞれ別のチームで)参加したことがあります。その時は新卒勢は全員fail(記録なし)という散々な結果でした。いうのに加え、自社サービスの保守、運用を主な業務としているメンバーでしたので、不可逆な変更、大きな変更に対しては注意深くすすめる事ができました。変更は基本的に各自のbranchで多種の変更を同時に(同じbranchで)行わないpush前にbenchが実行中かどうかを確認benchにfailしたもの、スコアが上がらなかったものはmasterに取り込まないというようなことを違和感なく、スピードを落とすことなく実行できたのはプラスになったと思います。一方で初期データの破損を恐れて、schemaの変更を避けたり、redisへの置き換えを早々に諦めたりしていたので、snapshotからの復元や別インスタンスを立ててバックアップとするなど、クラウドプラットフォームらしい可逆性の担保も視野に入っていればもう少し大胆な改修もできたかなぁというところです。まとめISUCON楽しい!楽しかったです!8時間まるまる集中してて最後は本当にヘトヘトでしたが、ものすごく充実感がありました。メンバーの2人も同じ会社とは言え一緒のプロダクトで関わったことがなかったので新鮮でした。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。