Redisと「巨大なページ」の落とし穴:THPのせいでパフォーマンスが落ちる?
皆さん、こんにちは!Redisの世界へようこそ!
今日は、Redisをちょっとだけ深く知りたい、でも専門用語に圧倒されちゃうのはちょっと…という皆さんのために、Redisのパフォーマンスをこっそり邪魔するかもしれない「Transparent Huge Pages(THP)」という仕組みについて、わかりやすくお話ししたいと思います。
「THP?なんだか難しそう…」と思ったあなた、大丈夫!まるで日常の出来事に例えながら、一緒に紐解いていきましょう。
Redisって、そもそも何者?
まずは、Redisがどんなものか、簡単におさらいしましょう。
Redisは、一言でいうと「超高速なデータの置き場所」です。
例えば、あなたがよく使うアプリで、ログイン状態を一時的に覚えておくとか、人気の商品リストをすぐに表示できるようにしておくとか、そういう「ちょっとだけ覚えておいて、すぐに取り出したいデータ」を、コンピューターの「一番手元にある、速い記憶装置(メモリ)」に置いておくのが得意なんです。
例えるなら、あなたの机の引き出し(メモリ)に、よく使うペンやノート(データ)を整理して入れておくイメージです。机の引き出しは、本棚(ディスク)よりもずっと早く取り出せますよね?Redisは、その「机の引き出し」をめちゃくちゃ賢く、速く使えるようにしてくれるんです。
「THP」って、一体何?
さて、ここからが本題の「THP」です。
THPは、コンピューターがメモリを管理する方法の一つで、「大きなメモリの塊(ページ)を、まとめて扱おうぜ!」という考え方です。
例えるなら、あなたが机の引き出しにペンをしまうとき、一本一本丁寧に定位置にしまうのではなく、「ペンケース(大きなページ)」にまとめてバーッと入れてしまうようなイメージです。
「え、まとめて入れた方が速いんじゃないの?」と思ったかもしれません。確かに、場合によっては速くなることもあります。
THPがRedisに「悪さ」をする理由
でも、このTHP、Redisとの相性がちょっと良くないんです。なぜかというと、Redisはデータの「更新」が頻繁に行われるからです。
Redisは、データをメモリに置いておくとき、そのデータが「いつ更新されたか」を正確に管理しています。これは、後でデータをちゃんと保存したり、バックアップを取ったりするためにとても大事なことなんです。
ここでTHPが顔を出します。THPは、メモリの塊をまとめて扱うので、その塊の中のほんの一部分だけが更新されたとしても、OS(コンピューターの基本ソフト)は「この塊全体が新しくなったぞ!」と勘違いしてしまうことがあります。
例えるなら、ペンケースの中の1本のペンだけ色が変わったのに、ペンケース全体が「新しいペンケースだ!」と認識されてしまうようなものです。
この「勘違い」が、Redisにとってどんな問題を引き起こすかというと…
- パフォーマンスの低下:
Redisは、更新されたデータがどれなのかを正確に把握しようとしますが、THPのせいで「塊全体が更新された」と誤解されると、無駄な処理が増えてしまい、本来のスピードが出なくなります。
例えるなら、ペンケースの中の1本のペンだけ探したいのに、ペンケース全体をひっくり返して探す羽目になるようなものです。
- メモリ消費の増加(CoW):
ここが一番の落とし穴!コンピューターでデータが更新されるとき、安全のために「元のデータをコピーしてから、新しいデータに書き換える」という仕組み(Copy-on-Write、略してCoW)が使われることがあります。
THPが有効になっていると、このCoWの際に、ほんの少ししか変更されていないはずの「大きなメモリの塊」全体をコピーしてしまうことがあります。
例えるなら、ペンケースの中の1本のペンだけ交換したいのに、ペンケースごと全部新しく買い直してしまうようなものです。これでは、本来必要なメモリよりもずっと多くのメモリを使ってしまうことになりますよね。
つまり、THPはRedisの「更新頻度が高い」という特性と、「メモリを効率的に使いたい」というRedisの目的に対して、逆効果になってしまうことがあるんです。
「THPを無効化」って、どうやるの?
「じゃあ、どうすればいいの?」と思いますよね。
多くのRedisの運用現場では、このような理由から「THPを無効にする」ことが推奨されています。
「無効にする」というと、なんだか怖い響きですが、これはコンピューターの設定を少し変えるだけです。
具体的には、Linuxのシステム設定で、THPを「off」にします。
やり方は、お使いのLinuxのディストリビューションによって少し異なりますが、一般的には `/sys/kernel/mm/transparent_hugepage/enabled` というファイルの設定を変更します。
例えば、コマンドラインで次のように実行することが多いです。
THPを無効にするための設定ファイルに書き込む
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
設定が反映されているか確認する
cat /sys/kernel/mm/transparent_hugepage/enabled
実行結果例:
[never] always madvise
このように `[never]` と表示されていれば、THPは無効になっています。
注意点: この設定は、システム全体に影響します。Redisだけではなく、他のアプリケーションのパフォーマンスにも影響を与える可能性があります。ご自身の環境に合わせて、慎重に実施してください。
まとめ:Redisと賢く付き合おう!
今日は、Redisのパフォーマンスを左右するかもしれない「THP」についてお話ししました。
- Redisは、高速なデータの置き場所。
- THPは、メモリをまとめて扱う仕組み。
- Redisの頻繁な更新とTHPの相性が悪く、パフォーマンス低下やメモリ消費増加の原因になることがある。
- 多くの場合、THPを無効にすることでRedisのパフォーマンスが安定する。
Redisは本当にパワフルなツールですが、その力を最大限に引き出すためには、コンピューターの仕組みも少し理解しておくことが大切なんです。
今回のTHPの話をクリアすれば、Redisのメモリ管理の基本はバッチリマスターできたも同然ですよ!
これからも、Redisの奥深い世界を一緒に探求していきましょうね!
コメント