chigichan24のお気持ち表明

おきもちを表明している

ISUCON7の真面目な話

メンバーが真面目な記事を書いていて,自分のやったことがピザをデプロイしただけと思われると悲しい(?)ので,多少技術的なムーブメントというか真面目な補足を書こうかなというエントリです.

昨年は チーム (´・ω・`) としてISUCON6本選に出場していたので,その時の様々な反省を今回のISUCONでは(部分的には)活かせたかなと思います.

去年参加した経験を活かして,今回は自分はoperationの中心となり,問題の性質に応じてコミットする領域をわけながら取り組むことに注力しました.

インフラ,ネットワークの知識,設定に関する知識に k5 は長けており,また,euglena はRubyのコーディングスキルに秀でているため,彼らの力を最大化できることを目標に動きました.

唯一,彼らより私が秀でているのは競技としてプログラミングすることだと思います.プロダクションのコードではこういうことをしないとか,benchmarkerをjudgeのような振る舞いで使うことで普段はできないようなデバッグ方法をするように話をしたのですが,これはすぐには身につかなかったかなぁと思ったりしています.

やったこと

オペレーションな面

議論で大きく衝突することはないのですが,基本的に割れたときは最後に決断をバサッと下すことを心掛けました.短時間の競技は無駄に悩むくらいならやってみるというのが大事です.

また,コードのバグを無駄にとろうと必死になるくらいなら,競技の規模程度のコードに限っては絶対に書き直したほうが速いです.

技術的な話を含めた時系列

my.cnf,nginx.cnf,redis.confの導入をしました.昨年の経験や,練習会を通してwikiとしてためておいた汎用的な設定ファイルを導入しました.sysctlに関してだけはlinuxに関する知識がうすすぎたので,k5に投げました.

ktaribeでアクセスログを解析し,明らかにicons/によってログが埋まっていたため,すぐに静的配信することにしました.また,3台構成であったので,

1. まずiconsのGETをnginxで捌く.
2. 画像の管理をDBでするのをやめて,パスだけ保存する.
3. サーバの1つをコンテンツ配信用とする.

という方針をk5と話してたてました.

一方,アプリケーション改修担当のeuglenaはslow queryを見た結果そこまで遅いクエリがないという報告をうけたので,早急にindexを張るのを考える必要はないと判断して,line-profの導入をしてもらいました.

と言われつつ,userのnameでindex貼ったりしましたが,あんまり効果がなかったように思います.

このタイミングくらいで,euglenaからline-procの結果を渡されて,sleepが無意味に挟まっていたので直したり(sleepの意味に気がついていなかった),line-procをみても画像に対してWHERE掛けてるところが重いのが確定したので,早急に静的配信することにしました.

euglenaと話していると,redisに載せたい部分があるという相談を受け,少々悩みましたが,悩むくらいならやってみて早ければ導入するという感じでGOサインを出しました.

静的配信をnginxで設定したもののなぜか200で返っていたので,少々調整をしたら,10000点にのり,icons/ 以外の静的コンテンツも載せると 15000点に乗りました.

しかし,cacheのサイズを変えたりするとワーカーの数(並列度)は上がっても,2000点まで下がったりと不安定な挙動をしていて,私とk5で同居人との競合みたいな考察をしましたが,これは多分間違っていて,実際は帯域制限を食らっていたという k5 の考察を今日見て,納得しました.

何はともあれ,このときはそれに気が付かなかったので,設定ファイルを一から書き直しつつ最適化するというのをk5にしてもらっていました.

その間は,アプリケーションの一部をredis化していたので,私はそれ以外のN+1を直すため,また,アプリケーションのロジックをもう一度確認するためにコーディング側に回りました.

この間にrebootしてみると,Pythonが起動したりして,危ないところでした.

この間にも,k5 によって並列度を保ったままスコアを徐々に上げてもらい,euglenaにはredis化のコーディング & バグ取りをしてもらいました.

このあたりで,私達のチームはまだ,課題の本丸にたどり着けていないという焦りを感じながらコードを眺めてました.

一箇所,slowqueryに出なかったからといってい,WEHRE句で多用されているカラムなのに,indexを貼っていないところがあり,試しに貼ったらスコアが39000程でてびっくりしました.これはこの変更だけで30000点が上がったのではなく,今までの設定がやっと効き始めたという感じがありました.

再度kataribeを見ると,loginやregisterが少々重いので,nameとpasswordにindex貼って高速化したかったのですが,saltを発行しつつSHA1に掛ける実装をしていたので,難しかったです.今思えば,その実装も外して無理やりpassを平文で保存しても良かったかもしれません.

このあたりで,k5にDBから画像を切り離す実装をしてもらい,スコアが40000に乗りました.

その間私は SELECT *をなくし,必要最小限のカラムを取るように変更して,少々スコアを上げました.

そうこうしているうちに,euglenaの実装がほとんど終了しそうだったので,隣にいってバグ取りしました.力にならなくても相手に説明させることで,バグが取れるという経験は私は多くしていたので,行きました.

やっと手元ではredis化ができたようなので,benchmarkerを投げてみたら500が返ってきたので,終了30分前ほどだったのもあったので諦めました.

最後はきちんと指差し確認をしてログを切りました.再起動テストをすると, pumaに権限がなくて起動できないなどあったので,そこらへんを直して,最後はガチャをして,40088のスコアで終了しました,

まとめ

椅子に座ってイスコーンってしてたら,メンバーに本戦に連れて行ってもらえそうなので,良かったです.