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-memcached
、pylibmc
という ライブラリ が 一般的に使われると記載がありました。
どっちを使うのかですが、幾つか記事を読んで、pylibmc
を使おうとしましたが失敗し、以下のようになりました。
- python-mecached を使うほうが簡単だが、パフォーマンスは pylibmc のほうが早い、
- セキュリティ的なリスクは、テキストプロトコルより、もバイナリープロトコルにしたほうが、低そう。
1.
、2.
よりpylibmc
を'binary': True
で使うのがよさそう。3.
でpylibmc
を試すが、どうにもうまくインストールできない。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
- debug
Cache 設定後のパフォーマンス
以下、Cache なし、DB Cache、 Memcached Cache の計測結果を記載します。
-
Cache なしの場合
1.7 秒 -
DB Cache の場合
0.5秒程度 -
Memcached Cache の場合
0.15秒程度
All In One 構成 で、VPS も安いプランですが、想像以上に早くて驚きました。
参考
以下、設定中に参考にした記事になります。
-
Django’s cache framework | Django documentation | Django
Django のドキュメント Cache の頁です。 -
Memcachedの通信プロトコルの違いによるパフォーマンスを比較してみた(Binary か Text(Ascii)か) - Iruca Log
Memcached のプロトコルでパフォーマンスが違う旨が記載されています。 -
Memcachedのプロトコル仕様とセキュリティ – Memcachedでもインジェクションが可能 | yohgaki’s blog
Memcachedのプロトコル仕様とセキュリティが記載されています。 -
Best Python memcache client: Python-memcached v/s Pylibmc | Simplify Complexities
Python-memcached と Pylibmc の比較したコメントが記載されています。
以上です。
コメント