前書き
この記事は、MicroAd Advent Calendar 2020の8日目の記事です。
redisのthpに関して色々調べて、情報が連続した資料ないなと思ったので適当に残します。
ふんわりとした認識の部分も多いのでマサカリ大歓迎です()
##分かる人向け
redisがスナップショット取るのにfork命令叩くからページサイズが大きいとCopy On Write(CoW)の関係でメモリがwriteで死ぬ
問題
redisをインストールしたことのある方なら分かると思うのですが、
"WARNING you have Transparent Huge Pages (THP) support enabled in your kernel"
という警告を見たことはありませんか?
これ自体はTHPを無効化するように/sys/kernel
に書き込んであげると解決します。公式ドキュメント(latency)にも概要は書いているのですが、少し踏み込みたいと思います。
そもそもTHPとは
THPはTransparent Huge Pagesの略で、Transparent(透過)なHuge(巨大)なPageのことです。
ってなると(Huge)Pageとはとなるのが筋かなと思います
(Huge)Pageとは
linuxでは物理メモリ空間を4kbごとのページに区切ってページテーブル(メモリの割当管理テーブル)を作成し、管理しています。
プログラムがメモリへアクセスするときははメモリを直接参照しに行くのではなく、一度プログラムが持っているポインタ(論理アドレス)とページテーブルを比較し、対応する物理アドレスを入手しに行くという工程を踏んでからアクセスしています。取得してきたらTLBというキャッシュに突っ込みます。
しかし最近の大容量メモリが普通となった環境では4kb単位でメモリ管理をするのは細かすぎて非効率な問題があります。(キャッシュ効率・ヒット率の低下、そもそもページテーブルが大きくなるなど)
そこで登場したのがページサイズを大きくしてより効率的に扱えるようにするHugePageということです。
しかしこのhugepage、利用するためにはプログラムの変更やJVMに-XX:+ UseLargePages
の指定が必要です
詳しくはこの辺りを読んでください
改めてTHPとは
そこで現れるのがTHPなのですが、超雑に言うとプログラムを書き直さずmalloc
しただけでhugepageをいい感じに使ってくれます。
巨大メモリへのランダムアクセスが多いサービスを利用しているときは無効化したほうが良さそうです。
/defragを除き基本的に有効で問題なさそうです。
使っているmalloc
やmadvise()
の要求が設定次第で関係あるようですが、kernel分からんの人間なので詳しい方にお任せします
なぜTHPを無効化するの?
じゃあredisなんてメモリめっちゃ使うんだから有効化したほうが早いでしょなんで??となると思うのですが、原因はredisがforkするからです。
redisはスナップショットを取るときにメモリの状態を保持するためにfork(プロセスをコピー)します。なので基本使用メモリは実メモリの半分推奨だったりします。
でも実はforkしてもCopy On Write(CoW)という機能があってfork直後は同じページを参照しています、実際にコピーされるのはデータが書き込まれたときだけです。CoWがあるおかげでredisのメモリ全コピーを避けれてる非常に恩恵の大きい機能です。
しかし、メモリの書き込み領域の判定はページテーブルを参照してページサイズ単位で判断しています。そしてhugepageが利用されているとページサイズが大きくなっているのでその分だけメモリ変更があったと判断されやすくなり、更にコピーするサイズのメモリ量が増大するので、サーバーにもよりますがメモリ全コピーが発生する可能性があります:party_parrot:。
なのでthpを無効化しようね、ということらしいです。
あとがき
実はこれ書いたときはRedis Administrationの記事しか読んでおらず、latencyの項目に書いてある詳細な説明に気づいておりませんでした......。とはいえカーネルのメモリ管理からredisまで一貫した説明のあるドキュメントはあまり無いと思うので取っ掛かりになれば嬉しいです。
また、この記事を書くに当たり
Redisのセットアップについて考えてみる ~ Transparent Huge Pages ~ - レガシーガジェット研究所
[postgres]大容量メモリかつOSがRHEL(CentOS)6系をお使いの方、THPのdefragは止めた方が良いですよ - Qiita
革命の日々! transparent hugepage considered harmful
の記事は特に参考にさせていただきました、ありがとうございます。