開発^3スマートフォン用の表示で見る開発^3Web開発、宇宙開発、ゲーム開発の3種類についてつらつらとこの広告は、90日以上更新していないブログに表示しています。https://github.com/Sheile/isucon9来年はスコアを残せるように頑張る後は備忘録的にやったことや、嵌った点などをツラツラと。スコア予選と違っていつもと同じリクエスト数基準になりましたが、ベンチの出来が良いのか、スコアはかなり安定していたように思います。他のチームだとリクエストを捌ききって、3連続で同じスコアとかもあったみたいですが、見た感じこちらでは起きていないので、まだまだ足りなかった様子。最後までCPUボトルネックでした。測定用のスクリプトを準備。いつものdotfilespt-query-digestkataribenetdata1人参加では全体をいじるのはどうやっても手が足りないので、予選と同じく、計測して一番重い場所を直す、の繰り返しで進めることにする。当日朝9:15ぐらいに会場入り。悩んだけどキーボードとマウスを持ち込みで。焦っているときのタイプミスはさらなる焦りを呼ぶので、持って行って良かったと思う。composeだ!だいぶ前の記憶を呼び起こしつつ、isutrain/webapp/mysql/conf.dにslowクエリ用設定を書くが、slow_query_log_fileは変更されるのに、slow_query_logがOFFのままという問題に悩まされる。/var/log/mysql/slow.logへの書き込み権限が無いとOFFになる様子。logs見たら書いてあったので、Docker慣れが足りなくてもったいないことをした。server.11:30-11:50Slowクエリを元にIndexを追加。1,227】12:00-12:30お昼ご飯食べながら方針検討。デバッグのしやすさなどを考え、開発中はPythonをDockerコンテナの外に出すことに。search/seatのN+1がひどいのでそこから手を付けることにするが、200行近くあるメソッドにめまいがする。塚田農場のご飯美味しい。13:25station_masterをオンメモリに。arrival_idを追加して、2テーブルの結合で済むように。優勝チームの話を聞いているとseat_reservationsの方に追加していれば1テーブルで済んだようだ。3,895】15:50seatのN+1を解消。ご丁寧に「他予約の下車駅と自分の乗車駅が同じ場合は予約が取れる」といった仕組みがあるので、不等号にはまる。あのドタバタの中で<と<=の条件を(しかも被る条件が欲しかったので反転して)考えるのは焦りっぷりがすごい。readlineのバージョン?なのか、mysql-cliで検索クエリに日本語が入れられなかったのも拍車をかける。Trueで直接occupiedフラグを書き換えられないかと思いついたが、先にデータ確認したら4列席の列車があったので断念。4,509】16:10あれこれ嵌ってたのもあって、時間がたつのが早い。手が入れられていないpaymentやロックで待ち時間があるのもあって、CPUの上下移動が激しくなってきたので、(予選でもスコアがはねたし)APサーバーの台数を増やすことに。workerを増やしてみる。6,715】~16:53ロック漏れによる多重発券に悩まされFail連発。いえば、事前説明に「ロックがちゃんとしていない」とあったなぁ......読んではみたものの、300行近くあるreserveで原因追及は残時間では無理!と、広めのテーブルロックをかけて対処する。6,959】17:00残り1時間。時間的には再起動試験とかに入りたいところだが、worker増加の効果が分かっているし3台は使い切りたい。(実際はこの前にもベンチマーク中にB/Cサーバーの設定などは行っていたのである程度の準備はできていた)なんとなく一番後ろがDBの印象があるのでサーバーCをDBサーバーにすることに。docker-compose.db.ymlとして切り出して、マニュアルに従ってDBサーバーを再構築......あれ、重......い......?原因自体は(おそらくだが)すぐに分かった。01_schema.sqlにあれこれIndexを張った状態で、時刻表マスタの280万件をいれようとして、死ぬんだ。RAM1GBの非力な環境というのも影響して、Swap地獄になっているっぽい。stopも動かないとボロボロに。rebootを投げるが反応が無い。エラーにはなっていないので、通るのを祈る。1これ、もう無理じゃね?と思いつつも1台構成では10,000超えないのもわかっているので、ギリギリまであがくことに。サーバーCは無事再起動できたとしても、データが破損してるので使えない。TABLEを作るのがまた大変。並行してサーバーAのnginxにロードバランシングの設定を追加。これ自体は予選の時にも経験済みなのでさくっと。rebootまで通って再起動してくれたので、DBサーバーからAPサーバーに仕立て直していく。あわわわわ17:52どのタイミングで実行してたのかわからないが、少しだけ高いスコアが記録されていた。8,181】17:55APをdockerコンテナに戻したらDBに繋がらない!.envにはMYSQL_PORTが無いことに気づき、慌ててDBサーバーを3306:3306に。17:56正直、これがなぜ通っていたのか、いまだによくわからない。当時は以下の3台構成が動いたと思っていた。APサーバー(4worker)が、再起動後の状況を見るとサーバーCは.envが最新化されておらず、DBサーバーへの接続ができていなかった。下記構成で19,023出るかというと......謎。19,023】17:57再起動しても問題を直す時間は無さそう。disable/enableの確認と修正に時間を費やす。pullが漏れており、.envが最新化されていなかった。結果、MYSQL_HOSTがサーバーBになっておらず、接続に失敗。いうことで最終結果はFail(0)となりました。もったいないことしたけど、最後の1時間は全力以上でやり切った感はある......でもスコアが残らないのはやっぱり悔しい。来年の開催があったら残り時間を考えつつ頑張ろう。Cloud様、楽しいイベントをありがとうございました!終了後にサポートチャットを見たら、似た症状で再起動してもらっているチームがあった。予選ISUCON9お疲れ様でした。ゼロから始めるISUCON」として1人チームで参加して来ましたが、無事16位に入ることができ、来月の本選に出場できることになりました。3回目の挑戦で初本選ですね。internetさんと、mercariさんということで、椅子を販売するサイトisucariでした。「ベンチマーク」が「ベンチ」ジャンルに入っていたり、時間に追われながらもくすりとさせてもらいました。ISUCON的にはRDBボトルネックから始まるものの、割とすぐに外部APIにボトルネックが移った印象。結局API呼び出しをある程度減らしつつ、とにかくWorkerを増やすことでAPI結果待ちの間に他Workerが処理するようにしてスコアを稼いでいました。感想部屋見ているといろいろ足りていなそうなので、怖いながらも講評が楽しみ。5)やったことオーソドックスに計測・一番重い場所を改良の繰り返し。外部APIを出来るだけ呼ばずに済むようにこの辺りで目立つSlowクエリが無くなって、API呼び出しが支配的に。これが正しかったのかはわからないですが、netdataで見ているとCPU使用率が0%と100%を行き来していたのでAPIのレスポンス待ちでworkerを使い切っているのかなー、と。この時はcompaign上げてなかったので、単純にベンチマーカーからリクエストが来ていなかったのかもしれません。APIレスポンスの内容をJSONに含めて返す必要があったため、遅延処理もできず、workerをがっつり増やして対応。考えると裏でポーリングしておく手もあったかも?でもwait_shipping以降の物が増えると破綻しそうだなぁ。statusがisucari側である程度把握できる(=APIレスポンスする必要が無いタイミングがある)ことを知る。/acceptのタイミングがわかれば、大部分はわかるはず。このURLは外部サービスのものだし......はっ!荷物を引き渡すときのQRコードを差し替えて、isucariを経由させれば......と実装。orz確かにレスポンスの変更にあたるからルール的に変更不可か......3台構成にアプリ側がうまく行かなくて凹んだのでインフラ側へ。RDB負荷はある程度減らせていたようなので、DBサーバーにもgunicorn入れて数で勝負。画像ファイルの配置がバラけてしまったのでNFSで無理やり共有。2/upload以下はnginxで提供。結果Job一覧を見ていると、こんな感じか。安定していたので数回走らせて12,960で終わり最終スコアは12,960、最高スコアは13,560でした。実はcampaignを上げるタイミングを逃し、後半で上げてみたら外部API呼び出しがエラりまくったので0のままです......(小声)後半でワタワタしていたのもあって、デフォルトで/uploadが読めた理由がよくわかっていなかった。見直してみたらFlaskのstatic_folderで提供していたのか。↩/sellだけ1サーバーに寄せれば良かったかな、と終わったちょい後に気付いたり。予選Tweet広告を非表示にするもっと読むコメントを書く2019-08-15maimaiでらっくすの問題点maimaiでらっくすが出て1か月ちょい。困る点はありつつも、それなりに慣れたので改めて問題点を書いてみます。Max8500(75クレ)それなりには出来るけど、上位の人たちとは大分差がある、でもmaimaiたのしー。達成率(スコアシステム)5月に公式にメールした時の記事にも書いていますが、1.02を受けて改めて。マシにはなった、マシにはなったんだけど方向性が変わってないので、問題点も変わっていないです。前回記事でも書きましたが、今作のスコアシステムの問題点は以下の2点(後者が前者の原因なので実質1点か)プレイヤーのうまくできた感と達成率がリンクしていない極端なBreakの精度ゲー1.02になっても解消はされておらず、「ヒバナ」のMasterを例にするとこんなことになります。Tap23グレ~24グレに相当する問題点パターンAを見ればわかりますが、SSS+なんてフルコンすら要らないんですよ。Breakだけ光れば他がボロボロでも乗ります。逆に、どんだけうまくできてもBreakが光らなければ達成率はボロボロです。高スコアを出すためには何よりもBreak精度が重要になるわけですが、少なくとも私は、譜面の極一部でCriticalが出るか出ないか(2F)に拘るようなゲームをやりたいわけではありません。1.02の変更で2500にも追加加算が付きました。Tap10グレ相当と、Breakの比重が高いゲームですが、(譜面のBreak数次第とはいえ)これ以上あげる必要はあったのでしょうか。FiNALEまでの2600はすごく良かったと思っています。譜面によって大きく違うBreakの2600が入ることで数グレの許容ができ、赤FCからAPまでの長い道のりの中で丁度良い中間目標となってくれました。※鳥S、理論値難易度は譜面によって大きく違うまた、APが取れてもBreakをいくつか落としていることは多々ありましたが、その場合も数百点(数グレ)程度の差だったたため、APには「やり遂げた」という達成感がありました。大きな変化として理論値(101.00%)以外の達成感がだいぶ少なくなりました。やった!自分の腕では多数のBreakを安定して取ることは出来ないので、理論値ペースの後半とかBreak来なけりゃ良いのに......とか思ってますorzFiNALEの頃は99.9%に落ちたスコアを最後のBreakでギリギリ100%に乗せたり、楽しかったなぁ......レーティングシステムRecent枠が無くなったのは良し悪しありますが、まぁ直に受け入れられました。一応書いておくと個人的なメリデメは以下の通りメリット:苦手曲に手を出しやすくなったデメリット:変化が少なくなったのでずっとこの数字と付き合うことになりそう問題はBest枠のSSS+上限化。スコアシステムの問題がここにも。1.02で少しマシになったとはいえ、SSS+は割と失敗しまくってもBreakさえ光れば取れます。すると運よくBreakが光ってSSS+に乗ったプレイがBest枠に乗るわけです。実際自分のスコアでもSSS+済の未FC+、未FCがちらほら。プレイヤー的にはまだまだ先があるわけですが、レーティング的にはこの曲を詰める理由はもうありません。実際はFC埋め、FC+埋めをするのでプレイしないわけではないんですが、AP出してもレーティングが微動だにしないのはちょっと凹みますね。オンゲキならSSS+(1007500)に乗せるにはほぼABFBが必要になるので、SSS+が上限でも良いんですが、maimaiでらっくすのこのスコアシステムでSSS+(100.50%)が上限なのはダメでしょう。いって100.75%を上限にするのもダメです。100.75%を上限にしたらBreak精度をさらに求めるゲームになりますし、それがプレイヤーの腕を反映していないのは前述した通りです。お友達対戦メインは語ったので後はさっくりと。相手の名前出ないので対戦感が少ない負けた時のゲージ、レーティング減少がでかいので確実に勝てる相手が来るのを待つ作業ゲータッチノーツ大分慣れたものの、やっぱり押していて楽しさが薄いのが困り者。判定が緩すぎるのと、判定抜けを嫌って手のひら全体で取るので、全体的におおざっぱな感が強く、リズムに合わせてノーツを取っている感じが弱いのが原因だろうか?スライド中のタッチノーツも「これならスライドだけで良いよなぁ」と思ってしまうことがしばしば。あと、エフェクトが邪魔で次のノーツが見えないことも多々。筐体スペースやら考えると仕方が無いとは思いつつ、ぼっちにはツライ。スコアシステムについて、どうにも気になる点があったたため、公式にメールしてみました。いつも楽しく遊ばせていただいています。出先でmaimaiでらっくすのロケテが行われていたため、遊ばせて頂きました。JAEPOで発表された際も懸念点としては感じていましたが、実際に遊んでみた結果、スコアシステムについてあまりにも受け入れがたい点があったため、意見として送らせていただきます。スコアシステムの問題点について問題と感じているのは極端なBreak精度ゲーになっており、プレイヤーの「うまくできた感」とスコアが全くリンクしていない所です。Perfectとした場合のスコアは以下のようになるかと思います。99.98%問題点プレイヤーからすれば、明らかにパターンBの方がうまくできたにも関わらず、スコアとしては0.5%近くも低いボロボロ。この問題は、Breakが少ない譜面で顕著ではありますが、多かれ少なかれ同じ問題を抱えることになります。高スコアを出すためには何よりもBreak精度が重要になるわけですが、少なくとも私は、譜面の極一部でCriticalが出るか出ないかに拘るようなゲームをやりたいわけではありません。CHUNITHM/オンゲキのように全ノーツに+1%を割り当てる形であれば良かったのですが......(旧データに精度情報が無く、スコア引継ぎのために、この方法は取れなかったのだとは思いますが)旧スコアシステムであればパターンAが99.49%、パターンBが99.98%とプレイヤーの感覚とも合致したスコアになっていました。個人的に101%への統一なんて求めていなかった、という事情もありますが、ここまで酷いスコアシステムにしてまで101%へ統一する必要があるんでしょうか?色々と考えられた上での実装かとは思いますが、なにとぞご再考のほど、よろしくお願いします。スコアシステムについてTweet広告を非表示にするもっと読むコメントを書く2018-09-19ISUCON8に1人で参加してきましたISUCON7は3人チームで参加しましたが、今回は1人参加も可能ということで、ぼっち参加してきました。結果は最高スコア32,596、最終スコア26,873で予選落ちではあるものの、去年の反省を活かした動きである程度のスコアが出せたのは良かったです。手が付けられていない箇所が多すぎて、不完全燃焼感も。後日の検証でLBだけ有効にしたら79,356でましたが、不安定だし、たらればですね。事前に決めていたこと1人参加、かつアプリ寄りの人間のため、迷ってる暇はなさそう。インフラ側の変更は最低限にして、アプリの改修を優先しよう。netdataは今回も使いたいな。前回の教訓を元にネットワークの帯域には気を付けよう。1人だと自由に本番環境を使えるから、手元環境で動作させる必要は無いよね。環境を確認した瞬間「出題DeNAじゃん!!」と叫んでしまったのですが......十分考えられる選択だったよね。nginxに置き換えた人も多かったようですが、設定をみたら割と読みやすかったのと、事前方針を思い出してh2oのまま行くことにしました。(Evernoteからnginxインストール/設定手順を取り出してダウンロードまでは掛けたんですが)チューニングの手順としてはpt-query-digestで重い部分を洗い出して修正していくという基本的なもの。一通りコードを読んでget_events/get_eventが重いことは明らかだったんですが、呼んでいる箇所が多すぎて挙動を変えづらいのが難点でしたね。結局、cancelの扱いがクエリを複雑にしているので、現在の予約状況を示すテーブルを新しく切って対応しました。reservation_id)非正規化の極みとばかりに、どんどん必要になったカラムを増やしていきましたが、最終的にはcurrent_reservations自身がボトルネックになってしまっていたのがちょっと残念かな。(対応した順番としてはこっちが先ですが)残席数管理はredisにしました。残席自体もredisのsetで管理しようと考えたんですが、何故か残席のsetじゃなくて、予約席のsetを作ろうと考えてしまい、そうするとreserved_atをどこに持とう?とか考えて、結局RDBにしてしまいました。atomicなpop処理ができれば、redisだけでロックの代替ができたのかな?後は細かいところをあれこれと弄っていました。rand()h2oのLBが/etc/hostsでできることを知らなかった/etc/hostsに2レコード書いてping飛ばすところまではやったけど、ダメだったのであきらめた。h2o本体で試すべきだった。ISUCON7予選のトラウマから50Mbpsのグローバル帯域を気にしすぎた課題・環境についてポータルがすごく便利。ベンチマークも全く待ち時間が無く、とても快適でした。課題としては面白かったものの、lockが主題になるとスコアが安定しないのが難点か。修正が役に立ったのかどうかがもひとつ判断できず、ツライ時間が続いたりしました。サーバについては、終了後にベンチ環境まで含めて1週間公開してくれるというのがすごくありがたいです。時間切れで試せなかった場所とか、ロックの関連とかいろいろ見てみたいと思います。GMOインターネット株式会社さまと、このはちゃんには足を向けて眠れませんね!1人参加のメリット・デメリットさて、せっかくの1人参加ということで、1人参加のメリットとデメリットも書いておこうと思います。ISUCON9で1人枠が用意されるかはわかりませんが、参加を考えている人は参考にしてください。00:00ISUCON8に1人で参加してきましたTweet広告を非表示にするもっと読むコメントを書く2015-03-23出遅れたけどBingoカード生成問題書いてみたCodeIQに「ビンゴカード作成問題」を出題しました。blog.jnito.comRSS整理してたら再発見したので書いてみた。回答締切どころか既に模範解答まで出てるけどまぁ、それはそれ。endendBingo.generate_card行列を転置することで割ときれいに書けた気がする。102構成なんてのが話に出ていたのでちと計算。今までこの類の計算したことないのでググりつつ。公式サイトから各種の値を調べてみよう。448秒SRB-Aは数字を見る限り高圧型ですね。SRB-A燃焼終了まで最初は1段目とSRBが同時燃焼するので比推力がややこしい。ググったらこんなQAが引っかかったのでそのまま式を使わせてもらおう。合算した比推力は302.3秒とでた。うん、感覚的にもあってるっぽい。打ち上げ時質量さて、質量を求めます。ペイロードは......とりあえず空で。打ち上げ100秒後にSRBが燃焼停止するのでこの時点の質量を求めます。1段目はMECOまで390秒。推進薬101.1トンの25.6%ほどを消費したとみて、残りの推進薬は75.2トンほど。エンジン、タンク等の構造体含めて88.1トンですね。SRBは全推進薬を消費したので21トン。110.5トンですかね。2640m/sSRB-A分離から1段目燃焼終了まで残りは1段目が頑張る。打ち上げから390秒後にMECO。実際には途中でフェアリングを放棄しますが、まぁ、ペイロード替わりってことで。......あれ、思ったより速い。ボロボロの結果がでて、「やっぱりSSTOは無理だったよ(知ってた)」となると思ったんだが......重力損失とか空気抵抗とか考えるとSSTOは厳しいにしても、ここまで速度が出せるとはびっくり。何か計算間違いしている可能性もあるけど気にしない。9822m/sとなるので、やはり実用的なSSTOはまだ先の様子。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。