カスタムメトリックでキャッシュヒットを追跡し、DBクエリ急増の原因を特定する
AppSignalを利用するアプリケーションが動作しているすべてのサーバーは、30秒ごとにサンプルとメトリクスのコレクションをPush APIへ送信しています。
各リクエストにはキーが付与されており、このキーをもとに、そのデータがどのアプリケーションから送られてきたものかを判別します。そのためには、受信したリクエストごとにデータベースへ問い合わせて該当するアプリを検索する必要があります。月間300億件という膨大なリクエストを処理する私たちは、AppSignalをより高速に動作させるため、クエリ数をいかに減らすかを常に模索しています。
キャッシュ導入後に逆にクエリが増加した問題
そこで私たちは、データベースクラスタへのクエリ数を削減するためにキャッシュを実装しました。データベースからアプリを取得するたびに、その結果をMemcachedに1分間保存する仕組みです。
しかし、この変更を本番環境にデプロイしてみると、クエリ数はむしろ以前より増えていることが判明しました。どうやらキャッシュが必要以上の頻度で無効化されているようです。原因を突き止めるため、どこでキャッシュが不適切に無効化されているのかを調査できるカスタムメトリックを追加することにしました。
キャッシュが無効化される箇所
キャッシュを無効化する箇所はいくつかあります。たとえば、push処理の時刻が更新されたときや、新しいnamespace(名前空間)を検出したときなどです。
# 最終push処理時刻を更新
if app.last_push_processed_at < 5.minutes.ago
app.set(:last_push_processed_at => Time.now)
Rails.cache.delete(cache_key)
end
if namespaces_diff.any?
app.add_to_set(:namespaces => namespaces_diff)
Rails.cache.delete(cache_key)
endカスタムメトリックによる原因の切り分け
どの無効化処理が犯人なのかを特定するために、複数のカウンターを追加しました。以下の例では、app.cache.invalidateカウンターで無効化の総数をカウントしつつ、個別の無効化にはapp.cache.invalidate_push_timeやapp.cache.invalidate_namespacesといった専用のキーを使って計測しています。
# 最終push処理時刻を更新
if app.last_push_processed_at < 5.minutes.ago
app.set(:last_push_processed_at => Time.now)
Rails.cache.delete(cache_key)
Appsignal.increment_counter('app.cache.invalidate', 1)
Appsignal.increment_counter('app.cache.invalidate_push_time', 1)
end
if namespaces_diff.any?
app.add_to_set(:namespaces => namespaces_diff)
Rails.cache.delete(cache_key)
Appsignal.increment_counter('app.cache.invalidate', 1)
Appsignal.increment_counter('app.cache.invalidate_namespaces', 1)
endこれらのカスタムメトリックを追加したことで、時間経過に沿ったキャッシュヒット状況をグラフ化できるようになりました。すると、どのキャッシュキーがクエリ増加の引き金になっているのかが一目瞭然でした。app.cache.invalidate_namespacesキーが、リクエストごとに毎回無効化されていたのです。
なお、キャッシュ可能なリクエストの総数はapp.cache.maybeとしてカウントしています。
修正後の結果
この問題に対する修正をデプロイしたところ、アプリのnamespaceが更新されない限り、無効化の回数はゼロまで減少しました。
カスタムメトリックを活用すれば、「何が・いつ・どこで・どのくらいの頻度で」起きているのかを把握しやすくなります。今回のケースでは、キャッシュ無効化の回数を読みやすいグラフとして可視化できたおかげで、問題を素早く発見することができました。必要なのは、特定の値をインクリメントする数行のコードと、ダッシュボードを作成する作業だけです。
カスタムメトリックについてご不明な点がある場合や、アプリケーションへの導入でお手伝いできることがあれば、ぜひお気軽にお問い合わせください。喜んでサポートいたします!
-
Androidでアプリのキャッシュを削除する方法|Chromeのキャッシュもスッキリ整理
AndroidデバイスにインストールされたアプリやChromeなどのブラウザは、さまざまな情報を保存しています。これにより、ページやアプリの読み込み時間が短縮されるというメリットがあります。しかし、時間が経つにつれてファイルが蓄積され、逆に端末を圧迫する原因になってしまうのです。 そのため、Androidの動作を高速化したい、あるいはストレージ容量を少しでも空けたいという方は、アプリのキャッシュを削除することが重要です。キャッシュをクリアすることで、ウェブサイトの表示不具合が改善されるケースもあります。 もちろん手動での削除も可能ですが、かなりの時間がかかります。信じられない方は、ぜひ一度試し
-
Androidのキャッシュをクリアする方法!手動・アプリ両方の手順を徹底解説
人間が日を追うごとに若返る姿を見たことがありますか?ないはずです。実はガジェットも同じことが言えます。使えば使うほどスムーズに動作し続けるデバイスは、ほとんど存在しないのです。 では、なぜこのようなことが起こるのでしょうか。パソコンの動作が遅くなるのは、データや不要なジャンクファイルが蓄積していくからです。同様に、Android端末もキャッシュが溜まることで動作が不安定になり、挙動がおかしくなることがあります。 Android端末における「キャッシュ」とは? キャッシュデータとは、より高速なアクセスを実現するために、端末のメモリ上に保存された元データのコピーのことです。簡単に言えば、アプリやシ