Django/Mezzanine Database Cache の設定をしてみる Database Cache 設定を行いました。

その後、Memcached のほうが早いのではないかと思い始めましたので、Memcached の Cache 設定を実施してみました。
実施した内容を記載します。


前提

以下の環境で実行しています。 HTTP サーバ、RDB、Memcached は全て同一サーバ上で動作しています。

  • OS
    CentOS release 6.9 (Final)

  • Python Version
    Python 2.7.8

  • Memcached Memcached 1.4.4 1

  • Package (必要そうなものだけ抜粋)
    Django (1.10.6) 2

1. 長いのでこれとは別にインストール記事を作成しました。インストールしてない人はそちらも確認ください
Cent OS 6.9 に Memcached をインストール、ログの設定まで実施する | Monotalk

2. Mezzanine も インストールされていますが、関係ないので除外


Memcached python-memcached、pylibmc のどちらを使うか

Djagno の document を見る限り、python-memcachedpylibmcいう ライブラリ が 一般的に使われると記載がありました。
どっちを使うのかですが、幾つか記事を読んで、pylibmc使おうとしましたが失敗し、以下のようになりました。

  1. python-mecached を使うほうが簡単だが、パフォーマンスは pylibmc のほうが早い、
  2. セキュリティ的なリスクは、テキストプロトコルより、もバイナリープロトコルにしたほうが、低そう。
  3. 1.2. より pylibmc 'binary': True使うのがよさそう。
  4. 3. pylibmc試すが、どうにもうまくインストールできない。
  5. python-memcachedインストールし使う。

Memcached の python-memcached をインストール、設定する

以下、Memcached の インストールから、 settings.py への設定の手順を記載します。

インストール

pip install python-memcached

settings.py に cache 設定を追加

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 60 * 60 * 24,
        'OPTIONS': {
            'debug': 0,
            'pickleProtocol': 0,
            #'pickler': pickle.Pickler,
            #'unpickler': pickle.Unpickler,
            #'compressor': zlib.compress,
            #'decompressor': zlib.decompress,
            'pload': None,
            'pid': None,
            'server_max_key_length': 250,
            'server_max_value_length': 1024 * 1024,
            'dead_retry': 30,
            'socket_timeout': 3,
            'cache_cas': False,
            'flush_on_reconnect': 0,
            'check_keys': True
        }
    }
}

  • OPTIONS 設定の説明
    正直、何が起こるのかよくわからないプロパティが多く、基本的にデフォルト値を設定しています。
    OPTIONS 以外の設定については、Django/Mezzanine Database Cache の設定をしてみる | Monotalk説明を参照ください。
    LOCATION 設定以外は、Memcached でも設定できるかと思います。

    • debug
      サーバに接続できない場合にエラーメッセージを表示するか
      デフォルト 0 で、1以上の数値を設定するとメッセージ出力
    • pickleProtocol
      (c)Pickle の使用する番号 デフォルト 0
    • pickler
      カスタム Pickler を指定する。デフォルト pickle.Pickler
    • unpickler
      カスタム Unpickler を指定する。デフォルト pickle.Unpickler
    • compressor
      カスタム compressor を指定する。デフォルト zlib.compress
    • decompressor
      カスタム decompressor を指定する。デフォルト zlib.decompressor
    • pload
      カスタム persistent_load 関数を指定する。cPickel は subclass 化が許可されないので、この指定で代用する。デフォルト None
    • pid
      カスタム persistent_id 関数。cPickel は subclass 化が許可されないので、この指定で代用する。デフォルト None
    • server_max_key_length
      キー値の最大長を指定、デフォルト 250 バイト
    • server_max_value_length
      Value 値の最大長を指定、デフォルト 1024 * 1024 で 1 MB
    • dead_retry
      ブラックリストに載ったサーバに、再試行を試みるまでの時間 デフォルト 30秒
    • socket_timeout
      ソケットタイムアウト デフォルト 3秒
    • cache_cas
      cas 操作はキャッシュするかどうか デフォルト False
    • flush_on_reconnect
      再接続時に、データを書き出すかどうか? デフォルトは 0 オフ
    • check_keys
      キーをチェックするかどうか、デフォルト True

Cache 設定後のパフォーマンス

以下、Cache なし、DB Cache、 Memcached Cache の計測結果を記載します。

  • Cache なしの場合
    1.7 秒

  • DB Cache の場合
    0.5秒程度

  • Memcached Cache の場合
    0.15秒程度

All In One 構成 で、VPS も安いプランですが、想像以上に早くて驚きました。


参考

以下、設定中に参考にした記事になります。

以上です。

コメント