はじめに
株式会社ライブドア 開発部 長野です。ライブドアに入社する以前は株式会社ミクシィにてmixiの運用に携わっておりました。また、2年前の2008年には、このgihyo.jp上において、memcachedの基本的な使い方やミクシィでの活用方法について連載させて頂いていました。今回の連載では前回から2年間の間にあったmemcachedのアップデートに関することや、大規模なWebサイトでのmemcachedの運用、実践的な活用方法について解説していきます。
memcachedとは
memcachedは、高性能な分散メモリキャッシュサーバです。データベースへの問い合わせ結果を一時的にmemcachedへキャッシュすることで、データベースへのアクセス回数を減らし、動的なWebアプリケーションの高速化やスケーラビリティの向上を実現できます。memcachedを利用しているWebサイト・サービスとしてはlivedoorやmixi、はてな、Facebook、Twitterなどが挙げられ、また最近盛り上がりを見せるソーシャルアプリケーションでも、サービスの性能を向上させる重要な役割を果たしています。
memcachedは元々、LiveJournalを運営していたDanga Interactive社においてBrad Fitzpatrick氏が中心となって開発されたオープンソースソフトウェアですが、現在ではさまざまな企業からエンジニアが参加するコミュニティで開発が続けられています。
memcachedの概要や基本的な利用方法については以前の連載「memcachedを知り尽くす」をご覧ください。
メジャーアップデートしたmemcached
前回の連載時、2008年7月のmemcachedの最新バージョンは1.2.5でしたが、2010年8月現在のmemcahedの最新バージョンは1.4.5となり、1.2系から1.4系へのメジャーアップデートが行われています。
表 主なmemcachedのバージョンとリリース時期
バージョン | 年月 |
1.2.5 | 2008年4月 |
1.2.6 | 2008年7月 |
1.3.2(開発バージョン) | 2009年4月 |
1.2.8(1.2系最終アップデート) | 2009年4月 |
1.4.0 | 2009年7月 |
1.4.1 | 2009年8月 |
1.4.4 | 2009年11月 |
1.4.5 | 2010年4月 |
1.4系で新しく追加された主な機能しては
- バイナリプロトコルの導入
- マルチスレッドの標準化
- 統計の強化
などが上げられます。この1.4系の機能の詳細については前坂徹氏の連載「memcached 1.4の到来」が参考となります。ここではバージョン1.2.5と最新の1.4.5の起動オプションを比較しながら、新しく追加された機能や実際の運用で用いられる起動オプションについて説明します。
1.2系と1.4系の起動オプションの違い
まず、memcachedの起動オプションの一覧(ヘルプ)を確認しましょう。memcachedのヘルプを出力するには、「-h」オプションを使います。
ヘルプの1行目にバージョンが出力され、2行目以降がオプションとその説明です。では1.2.5と1.4.5のヘルプを表示して比較します。
memcached 1.2.5がオプションが20個あるのに対して、1.4.5では28個と1.5倍近くに増えています。追加されたオプションは1.4系でサポートされたマルチスレッドや性能に関する設定や、統計、バイナリプトココルに関するものが多くを占めています。
表 追加されたオプション
オプション名 | 内容 |
-vvv | 詳細ログモードが1段階追加 |
-L | メモリ確保にラージページを利用する |
-D | キャッシュのキーのうちネームスペースを分ける文字列。ネームスペースごとに詳細な統計が取得できる |
-t | スレッド数 |
-R | 1度に行うリクエストの処理の上限値 |
-C | CASを無効にする |
-b | 接続のキュー数 |
-B | テキスト・バイナリプロトコルの判定 |
-I | 最大キャッシュオブジェクトサイズ |
実際の運用で利用する主な起動オプションの解説
-p TCPポート
memcachedがListenするTCPのポートを指定します。最も基本的な起動オプションの1つです。指定しない場合デフォルトの11211が利用されます。11211以外を利用する場合、-pに続けてポート番号を入力します。
もしTCPを利用しない場合、ポート番号に0を指定します
-U UDPポート
memcachedはTCPだけではなく、UDPでも利用することができます。デフォルトではTCPと同じポートでUDPもListenします。TCPのポートが指定されていない場合、デフォルトの11211となり、別のポートが指定されていれば、そのポート番号が使われます。
上記のように -U を指定しない場合、TCPのポートで指定した12345が利用されます。TCPが11211でUDPが12345をListenする場合、
とします。UDPを使わない場合、-U に0を指定するのですが、その際には必ずTCPの -p オプションも指定する必要があります。
多くの場合、UDPは利用されていないと思いますので、-U に0を指定しUDPを停止することも考えても良いかもしれません。
-m メモリサイズ
キャッシュの最大サイズです。OSが32bitの場合には上限は2GBまでとなりますが、64bit OSの場合では制限はありません。ただし、性能に影響するのでswapしないようにしましょう。
16GBのキャッシュ領域を確保するには
とします。もし32bitのOSでメモリを2GB以上使いたい場合は、複数のmemcachedをportを変更して起動するなどの対応が必要となります。
-c 接続数
memcachedに対する最大の接続数を指定します。デフォルトは1024で、1024未満を指定しても1024となります。また、1024よりも大きな値にする場合はroot権限が必要となります。
最大の接続数を超えた場合、memcached側に「Too many open connections」などのエラーが出力されます。memcachedに対する接続数は、statsコマンドでも確認ができるので、監視システム等でモニタリングを行うことをお勧めします。
設定した接続数はOSリソースの制限を行うrlimitの値としてのみ使われるので、大きめの値を宣言しても、すぐに多くのリソースを占有することはありません。
-u 実行ユーザ
memcachedの実行ユーザを切り替えます。memcachedの実行に時にroot権限が必要となります。memcachedはroot権限では動作しないように設計されていますので、-c オプションで同時接続数を増やしたときなどはこのオプションで実行ユーザを切り替える必要があります。
-f スラブサイズの決定係数
memcachedにキャッシュしたデータは、スラブと呼ばれるデータ格納領域に保存されます。スラブは保存するキャッシュオブジェクトのサイズごとにいくつか作られ、同じサイズのキャッシュデータを同じスラブに保存するように設計されています。このスラブサイズを決定に大きく影響するのが -f オプションです。
デフォルトの値は1.25です。スラブの一覧とそのサイズはmemcachedを -vv オプション付きで起動した際や、統計出力を行うstatsコマンドなので参照することができます。デフォルトの係数のまま -vv オプション付きで起動すると
という出力が得られます。最小のスラブが96Byteから始まって、1.25倍の120Byte、さらに1.25倍の152Byteとサイズが大きくなって行くのがわかります。1.25倍より少しサイズが異なるのは、スラブのサイズを8Byteの倍数にあわせているためです。
もし、memcachedに数百Byte程度の小さいキャッシュオブジェクトを中心に入れるのであれば、1.25をもっと小さくすると効率が良くなるかもしれません。次は -f を 1.1で起動した際のスラブサイズです。
スラブサイズの上昇が緩やかになっているため、よりキャッシュオブジェクトのサイズと近いサイズのスラブを選択することができるようになります。結果としてスラブを有効活用できるようになります。
memcachedのメモリストレージについては、「memcachedを知り尽くす」の連載の第二回「memcachedのメモリストレージを理解する」に詳しく説明があるので参考にしてください。
ただし、どのようなサイズのキャッシュオブジェクトが増加して行くのかは予想しにくく、よほどの場合でない限り、-f は指定することはないと考えています。
-t スレッド数
1.4系から追加されたオプションです。1.4.0からマルチスレッドでの動作が前提となっています。そのスレッド数をここで指定します。以下のように -t に 1を指定することでシングルスレッドでの動作も可能です。
スレッド数のデフォルトは4です。マルチスレッドによって一度のコマンドで複数のキャッシュオブジェクトを取得する際に若干の高速化が期待できるようです。
-C CASの無効化
memcachedはトランザクションのサポートをしていませんが、CASを使うことでキャッシュの更新に一貫性を保つことができます。CASを利用するクライアントは、キャッシュオブジェクトを取得する際に、getsコマンドを使い、ID(CAS値)を取得します。データを更新する際にはクライアントはそのCAS値も送信します。memcached側ではCAS値が変わっていなければデータを保存する処理を行います。
このようにCASを使うことで簡単に一貫性を保つことができますが、 CASを実現するためにmemcachedは64bitのIDを1つ1つのキャッシュオブジェクトにつける必要があり、そのために1つのキャッシュにつき8Byteのデータ領域が確保されます。-C オプションを指定することでCAS機能を無効にし、8ByteのCAS領域もキャッシュのために利用できるようになります。
-b 接続のバックログ
OSレベルでのTCP接続の確立はしたが、アプリケーションレベルのmemcachedで処理待ちとなっている接続キューの最大数です。負荷が大きいmemcachedサーバの場合には変更が必要となるかもしれません。デフォルトは1024です。ただし、Linuxでは「/proc/sys/net/core/somaxconn」で定義される値以上に設定することはできません。
Linuxでのsomaxconnのデフォルトは128なので、接続キュー数を増やすには、まずsomaxconnのチューニングが必要となります
somaxconnの変更後memcachedの再起動が必要です
-I 最大キャッシュオブジェクトサイズ
長らくmemcachedに格納できるキャッシュのオブジェクトサイズの最大は1MBに固定されていましたが、バージョン1.4.2から変更ができるにようになっています。変更できるサイズの幅は 1024Byteから128MBです
以下は512KBに制限をする例と、2MBに拡張する例です。
設定の確認
memcachedの1.4系からは、起動後に外部からmemcachedがどのようなオプションで起動されているか、「stats settings」コマンドを発行することで確認することができます。
バージョン 1.4.5では stats settingsの表示のうち、maxbytesの値が正しくないバグがあるようです。statsコマンドのlimit_maxbytesで正しい値が参照できます。
まとめ
今回は、memcached のバージョン 1.2.5から1.4.5へアップデートで追加されたオプションの紹介、さらにWebアプリケーションの運用でよく利用されるmemcachedのオプションの説明をしました。次回はmemcachedを運用する上で気になる脆弱性やその対策について書く予定です。