ーー 16:43 はじめてのpprofを眺める     

nitoliです。担当はgoです。

我らがチーム「キラッと落☆単」は215位(Score: 1,069)という結果に。
名前が決まった段階で縁起でもないとか笑っていたものの、本当に落☆単してしまいました。
しかも後日届いた成績表で人文社会の単位も落☆単したことが判明したので、
霊験あらたかにもほどがある名前を産み落としてしまったようです。
ただ少なくとも、そうした霊験を発揮する神やら仏やらを囲んで棒で叩く所存です。

今回は各自でレポートが上がるようなので、
ぼくの作業した部分だけ書きます。

nitoliがしたこと

  • 開幕前
    • レポジトリを作成
    • レポジトリに前回のデータを用意
  • 10:00ごろ
    • SSH鍵の登録
    • デプロイ用のシェルの設定
    • サーバ構成の確認
  • 10:30ごろ
    • 3台目をDBサーバに立て、他サーバのenv.shを書き換える
    • 2台目でgolangでの実装を走らせる
    • 2台目にnginxを導入
  • ながいあいだ
    • シェルを書く(!?)
    • /initialize でenv.shがきかないのを突き止める
  • 16:30ごろ
    • pprofでボトルネックを突き止める(おそい)
  • おわるまで
    • シェルを書く(!?)
    • なぜかボトルネック解消バトルを@kabe_armと行う(!?)

なにしてん

PRがあるたびにデプロイ用のシェルを書き、PRのたびにデプロイしていました。
ほかはPRの消化をがんばりました。

そうです。

なんでかこいつ
チームメイトにまざって事務員をしていた
のです。

 

なぜこうなったのか?

 

ぼくと@kabe_armはgoを対応していました。
えげつない回数DBアクセスをしているgetEvent/getEventsを、
@kabe_armがgoのsync.Mapでキャッシュを実装してくれていたので、
ぼくはそれ以外の異常を探す形になっていました。

 

事前に投入しようとしたpprofはEchoへの対応もしたのになぜかうまく動かないという事件が発生、
ベンチが回る三時ごろまでApp/DBサーバが分かれたログも存在してない状態だったので、
己の目こそデバッガだと猛然とコードにはりついたのです。
これがプロです。エンジニアの鑑です。

 

で、結果、
問題点が見つけられなかった。
どうもこんにちは。エンジニアのクズです。

 

ぐるぐるSQLや、big.Intが何回も計算されるみたいな明らかに重い処理は見つからなかったのです。
getEvents以外に。
一応 /adminがとんでもなく遅いこともわかっていましたが、 最適化すべきかが決めあぐねました。
結果的に、そこは担当しても十分よかった箇所だったようです。
クズです。お元気でしょうか。ぼくは元気です。

 

その間ぼくはクリティカルなところを触れていなかったので、PRを読んだりシェルを書いたりしていました。
ほぼすべてのPRをレビューし、デプロイスクリプトの編集・デプロイまで行っていたのはこのためです。
作業がスタートするところに立てなかった。

途中したことといえば、ロードバランシングを助けるべく、
HTMLのテンプレートをいじくって手軽に動かせるようにしたことなのですが、
これは「DOM構造を壊すな」みたいなエラーが出て、コミットは流されていきました。
さよならぼくの青春。いい夢を見た。

 

一番欲しかったpprofは16:30ごろ判明したうえ、
結局直すべき部分はgetEventsに集中しているらしいとしかわからなかったという……。

で、協議の末、@kabe_armのキャッシュとはまったく別に、
ぼくもぼくでgetEventsのキャッシュを実装する
「メモリキャッシュ実装バトル」をしようという流れになり、
さすがに時間が足りず、特に仕事をせずにゴールインしてしまうという形になります。

 

反省

独立して設定できるように、最後に動いた状態をデプロイできるようにすべきでしたかね。
もう少し早い段階に、倒すべき相手がほかにそこまでおらんぞというのを気づけたかなと。

あとコードもう少し読めるようになりたいですね。
ボトルネックになりそうなパターンを目でgrepしただけだったので。

 

これしかし…

ぼく要る?

 

 

そんな感じでした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)