SlideShare a Scribd company logo
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

What's hot

シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
icchy
 
知っているようで知らないPAMのお話
知っているようで知らないPAMのお話知っているようで知らないPAMのお話
知っているようで知らないPAMのお話
Serverworks Co.,Ltd.
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
Yuki Morishita
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
 
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo!デベロッパーネットワーク
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
Yahoo!デベロッパーネットワーク
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
Takahiro YAMADA
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
yoku0825
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
Hibino Hisashi
 
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
Yuji Otani
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
佑哉 廣岡
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
Kentaro Yoshida
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
Masahiko Sawada
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた
Akihiro Kuwano
 
DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所
hdais
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
健人 井関
 

What's hot (20)

シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門シェル芸初心者によるシェル芸入門
シェル芸初心者によるシェル芸入門
 
知っているようで知らないPAMのお話
知っているようで知らないPAMのお話知っているようで知らないPAMのお話
知っているようで知らないPAMのお話
 
Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編Cassandraのしくみ データの読み書き編
Cassandraのしくみ データの読み書き編
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
 
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
Yahoo! JAPANのデータパイプラインで起きた障害とチューニング - Apache Kafka Meetup Japan #5 -
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
 
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
 
Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)Redis勉強会資料(2015/06 update)
Redis勉強会資料(2015/06 update)
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
MySQLと組み合わせて始める全文検索プロダクト"elasticsearch"
 
Vacuum徹底解説
Vacuum徹底解説Vacuum徹底解説
Vacuum徹底解説
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた
 
DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所DNSキャッシュサーバ チューニングの勘所
DNSキャッシュサーバ チューニングの勘所
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? - なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
なぜ初心者は webpackが解らないのか?- Why can’t you understand the webpack? -
 

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 を使うこともまだまだある。 その時はデータ構造を頭に入れた上で見積もりをしてみてほしい。