SlideShare a Scribd company logo
12
Most read
18
Most read
19
Most read
memcachedの仕組みと設定
      明石
目次
•   自己紹介
•   memcached とは?
•   データ構造
•   データサイズに応じた設定方法
•   終わりに
自己紹介
•   明石 達也
memcached とは?
•   揮発性 key-valueストア(KVS)
•   シンプルなメモリキャッシュシステム
•   データはメモリ上でのみ保持される
•   高速な get / set が可能
•   永続的なデータのストレージには不向き
•   認証やセキュリティの機能が皆無
データ構造
データの追加
データサイズの決定
•   データを格納する際ははじめに格納データのサイズを決定する
•   データサイズは key + value + flags によって算出される
•   更にキー管理のための付加情報(固定サイズ)と思しき領域がある
•   flags は固定サイズのようで、実際 key と value に使用出来る容量は小さい




                  データ領域                    付加情報?


           key       value         flags

                             データ
データの追加
Slab Classを決定する
•   memcached を起動した際に複数の Slab Class が定義され、格納されるデータ
    サイズに応じて Slab Class が選択される
                    小さい
                    これも小さい
                   これに収まる、
                     決定!
150 byte                      Slab Class 6
                                         5
                                         1
                                         4
                                         2
                                         3


                          1
データ                                      152 byte
                                         240
                              ChunkSize: 304byte
                              ChunkSize: 96 byte
                                         192
                                         120 byte
                                           4369
                              Chunks/Page: 3449
                              Chunks/Page: 10922
                                            240
                                           8738
                                           6898


                          2
                               Slab Classes
                          3
                          4



    はじめてその Slab にデータを格納
                          5




    する際は、そのクラスの Page を
          作成する
                          6
Slab と Page について
•     Page は 1MB のデータ空間のことで、固定サイズの Chunk というデータ領域
      で区切られている
•     Page は特定の Slab に属しており、Page が生成される際に Slab が決定され
      る


    Slab Class 1
                Slab Class 2
                               Slab Class 3
                                                      Chunk
                     Pages
                                       Slab Class 4
     固定サイズの用紙の中がマス目で区切られていて、マス目
     にデータが入れられるイメージ
     Slab Class はいわばマス目の大きさが違う書式フォーマット
データの追加
Page 上にデータをセット
•   Page の空き Chunk にデータがセットされる




    データ                  Slab Class 3
違うデータをセットする時
•    データサイズの決定、 Slab の選定、 Page へのセットを行う
•    該当する Slab の Page がない場合は先ほどと同じように Page を作成する
•    Page がある時はその Page の空き Chunk にデータをセットする



    データ

                       1
                           Slab Class 1 Class 2
                                    Slab      6
                                              5
                                              4
                                              3
                           ChunkSize: byte ChunkSize: byte
                           Chunks/Page:    ChunksPerPage:


                                     2
Slab Class 3
                                     3

                                            Slab Class
                                     4
データの削除
•   データを削除する際はそのデータを物理削除するのではなく、 Chunk に削
    除フラグを立てる
•   削除フラグが立っている Chunk は Free Chunk として扱われ、次にデータが
    セットされる時に優先的に上書きセットされる


    Slab Class 3


             Free Chunk
Page がいっぱいになったら
 •   Page 内の Chunk がいっぱいになってデータがセットできない時は同一 Slab
     の Page を新しく1つ作る
 •   Page が増えたびに空きメモリを消費していく

データを追加したい                                いっぱい
               Slab Class 3             もう入らないよ

                              Slab Class 3


                                                  Slab Class 3
                                                  ChunkSize: 152 byte
                                                  Chunks/Page: 6898
                              Page 追加!


                                             3
メモリサイズがいっぱいになったら
 •    新しいページを追加することで memcached が設定されたメモリサイズ上限
      を超える場合、 Page を追加することはできない
 •    その際は Slab の中で最後に参照された日時が一番古い Chunk にセットする

データを追加したい
                                      Slab Class 3

                           Slab Class 3      最近 get されて
                                             ないし、上書
           やった!                              きしていいよ
     空き Chunk が   追い出し発生
     ないし新しい
     Page も追加で
     きない・・・

                          LRUUsed
                     Least Recently
まとめ
•   Page: Slab に割り当てられる固定サイズのメモリ領域 (デフォルト1MB)
•   Chunk: 1レコードを格納するためのメモリ領域。Page は複数の Chunk に区切
    られて構成されている(データサイズの節で記載した付加情報の領域は厳密
    に言うと Chunk の管理情報かもしれない)
•   Slab Class: Chunk サイズを定義している設定。起動時に複数のクラスが定義
    され、途中で変更されることはない
•   memcached のこの仕組みを Slab Allocator という
•   Slab Allocator を用いることでメモリの断片化(フラグメンテーション)が発生
    しない
データサイズに応じた設定方法
memcachedの設定について
                                                                 x 1.25
•   メモリサイズ上限(-m): プロセス
                                       Slab Class: 1                     Slab Class: 2
    が使用するメモリサイズの上限
                                    Chunk Size: 96 byte               Chunk Size: 120 byte
    目安
    (デフォルト: 64 MB)                  Chunks/page: 10922                 Chunks/page: 8738
                                    Record Data Size: 48 byte             Record Data Size: 72 byte
•   最小データサイズ(-n): 最小chunk                                  x 1.25
    に格納できるキーと値とフラグ
    情報を合算したサイズ
    (これに付加情報とおもわれるも                    Slab Class: 3                     Slab Class: 4
    ののサイズが加算されたものが                  Chunk Size: 152 byte              Chunk Size: 192 byte
    実最小chunkサイズとなる)                  Chunks/page: 6898                 Chunks/page: 5461
    (デフォルト: 48 byte)                Record Data Size: 104 byte        Record Data Size: 144 byte

•   Grouwth Factor(-f): chunkサイズの
    乗算値設定
    (デフォルト1.25)                        Slab Class: 5                     Slab Class: 6
                                    Chunk Size: 240 byte              Chunk Size: 304 byte
                                     Chunks/page: 4369                 Chunks/page: 3449
                                    Record Data Size: 192 byte        Record Data Size: 256 byte
注意: 一度作成した Page は破棄されない
•   memcached は一度作成した Page は破棄せずにメモリ上に保持し続けるため、
    注意が必要となる
•   時間経過によってデータサイズが変動するデータを memcached で取り扱う
    場合は注意


例
• 上限設定: 8MB                    Slab Class 1
                               Slab Class 11           Slab Class 2
                                Slab Class 1
                                 Slab Class 1
• 最初は小さいデータが大量                    Slab Class 1
                                   Slab Class 1
                                    Slab Class 1
                                     Slab Class
  に作られるが、徐々にそれ                      Slab Class 1はスッカスカ
  らが大きくなる特性を持つ
                                 Slab Class 2 は大量の追い出し
• 最終的には Slab Class 1,2 にそ
                                             効率悪し
  れぞれ同じくらいの比率で
  データが格納される想定
                         小さいデータが大                (上限を超えるが・・・)
                       小さいデータが徐々
                         量にセットされ、8                やや大きいデータが
                                                  1ページ目は作られる
                       に減っていき、空き
                          ページ作られた                 徐々に増えるが新た
                        Chunk が出てくる               に Page を作れない!
case 1: 固定長データの場合
•   セットされるデータサイズが固定長の場合、データサイズに応じて最小データサ
    イズを調整すると良い
•   例)
    キーと値を足してちょうど 100 byte の値のみが最大10000個セットされる場合
•   → memcached –n 118 –M 2 とすると丁度良い
•   キー+値=100 byte の場合、-n 113 で起動したところ、Slab Class 1 の Page に値が入っ
    た。その際、 Chunk サイズは 168 byte で、 Chunk 数は 1 Pageあたり6241個となった。
    2 Page あれば事足りるのでメモリサイズは 2 MB に設定する。
•   特定サイズのデータがどの Chunk サイズに格納されるかはやってみないとわから
    ないところがあるので、実際に格納してみてどのサイズだとピッタリあうか試し
    てみる必要がある
•   必要に応じて本番環境で一度 verbose モードで起動し、Chunk Size を確認してみる
    のもよし
•   ※同じ設定でも環境によって Chunk サイズが変動することがある
case2: 決められた種類の複数データを格納する場合
•   サイズの違う複数種類のデータを格納する場合はそれぞれに合わせて Chunk
    Size を調整すると good
•   例)
    以下の3種類のデータを格納する場合 (Expire 4h 、個数は今後増える想定)
    a. 87~101 byte のデータが 85 万個
    b. 130~263 byte のデータが 374 万個
    c. 83~217 byte のデータが 15 万個
•   → memcached –n 64 –f 2.5 –M 1500 にすると以下のようになる
    slab class 1: chunk size 112 perslab 9362
    slab class 2: chunk size 280 perslab 3744
•   slab 1 の chunk が 925,000 個、 99 Page
    slab 2 の chunk が 3,815,000 個、 1,019 Page という想定
•   1,118 Page 、今後増えることを鑑みると余裕を見て 1.5 GB にしたほうがよい
    だろう
case3: データサイズが完全に不定の場合
•   メモリサイズ以外を標準設定で memcached を起動すれば良い
•   デフォルト設定の factor: 1.25 はバランスが良い設定で、最も効率よくメモ
    リを利用できるとされている
•   ただし、メモリサイズ上限はかなり余裕を持った方がいい。大体実際に格
    納されると想定されるデータサイズ合計の2倍以上目安(追い出しを許容す
    るなら小さくてもいい)
•   factor を小さくすると Slab Class が多くなり、 Chunk の隙間の無駄が小さく
    なるが Page 上で使われない無駄な Chunk が多くなる
•   factor を大きくすると Slab Class が少なくなり、 Chunk の隙間の無駄が大き
    くなるが Page 上で使われない無駄な Chunk が少なくなる
•   メモリサイズが大きいほど factor が小さいことによる無駄が少なくなる
終わりに
KVS のデータストレージとして最近は Redis を使うことが多くなってきたが、
要件によっては memcached を使うこともまだまだある。
その時はデータ構造を頭に入れた上で見積もりをしてみてほしい。

More Related Content

PPTX
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
Redis勉強会資料(2015/06 update)
PPTX
本当は恐ろしい分散システムの話
PDF
DockerとPodmanの比較
PPTX
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
PPTX
マイクロサービスにおける 結果整合性との戦い
PDF
Apache Arrow - データ処理ツールの次世代プラットフォーム
PDF
OpenStack勉強会
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
Redis勉強会資料(2015/06 update)
本当は恐ろしい分散システムの話
DockerとPodmanの比較
Apache Spark on Kubernetes入門(Open Source Conference 2021 Online Hiroshima 発表資料)
マイクロサービスにおける 結果整合性との戦い
Apache Arrow - データ処理ツールの次世代プラットフォーム
OpenStack勉強会

What's hot (20)

PDF
MHA for MySQLとDeNAのオープンソースの話
PDF
TIME_WAITに関する話
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
PDF
Google Cloud のネットワークとロードバランサ
PDF
PostgreSQL Unconference #29 Unicode IVS
PPTX
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PDF
OpenStack Swift紹介
PPTX
Redisの特徴と活用方法について
PDF
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
AWS EC2 Eメール制限解除 - 逆引き(rDNS)設定 申請手順
PDF
BuildKitの概要と最近の機能
PPTX
コンテナネットワーキング(CNI)最前線
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
PPTX
root権限無しでKubernetesを動かす
PDF
XenDesktop / XenAppの可用性を最大化するポッドアーキテクチャとは
PDF
MySQLバックアップの基本
PPTX
イベント・ソーシングを知る
PDF
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
PDF
Fluentdのお勧めシステム構成パターン
MHA for MySQLとDeNAのオープンソースの話
TIME_WAITに関する話
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー
Google Cloud のネットワークとロードバランサ
PostgreSQL Unconference #29 Unicode IVS
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
OpenStack Swift紹介
Redisの特徴と活用方法について
PostgreSQL初心者がパッチを提案してからコミットされるまで(第20回PostgreSQLアンカンファレンス@オンライン 発表資料)
AWS EC2 Eメール制限解除 - 逆引き(rDNS)設定 申請手順
BuildKitの概要と最近の機能
コンテナネットワーキング(CNI)最前線
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
root権限無しでKubernetesを動かす
XenDesktop / XenAppの可用性を最大化するポッドアーキテクチャとは
MySQLバックアップの基本
イベント・ソーシングを知る
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Fluentdのお勧めシステム構成パターン
Ad

Memcachedの仕組みと設定

  • 2. 目次 • 自己紹介 • memcached とは? • データ構造 • データサイズに応じた設定方法 • 終わりに
  • 3. 自己紹介 • 明石 達也
  • 4. memcached とは? • 揮発性 key-valueストア(KVS) • シンプルなメモリキャッシュシステム • データはメモリ上でのみ保持される • 高速な get / set が可能 • 永続的なデータのストレージには不向き • 認証やセキュリティの機能が皆無
  • 6. データの追加 データサイズの決定 • データを格納する際ははじめに格納データのサイズを決定する • データサイズは key + value + flags によって算出される • 更にキー管理のための付加情報(固定サイズ)と思しき領域がある • flags は固定サイズのようで、実際 key と value に使用出来る容量は小さい データ領域 付加情報? key value flags データ
  • 7. データの追加 Slab Classを決定する • memcached を起動した際に複数の Slab Class が定義され、格納されるデータ サイズに応じて Slab Class が選択される 小さい これも小さい これに収まる、 決定! 150 byte Slab Class 6 5 1 4 2 3 1 データ 152 byte 240 ChunkSize: 304byte ChunkSize: 96 byte 192 120 byte 4369 Chunks/Page: 3449 Chunks/Page: 10922 240 8738 6898 2 Slab Classes 3 4 はじめてその Slab にデータを格納 5 する際は、そのクラスの Page を 作成する 6
  • 8. Slab と Page について • Page は 1MB のデータ空間のことで、固定サイズの Chunk というデータ領域 で区切られている • Page は特定の Slab に属しており、Page が生成される際に Slab が決定され る Slab Class 1 Slab Class 2 Slab Class 3 Chunk Pages Slab Class 4 固定サイズの用紙の中がマス目で区切られていて、マス目 にデータが入れられるイメージ Slab Class はいわばマス目の大きさが違う書式フォーマット
  • 9. データの追加 Page 上にデータをセット • Page の空き Chunk にデータがセットされる データ Slab Class 3
  • 10. 違うデータをセットする時 • データサイズの決定、 Slab の選定、 Page へのセットを行う • 該当する Slab の Page がない場合は先ほどと同じように Page を作成する • Page がある時はその Page の空き Chunk にデータをセットする データ 1 Slab Class 1 Class 2 Slab 6 5 4 3 ChunkSize: byte ChunkSize: byte Chunks/Page: ChunksPerPage: 2 Slab Class 3 3 Slab Class 4
  • 11. データの削除 • データを削除する際はそのデータを物理削除するのではなく、 Chunk に削 除フラグを立てる • 削除フラグが立っている Chunk は Free Chunk として扱われ、次にデータが セットされる時に優先的に上書きセットされる Slab Class 3 Free Chunk
  • 12. Page がいっぱいになったら • Page 内の Chunk がいっぱいになってデータがセットできない時は同一 Slab の Page を新しく1つ作る • Page が増えたびに空きメモリを消費していく データを追加したい いっぱい Slab Class 3 もう入らないよ Slab Class 3 Slab Class 3 ChunkSize: 152 byte Chunks/Page: 6898 Page 追加! 3
  • 13. メモリサイズがいっぱいになったら • 新しいページを追加することで memcached が設定されたメモリサイズ上限 を超える場合、 Page を追加することはできない • その際は Slab の中で最後に参照された日時が一番古い Chunk にセットする データを追加したい Slab Class 3 Slab Class 3 最近 get されて ないし、上書 やった! きしていいよ 空き Chunk が 追い出し発生 ないし新しい Page も追加で きない・・・ LRUUsed Least Recently
  • 14. まとめ • Page: Slab に割り当てられる固定サイズのメモリ領域 (デフォルト1MB) • Chunk: 1レコードを格納するためのメモリ領域。Page は複数の Chunk に区切 られて構成されている(データサイズの節で記載した付加情報の領域は厳密 に言うと Chunk の管理情報かもしれない) • Slab Class: Chunk サイズを定義している設定。起動時に複数のクラスが定義 され、途中で変更されることはない • memcached のこの仕組みを Slab Allocator という • Slab Allocator を用いることでメモリの断片化(フラグメンテーション)が発生 しない
  • 16. memcachedの設定について x 1.25 • メモリサイズ上限(-m): プロセス Slab Class: 1 Slab Class: 2 が使用するメモリサイズの上限 Chunk Size: 96 byte Chunk Size: 120 byte 目安 (デフォルト: 64 MB) Chunks/page: 10922 Chunks/page: 8738 Record Data Size: 48 byte Record Data Size: 72 byte • 最小データサイズ(-n): 最小chunk x 1.25 に格納できるキーと値とフラグ 情報を合算したサイズ (これに付加情報とおもわれるも Slab Class: 3 Slab Class: 4 ののサイズが加算されたものが Chunk Size: 152 byte Chunk Size: 192 byte 実最小chunkサイズとなる) Chunks/page: 6898 Chunks/page: 5461 (デフォルト: 48 byte) Record Data Size: 104 byte Record Data Size: 144 byte • Grouwth Factor(-f): chunkサイズの 乗算値設定 (デフォルト1.25) Slab Class: 5 Slab Class: 6 Chunk Size: 240 byte Chunk Size: 304 byte Chunks/page: 4369 Chunks/page: 3449 Record Data Size: 192 byte Record Data Size: 256 byte
  • 17. 注意: 一度作成した Page は破棄されない • memcached は一度作成した Page は破棄せずにメモリ上に保持し続けるため、 注意が必要となる • 時間経過によってデータサイズが変動するデータを memcached で取り扱う 場合は注意 例 • 上限設定: 8MB Slab Class 1 Slab Class 11 Slab Class 2 Slab Class 1 Slab Class 1 • 最初は小さいデータが大量 Slab Class 1 Slab Class 1 Slab Class 1 Slab Class に作られるが、徐々にそれ Slab Class 1はスッカスカ らが大きくなる特性を持つ Slab Class 2 は大量の追い出し • 最終的には Slab Class 1,2 にそ 効率悪し れぞれ同じくらいの比率で データが格納される想定 小さいデータが大 (上限を超えるが・・・) 小さいデータが徐々 量にセットされ、8 やや大きいデータが 1ページ目は作られる に減っていき、空き ページ作られた 徐々に増えるが新た Chunk が出てくる に Page を作れない!
  • 18. case 1: 固定長データの場合 • セットされるデータサイズが固定長の場合、データサイズに応じて最小データサ イズを調整すると良い • 例) キーと値を足してちょうど 100 byte の値のみが最大10000個セットされる場合 • → memcached –n 118 –M 2 とすると丁度良い • キー+値=100 byte の場合、-n 113 で起動したところ、Slab Class 1 の Page に値が入っ た。その際、 Chunk サイズは 168 byte で、 Chunk 数は 1 Pageあたり6241個となった。 2 Page あれば事足りるのでメモリサイズは 2 MB に設定する。 • 特定サイズのデータがどの Chunk サイズに格納されるかはやってみないとわから ないところがあるので、実際に格納してみてどのサイズだとピッタリあうか試し てみる必要がある • 必要に応じて本番環境で一度 verbose モードで起動し、Chunk Size を確認してみる のもよし • ※同じ設定でも環境によって Chunk サイズが変動することがある
  • 19. case2: 決められた種類の複数データを格納する場合 • サイズの違う複数種類のデータを格納する場合はそれぞれに合わせて Chunk Size を調整すると good • 例) 以下の3種類のデータを格納する場合 (Expire 4h 、個数は今後増える想定) a. 87~101 byte のデータが 85 万個 b. 130~263 byte のデータが 374 万個 c. 83~217 byte のデータが 15 万個 • → memcached –n 64 –f 2.5 –M 1500 にすると以下のようになる slab class 1: chunk size 112 perslab 9362 slab class 2: chunk size 280 perslab 3744 • slab 1 の chunk が 925,000 個、 99 Page slab 2 の chunk が 3,815,000 個、 1,019 Page という想定 • 1,118 Page 、今後増えることを鑑みると余裕を見て 1.5 GB にしたほうがよい だろう
  • 20. case3: データサイズが完全に不定の場合 • メモリサイズ以外を標準設定で memcached を起動すれば良い • デフォルト設定の factor: 1.25 はバランスが良い設定で、最も効率よくメモ リを利用できるとされている • ただし、メモリサイズ上限はかなり余裕を持った方がいい。大体実際に格 納されると想定されるデータサイズ合計の2倍以上目安(追い出しを許容す るなら小さくてもいい) • factor を小さくすると Slab Class が多くなり、 Chunk の隙間の無駄が小さく なるが Page 上で使われない無駄な Chunk が多くなる • factor を大きくすると Slab Class が少なくなり、 Chunk の隙間の無駄が大き くなるが Page 上で使われない無駄な Chunk が少なくなる • メモリサイズが大きいほど factor が小さいことによる無駄が少なくなる
  • 21. 終わりに KVS のデータストレージとして最近は Redis を使うことが多くなってきたが、 要件によっては memcached を使うこともまだまだある。 その時はデータ構造を頭に入れた上で見積もりをしてみてほしい。