【Google Cloud】GCEのメモリ使用率が上昇していく問題を解消
IT技術
はじめに
こんにちは!今回は、私が担当しているプロジェクトで発生したGCE(Google Compute Engine)のメモリ使用率が徐々に上昇する問題について、その解消に向けた調査と対応の内容を紹介します。
起きていた事象
まず、起きていた事象について説明していきます。
GCEのメモリ使用率の推移を確認すると以下の画像のように徐々に上昇していき、約月に1回OOMキラーでプロセスが終了してメモリ使用率が下がるという事象が確認できました。
メモリ使用率が圧迫しているタイミングでCPU使用率も高くなっており、対応が必要な状況となっていました。
初期仮説と調査のプロセス
まず初期仮説として、担当プロジェクトのGCEではLaravelのバッチ処理を動かしていたため、バッチ処理にメモリリークがあることを疑いソースコードをチェックしました。
結果としては、特に問題のあるコードがなかったことや他のサービスのGCEインスタンスでも同様の事象が起きていたため、この時点で「バッチ処理自体が原因ではない」と判断しました。
次の仮説として、少し重ための処理を行うバッチ処理が存在しているため、スケジューラと競合し、大量のプロセスが生成される可能性を調査しました。
そこでtop
コマンドを使用したプロセスの監視を行うことにしました。
topコマンドとは?
top
コマンドは、Linuxシステムで現在実行中のプロセスやシステムリソースの使用状況をリアルタイムで監視するツールです。以下の情報が確認できます:
- CPU使用率: 各プロセスがどれだけCPUリソースを使用しているか。
- メモリ使用率: プロセスごとのメモリ使用量。
- プロセスの詳細: 実行中のプロセスID (PID)、ユーザー、実行時間、コマンドなど。
数日間にわたり top
コマンドを実行して比較した結果以下のようになりました。
6日後
仮説ではPHPプロセスの増加と見ていましたが、PHPプロセスはメモリ使用量が安定しており、問題を引き起こしている形跡はありませんでした。
代わりに、rubyプロセスが多くのメモリを消費しており、時間の経過とともにメモリ使用量が増加していることが判明しました。
Rubyプロセスの正体
rubyプロセスがメモリ使用率の増加の原因ということが判明したため、次にRubyプロセスの正体を知るために ps aux | grep ruby
コマンドを実行して確認した結果、Google Fluentd で使用されていることがわかりました。
実行結果:
1ps aux | grep ruby
2xxxx 1701 0.0 2.7 248044 56140 ? Sl xxxx xx:xx /opt/google-fluentd/embedded/bin/ruby /usr/sbin/google-fluentd --log /var/log/google-fluentd/google-fluentd.log --daemon /var/run/google-fluentd/google-fluentd.pid
3xxxx 1704 1.5 21.3 864276 436284 ? Sl xxxx xx:xx /opt/google-fluentd/embedded/bin/ruby -Eascii-8bit:ascii-8bit /usr/sbin/google-fluentd --log /var/log/google-fluentd/google-fluentd.log --daemon /var/run/google-fluentd/google-fluentd.pid --under-supervisor
真因と対応内容
Google Fluentdについて調査
Google Fluentdについて調査していると下記のようなissuesが見つかり、Fluentdで発生しているメモリリークによるものと判明しました。
また、1.13.3で改善しているような内容が見つかり、現在のバージョンは1.11.2だったため、バージョンアップしたら解消するのかを様子見してみました。
Looks like 1.13.3 has better memory usage:
- Memory leak in ruby process? GoogleCloudPlatform/google-fluentd#368
- CPU and memory usage regression between Fluentd 1.11.2 and 1.12.3 fluent/fluentd#3389
再度数日間 top
コマンドで監視をしましたが問題は解決していませんでした。
(上記リンクをよく見ると1.13.3でも改善していないように見える…)
Opsエージェントの更新
その後もFluentdやGoogle Cloudのドキュメントを読んで調査をしていたところ、エージェントが古いことが判明しました。
更新手順は簡単で、インスタンスのオブザーバビリティページを開いて[OPSエージェントを更新]を押下し、表示される手順通りに[Cloud Shell で実行] をクリックして Enter キーを押下するのみです。
Opsエージェントの更新後、GCEのメモリ使用率は安定し改善が見られました。
まとめ
今回のGCEでのメモリ使用率上昇問題の解決は、最終的にOpsエージェントの更新によって解消しました。問題解決までの過程では、初期の仮説が外れたり、遠回りをしたりしましたが、調査の積み重ねが最終的な解決につながったと思います。
また、今回のプロセスを通じて以下のようなことを学びました。
- 問題の原因を特定する際には、仮説を立てつつも視点を柔軟に持つことが重要
- Google Cloudの推奨設定やツール(Opsエージェントなど)を定期的に確認し、更新を行うことが有効
今回の記事が同様な課題に直面した際の参考になれば幸いです。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ