サイバーエージェントのインターンでパフォーマンスチューニングした話
6月6日〜7日の二日間、サイバーエージェントのインターンに初参加しました。
今回はその感想と実際にやったことについて書いていきます。
2days サーバーサイド向け 開発型インターンシップ ONLINE🎉
— 【公式】サイバーエージェント新卒エンジニア採用 (@ca_tec_des) 2020年6月6日
が間もなく開始となります!
インターンとしては初のオンライン開催💻#catechchallenge
にて本インターンの情報を発信していきますので、ぜひご確認ください💪 pic.twitter.com/uF3U1yobTX
インターンの概要
最初にSNSっぽい簡単なウェブアプリが渡されます。その後はコードいじるやら設定変えるやらしてボトルネックを淡々と解消していく感じです。
結果
1日目4位 1502点
2日目7位 1953点
でした。最初の5時間くらい進捗ゼロでしたがクエリやログの解析が出来るようになってから少しずつスコアが伸びていきました。(2000点の壁越えられなかったの悔しい)
感想
普段RubyやGoでWebアプリを作ってますが、機能が実装できたら終わり!って感じでチューニングなんて全くしたことのない人間でした。
開始した直後はソースの場所すらも分からず悶えてましたが(他の人も結構そんな感じだった)中間解説でログやクエリの解析方法がわかった後は作業量の多さに気付き、焦りながらやってました。
またランチタイムを通して他の参加者と交流できたのが個人的に良かったです。自分のような文系学部だと、技術的な話を出来る人が周りにいないのでとても貴重でした。
作業終了後に行われた解説やLT会では参考になった事しかなかったです。自分の知らない技術の話をいっぱい聞くことができました。
課題自体には散々苦しみましたが、計測した結果を元に仮説を立て実装していくのはすごく楽しかったです!
サイバーエージェントの社員さん、特にメンターの方にはとてもお世話になりました。メンターさんの問題点の指摘や補足情報にとても助けられました。
今回のインターンを通して大きく成長することができたと思います。興味のある方はぜひ申し込んでみてください!ありがとうございました!
*ここからは実際にやったことをつらつら書いていくので興味ない人はスルーしてください。
実際にやったこと
中間解説があるまでは計測方法もろくに分からなかったので、ひたすらgoのコードとDBを闇雲にいじってました。
画像周りの実装をいろいろいじってたら謎に200点上がりました。
中間解説後はnginxのアクセスログを解析したり、スロークエリを探していました。
alp -f /var/log/nginx/access.log
このコマンドを打つとnginxのアクセスログがLTSV形式で出力されます。
自分はこれに --avg をつけてボトルネックになりそうな場所はどこか探していました。
次にスロークエリを見つけるためにmysqldumpslow というコマンドを使いました。
実際に今回打ったのは
sudo mysqldumpslow /var/log/mysql/slow.log
こんな感じのコマンドです。
この二つを使って中間解説の通りにインデックスを貼ったら初期点から一気に1507点まで上がりました。
この後は中間解説を参考にインデックス 貼れそうな場所はないかずっと探してました。
articlesというテーブルにインデックスを貼ったら処理が早くなりそうだとクエリ解析をして思ったので、とりあえずインデックスを貼ったのですが、なぜかusing indexにならずメンターさんに相談したところ、複合インデックスというものを貼らなければいけないようでした。
複合インデックスの作成は作成時のカラムの順序を正しく記述しなければならないので少し苦労しましたが、調べながらなんとか貼ることができ1667点まであげることができました。
この後も解析した結果を元に永遠とインデックスチューニングばかりやっていました。そうしたら最終的に1953点まで上がりました。
ただなんでも闇雲にインデックスを貼ればいいというわけではなく、貼ると逆に点数が下がってしまう場合もあったので見極めが重要だと思いました。
自分がやったことは以上です。ありがとうございました!