- 更新
2015-03-14
- 作者
@voluntas
- バージョン
0.0.3
- URL
- depth
3
PyPy の本番での使用を目的とする人向けの資料
Python の高速な実装である PyPy を使用し Django を使ったウェブアプリの高速を行う。
この資料では PyPy への移行と検証を行うための知識をまとめておく。
性能に関してはこれを見てみるとよい、一通りの項目において CPython よりも早い。
PyPy の Django に関してはこちら。
最近 2015-02 のベンチだと、 10 倍程度早い。
引用:
$ go version
go version go1.4.1 linux/amd64
$ time go build scomb.go
CPU: 0.14s Real: 0.17s RAM: 30428KB
$ time ./scomb
CPU: 11.45s Real: 11.54s RAM: 251628KB
$ python --version
Python 3.4.2
$ time python scomb.py
CPU: 121.33s Real: 122.06s RAM: 641844KB
$ pypy --version
Python 2.7.8 (c6ad44ecf5d8, Nov 18 2014, 18:04:31) [PyPy 2.4.0 with GCC 4.9.2]
$ time pypy scomb.py
CPU: 14.72s Real: 14.97s RAM: 522080KB
実際に検証を行う場合の構成であって、オススメの構成とかでは無い
- Ubuntu 14.04 64 bit
- AWS EC2 c4 系を想定
- limits.conf とかその辺
- nofile を増やす
- sysctl.conf
- somaxconn を増やす
- Nginx 1.7.10
- nginx news
- mainline を使用する
- uWSGI master
- PyPy 2.5
- PyPy - Welcome to PyPy
- Ubuntu 14.04 用のバイナリファイルがあるのでそれを使う、独自ビルドは行わない
- 一度性能検証した後に独自でビルドと比較するのはあり
- Django 1.7.6
- PyMySQL 0.6.6 or master
- MySQL 5.6
- AWS RDS を想定
- Redis
- Redis
- ElastiCache Redis を想定
- redis-py
- Locust
PyPy は C 拡張だと逆に遅くなる事があるので、Pure Python ライブラリを使用する
PyMySQL を使う
@methane が取ったベンチマークが参考になる
PyPy 2.5 (PyMySQL) と CPython (mysqlclient) ではほとんど差がなさそうなので、気にしなくて良いと思う。
PyPy 標準の json ライブラリを使う
簡単なベンチマークを取った。PyPy 内蔵 json が圧倒的に早い。
CPython
JSON Benchmark
2.7.9 (default, Dec 11 2014, 02:36:08)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)]
-----------------------------
ENCODING
simplejson: 0.281742s
cjson: 0.483193s
ujson: 0.21507s
jsonlib: 0.409993s
json: 0.732388s
yajl: 0.395648s
DECODING
simplejson: 0.540883s
cjson: 0.356611s
ujson: 0.215889s
jsonlib: 0.258306s
json: 0.35897s
yajl: 0.394774s
PyPy
JSON Benchmark
2.7.8 (10f1b29a2bd21f837090286174a9ca030b8680b2, Feb 05 2015, 07:09:36)
[PyPy 2.5.0 with GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)]
-----------------------------
ENCODING
json: 0.176226s
simplejson: 1.230522s
DECODING
json: 0.342462s
simplejson: 2.074411s
PyPy が提供している PyPy 用の NumPy を使う。
未確定
parser に hiredis (C 拡張) を使わないようにするのがいいのかどうか。
- バージョン
2.1 (master)
uWSGI の設定ファイル。Nginx との通信は Unix Domain Socket を使う。
後でサンプルっぽいのを作る
[uwsgi]
processes = 1
enable-threads = False
single-interpreter = True
projectname =
projectdomain =
base =
uid =
gid =
chmod-socket = 666
chown-socket =
chdir = %(base)
module = wsgi:application
master = True
pidfile =
vacuum = True
env =
socket = /tmp/uwsgi.sock
logto =
pypy-home =
pypy-wsgi-file =
stats = /tmp/uwsgi_stats.socket
- バージョン
1.6.x
後で
後で