はじめに
株式会社ライブドア 開発部 長野です。ライブドアに入社する以前は株式会社ミクシィにてmixiの運用に携わっておりました。また、
memcachedとは
memcachedは、
memcachedは元々、
memcachedの概要や基本的な利用方法については以前の連載
メジャーアップデートしたmemcached
前回の連載時、
バージョン | 年月 |
---|---|
1. | 2008年4月 |
1. | 2008年7月 |
1. | 2009年4月 |
1. | 2009年4月 |
1. | 2009年7月 |
1. | 2009年8月 |
1. | 2009年11月 |
1. | 2010年4月 |
1.
- バイナリプロトコルの導入
- マルチスレッドの標準化
- 統計の強化
などが上げられます。この1.
1.2系と1.4系の起動オプションの違い
まず、
$ memcached -h memcached 1.x.x -p <num> TCP port number to listen on (default: 11211) -U <num> UDP port number to listen on (default: 0, off) (以下省略)
ヘルプの1行目にバージョンが出力され、
memcached 1.2.5 -p <num> TCP port number to listen on (default: 11211) -U <num> UDP port number to listen on (default: 0, off) -s >file> unix socket path to listen on (disables network support) -a <mask> access mask for unix socket, in octal (default 0700) -l <ip_addr> interface to listen on, default is INDRR_ANY -d run as a daemon -r maximize core file limit -u <username> assume identity of <username> (only when run as root) -m <num> max memory to use for items in megabytes, default is 64 MB -M return error on memory exhausted (rather than removing items) -c <num> max simultaneous connections, default is 1024 -k lock down all paged memory. Note that there is a limit on how much memory you may lock. Trying to allocate more than that would fail, so be sure you set the limit correctly for the user you started the daemon with (not for -u <username> user; under sh this is done with 'ulimit -S -l NUM_KB'). -v verbose (print errors/warnings while in event loop) -vv very verbose (also print client commands/reponses) -h print this help and exit -i print memcached and libevent license -b run a managed instanced (mnemonic: buckets) -P <file> save PID in <file>, only used with -d option -f <factor> chunk size growth factor, default 1.25 -n <bytes> minimum space allocated for key+value+flags, default 48
memcached 1.4.5 -p <num> TCP port number to listen on (default: 11211) -U <num> UDP port number to listen on (default: 11211, 0 is off) -s <file> UNIX socket path to listen on (disables network support) (中略) -vvv extremely verbose (also print internal state transitions) -h print this help and exit -i print memcached and libevent license -P <file> save PID in <file>, only used with -d option -f <factor> chunk size growth factor (default: 1.25) -n <bytes> minimum space allocated for key+value+flags (default: 48) -L Try to use large memory pages (if available). Increasing the memory page size could reduce the number of TLB misses and improve the performance. In order to get large pages from the OS, memcached will allocate the total item-cache in one large chunk. -D <char> Use <char> as the delimiter between key prefixes and IDs. This is used for per-prefix stats reporting. The default is ":" (colon). If this option is specified, stats collection is turned on automatically; if not, then it may be turned on by sending the "stats detail on" command to the server. -t <num> number of threads to use (default: 4) -R Maximum number of requests per event, limits the number of requests process for a given connection to prevent starvation (default: 20) -C Disable use of CAS -b Set the backlog queue limit (default: 1024) -B Binding protocol - one of ascii, binary, or auto (default) -I Override the size of each slab page. Adjusts max item size (default: 1mb, min: 1k, max: 128m)
memcached 1.
オプション名 | 内容 |
---|---|
-vvv | 詳細ログモードが1段階追加 |
-L | メモリ確保にラージページを利用する |
-D | キャッシュのキーのうちネームスペースを分ける文字列。ネームスペースごとに詳細な統計が取得できる |
-t | スレッド数 |
-R | 1度に行うリクエストの処理の上限値 |
-C | CASを無効にする |
-b | 接続のキュー数 |
-B | テキスト・ |
-I | 最大キャッシュオブジェクトサイズ |
実際の運用で利用する主な起動オプションの解説
-p TCPポート
memcachedがListenするTCPのポートを指定します。最も基本的な起動オプションの1つです。指定しない場合デフォルトの11211が利用されます。11211以外を利用する場合、
$ memcached -p 12345
もしTCPを利用しない場合、
$ memcached -p 0
-U UDPポート
memcachedはTCPだけではなく、
$ memcached -p 12345
上記のように -U を指定しない場合、
$ memcached -p 11211 -U 12345
とします。UDPを使わない場合、
$ memcached -p 11211 -U 0
多くの場合、
-m メモリサイズ
キャッシュの最大サイズです。OSが32bitの場合には上限は2GBまでとなりますが、
16GBのキャッシュ領域を確保するには
$ memcached -m 16000
とします。もし32bitのOSでメモリを2GB以上使いたい場合は、
-c 接続数
memcachedに対する最大の接続数を指定します。デフォルトは1024で、
$ memcached -c 32768
最大の接続数を超えた場合、
設定した接続数はOSリソースの制限を行うrlimitの値としてのみ使われるので、
-u 実行ユーザ
memcachedの実行ユーザを切り替えます。memcachedの実行に時にroot権限が必要となります。memcachedはroot権限では動作しないように設計されていますので、
$ memcached -c 32768 -u nobody
-f スラブサイズの決定係数
memcachedにキャッシュしたデータは、
デフォルトの値は1.
$ memcached slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 120 perslab 8738 slab class 3: chunk size 152 perslab 6898 slab class 4: chunk size 192 perslab 5461 slab class 5: chunk size 240 perslab 4369 slab class 6: chunk size 304 perslab 3449 slab class 7: chunk size 384 perslab 2730 (省略)
という出力が得られます。最小のスラブが96Byteから始まって、
もし、
$ memcached -f 1.1 slab class 1: chunk size 96 perslab 10922 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 128 perslab 8192 slab class 4: chunk size 144 perslab 7281 slab class 5: chunk size 160 perslab 6553 slab class 6: chunk size 176 perslab 5957 slab class 7: chunk size 200 perslab 5242
スラブサイズの上昇が緩やかになっているため、
memcachedのメモリストレージについては、
ただし、
-t スレッド数
1.
$ memcached -t 1
スレッド数のデフォルトは4です。マルチスレッドによって一度のコマンドで複数のキャッシュオブジェクトを取得する際に若干の高速化が期待できるようです。
-C CASの無効化
memcachedはトランザクションのサポートをしていませんが、
このようにCASを使うことで簡単に一貫性を保つことができますが、 CASを実現するためにmemcachedは64bitのIDを1つ1つのキャッシュオブジェクトにつける必要があり、
$ memcached -C
-b 接続のバックログ
OSレベルでのTCP接続の確立はしたが、
Linuxでのsomaxconnのデフォルトは128なので、
$ echo 1024 > /proc/sys/net/core/somaxconn
somaxconnの変更後memcachedの再起動が必要です
-I 最大キャッシュオブジェクトサイズ
長らくmemcachedに格納できるキャッシュのオブジェクトサイズの最大は1MBに固定されていましたが、
以下は512KBに制限をする例と、
$ memcached -I 512k # 512KB $ memcached -I 2m
設定の確認
memcachedの1.
$ telnet localhost 11211 stats settings STAT maxbytes 1073741824 STAT maxconns 1024 STAT tcpport 11211 STAT udpport 0 STAT inter NULL STAT verbosity 0 STAT oldest 0 STAT evictions on STAT domain_socket NULL STAT umask 700 STAT growth_factor 1.10 STAT chunk_size 48 STAT num_threads 4 STAT stat_key_prefix : STAT detail_enabled no STAT reqs_per_event 20 STAT cas_enabled no STAT tcp_backlog 1024 STAT binding_protocol auto-negotiate STAT auth_enabled_sasl no STAT item_size_max 1048576 END
バージョン 1.
まとめ
今回は、