CARTA HOLDINGS の秋季インターンシップ 【Sunrise】 に参加してきました!
インターンを振り返りつつ行ったことや感想などをまとめます!
インターン概要
5日間の対面インターンで、イベント計測サーバーを秒間30,000リクエスト捌けるように、インフラ・Golangアプリの両方からパフォーマンスチューニングを行うという内容でした。
4人1組でチームを組み、そこに技術メンターと人事メンターの2名(私たちのチームでは人事2名の計3名)がついてくださいました。
インターン中は90分手を動かして20分の発表という、「仮説・検証・考察」→「発表」のサイクルをひたすらぶん回しました!
スプリントの流れとしては、作成済みor作成するissueから優先順位を決めてターム毎にやるタスクを決め、その後、仮説を立てて検証を行い、その結果何がわかったのかissueに書き込み、そのissueを元に発表を行いました。
5日間で圧倒的成長を遂げることができました!!
1日目
初日に行ったこと
初日は午前中にガイダンスや簡単なレクリエーションがあり、午後からチーム発表、講義・ワークが行われました。
初日に終わらせるべきワークは終わったものの、AWSに関して全然わからん状態だったので再デプロイ方法に苦慮しました。
課題が終わるのか、チームに貢献できるのか少し不安はありつつも、チームメンバーやメンターさんが優しく面白い人ばかりだったのでこの人たちと成果よりもとにかく楽しもう!と切り替えました。
懇親会
ワークが終わった後は懇親会があり、美味しいご飯を食べた後、ボードゲーム大会が開催されました。
なんと個人で最多タイのポイントを獲得し、チームも優勝することができました!
ポイントが多い人はボドゲを貰えました!
優勝チームには美味しい景品が!!
懇親会ではとても楽しい時間を過ごすことができました〜
2日目
issueを活用
初日の振り返りで、チームメンバー同士何を行っているのか進捗などの把握ができていなかったのでGitHubのissueを2日目から活用し始めました。結果的にこれがとてもうまくいきました。
最初に誰がどのissueを行うのか決定することで、issueを見れば何を行っているのか把握でき、現状の進捗確認にも役立ちました。
また日数が経つにつれて、issueのテンプレートを決めたりログ取得時のフォーマットを決定した結果、発表で大いに役立ちました。
SLOの決定
初日にSLOについての講義がありました。
SLO(Service Level Objective)とは文字通りサービス品質目標のことで、どの程度のダウンタイムやイベントログの抜け漏れを許容するのか基準を決めた目標のことです。
目標を決めなければパフォーマンスチューニングはいつまでも終わらず、パフォーマンスチューニングを突き詰めていくとコストが増大してしまうため、サービス品質とコストのバランスを含めた目標を決定しなければいけません。
今回のインターンでは全体の目標として30,000rpsを捌けるようにするというお達しが出ていたので、具体的に30,000rpsを捌くとはどのような状態なのか、どこまでを許容するのかをチームで話し合いました。
ローカル環境でもパフォーマンスチューニング
2日目からチームを分けてワークを行っており、片方のチームがデプロイなどインフラ周りの調査をしている間に、私ともう1人の方でローカルでの実行環境を整えることにしました。
今回のインターンはエラーとの戦いでしたが、ローカルでの実行環境を整えることで予めアプリケーション由来のエラーを早期に解決することができ、効率化に貢献できたと思います。
またプロファイリングツールを導入し、ローカル環境でボトルネックの調査・改善ができるようになりました。
今回のインターンでは「推測するな、計測せよ」という言葉を大事にしており、他のチームで結果が出たからと言ってそのまま真似るのではなく、なぜそれを行うのか判断材料も重要でした。
そのため、ボトルネックの理由付けとしてもプロファイリングツールはとても役に立ちました。
ある施策を行って、とあるボトルネックを解消すると、すぐに2,3万rpsに到達するのですが、プロファイリングツールを見ると9割以上そのボトルネックな処理に時間がかかっていたので、計測は本当に重要だと思い知らされました。
またプロファイリングツール以外にもベンチマークテストを自作し、ローカル環境で性能の良し悪しを計測できるようにしました。
本番環境で性能改善が行われないと意味はないですが、デプロイして計測してログを取得するのに時間がかかるので、まずローカル環境で性能改善があるかどうかを判定してから本番に適用することで効率化を行うことができました。
3日目
デプロイの効率化
これまでデプロイに時間がかかっていましたが、チームメンバーの1人がデプロイ後すぐにインスタンスに反映されるようにしてくれて、デプロイ方法についても分かりやすくドキュメントにまとめてくれました。
このインターンではひたすら対照実験を繰り返すのでデプロイの回数が多いのですが、それを簡単に分かりやすく行えるようになったのでインターンのサイクルにおけるデプロイというボトルネックが解消されました!
エラーとの戦い
3日目の進捗はあまりなく、ひたすらエラーと格闘していました。
Too many connections や Too many open filesなどのエラーに悩まされており、今思えばこの段階でメンターさんにもう少し頼っても良かったのかなと思いました。
4日目
パフォーマンスチューニングは4日目が最終日だったので、今まで全員で話し合って進めていましたが、速度重視で役割分担を行いました。
私は基本的にGolangアプリケーション側から改善を行い、チームメンバー3名はインフラ側のパフォーマンスチューニングやログ取得を行っていました。
本来は全員でパフォーマンスチューニングを行いたかったのですが、ワーク最終日で時間が迫っていたのでこのような役割分担になりました。
目標達成...
午前中にある施策の実装が終わりました。
お昼休みに1人のメンバーと「現在のrpsの状況だけ軽く確認したいね」という話になり、計測を行ったところ、
いつの間にか30,000rpsを捌けるようになっていました...
30,000rps達成の瞬間は全員で味わいたかったのですが、まさか1000rpsから一つの施策を反映させただけで突破するとは思わず、喜びつつも困惑するという不思議な感情を味わいました。
メンターはつよつよ
午後からは不完全な実装だったGolangアプリケーションに手を加えていました。
実装自体は、自分の思い描いたアルゴリズムをコードにすることができたのですが、検証しても意図した通りの挙動にならず詰まってしまいました。
メンバーに現状を共有し、自分たちでは解決に時間がかかりそうと判断してメンターさんに質問をしました。
結果的に、実装自体は間違っていなかったのですが、検証方法に問題がありました。
2名のメンターさんに一瞬で問題の特定をしていただきましたが、自分では実装が間違っていないかずっと確認していたので、早めにメンターさんに質問をして解決することができ良かったです。
つよつよエンジニアは実装力だけでなく柔軟な思考力も含めてつよつよなんだと思い知らされました!
最終成果
最終的には目標値の30,000rpsを超えて、40,000rpsを捌くサーバーにチューニングすることができました!
チーム一丸となって各々ができる最大限の行動をした結果だと思っています。
みんなありがとう!!!!
5日目
午前中に発表資料の作成を行い、午後に成果発表を行いました。
成果発表ではスプリントで何度も発表したおかげか、緊張することなく発表を行うことができました。
成果発表が終わった後は、好評や最終講義が行われ、その後修了証の授与が行われました。
写真だと伝わりづらいですが宝の地図みたいな不思議な紙質でかっこいいです!
苦労した点
インターンではひたすらエラーに悩まされていました。
その中でも、エラーが出てもそのエラー内容が確認できないことに大変苦労しました。
計測ツールのerror rateが0%でないにも関わらず、Cloud Watch上にエラーがなく、エラーの原因が何なのか最後までわかりませんでした。
ステータス上では200レスポンス以外も確認することができたのですが、具体的なエラー内容がわからなかったので、今後はAWS上でのエラー取得方法を模索したいと思います。
エラーログを吐いてくれることがどれだけ幸せなことか気づくことができました
心残り
方針や施策などはチーム全員で話し合いましたが、それをGolangのコードに反映させるのは全て自分が書いてしまったので、もう少しチームメンバーにお任せしても良かったかもしれません。
時間の都合上厳しかったですが、もう少しナビゲーターとして振る舞うべきでした。
途中でペアプロも行いましたが、私がコードを書く役だったのでGolang由来のcommitは全て私のものになっており、チーム開発で学べるGit/GitHub周りのコマンドやコンフリクト解消、レビューなどの学びの機会が減ってしまったためその点も少し心残りがあります。
また時間が無かったので他にも4つほど施策があったのですが、試せなかったor最後に外してしまったことが少し消化不良でした。
ですが適切な優先順位を付けて目標値を達成することができたので後悔はありません!
感想
複数あるので箇条書きで書きます!
-
Sunriseでは順位争いなどがなく、他のチームの発表から良い部分を自分たちのチームに取り入れることができ、より多くの学びを得ることができました。
-
メンターさんが毎回ちょうどいいタイミングで今何を行っているのか、なぜそれを行うのかをチームに質問していただけて、他人に言語化して説明することで思考の整理に繋がりました。
-
AWSは学生が色々実験するにはお金がかかってしまいますが、料金に関しては考えなくて良いとのお許しがあったのでEC2のインスタンスを簡単に複数個立てたり、RDSのパラメータをとんでもなく大きな数字にしてクレジットを使い切ってしまったりなど普段はできない経験をすることができました。(最終的に5日間で15,000円くらい使ってました...)
-
最初はAWSの構成図を見ても何一つ分かりませんでしたが、最終的には人に説明できるくらい理解することができ、自分でも成長が実感できるインターンになりました!
他にも、インターン中に用意していただいた食べ物が全て美味しかったです!
過去の参加記事やX(旧twitter)を見た感じ、CARTAのインターンは食べ物を掲載するのが伝統になりそうですね笑
他にも美味しいご飯やおやつがたくさんありました!
用意していただきあリがとうございます!ごちそうさまでした
おわりに
Sunriseは楽しかったの一言に尽きます!!!
何よりチームメンバーのおかげでとても楽しかったです。
メンターの方々をはじめ、このようなインターンの機会を用意していただいた全ての方に感謝します。
ありがとうございました!!