https://tech.mirrativ.stream/entry/2022/08/03/114918
インフラ・ストリーミングチームの id:udzura (@udzura)です。今回は、Goミドルウェアのメモリリークを見つけて解決する際に、どのようなプロセスを踏んでいったかを解説します。
ミラティブでは、Webアプリケーションのみならず、ミドルウェアに相当する部分についても必要なものは内製しています。その中の一つに、社内で「Radisha」と呼んでいる各種集計とキャッシュなどを行うためのミドルウェアがあります。Radishaは以下のような特徴を備えています。
ちなみにRadishaという名前は特徴である**Redis + Raft + HA(High Availability)**から付けられました。
このミドルウェア自体のアーキテクチャなど、詳細な解説は、別の記事に譲ることとします(お楽しみに!)。今回はメモリリークの解決にテーマを絞ります。
なお、今回の記事執筆にあたり、確認や検証を行った環境は以下となります。
このRadishaを検証環境で動作させて、ある程度負荷を掛けつつ挙動を確認していたところ、以下のような問題が発生しました。
メモリリークが発生し、それがリクエストの遅延につながっているのではないかと考えました。そしてログを仕込んだり、色々と検証しているうちに、どうやら長時間書き込みのリクエスト(SET、DELなど)が行われると徐々に肥大していくようだということが分かりました。