Performant Async Python 3.6 Redis-Backed App
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
templates
.gitignore
Dockerfile
LICENSE
README.md
app.py
docker-compose.yml
gunicorn.sh
requirements.in
requirements.txt
server.py
setup.cfg

README.md

Pastey: A Performant Async Python 3.6 App using Subconscious

Quickstart

Install docker and then run:

$ docker-compose up --build

Visit this page in your browser: http://0.0.0.0:5000/

Slowstart

First, run a redis instance:

$  docker run -p 6379:6379 redis

(you can use -d to daemonize this process)

Create & activate virtualenv (you may need to run pip3 install virtualenv if you haven't), install dependencies:

$ python3 -m virtualenv .venv && source .venv/bin/activate
$ pip3 install -r requirements.txt

Set environmental variables (these are already set to the right defaults in docker):

$ EXPORT REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_DB=1 PASTEY_HOST=0.0.0.0 PASTEY_PORT=5000

Run the server the old-fashioned way:

$  python3.6 server.py

Or, for better performance run the server with gunicorn/uvloop:

$ ./gunicorn.sh

Load Test

  1. Seed the database with a bunch of Pasteys via curl call:
$ for i in {1..5}; do curl -F title="Title #$i" -F body="$(openssl rand -base64 1000)" 0.0.0.0:5000/pastes -L -s -o /dev/null -w '%{url_effective}\n'; done
http://0.0.0.0:5000/pastes/80f58d80-a6a3-4bf3-86d4-7ded65e41448
...

(you can do this via web interface if you prefer)

  1. Make a bunch of requests to a valid Pastey URL (generated in the previous step):
$ ab -n 10000 -c 5 http://0.0.0.0:5000/pastes/80f58d80-a6a3-4bf3-86d4-7ded65e41448
...

Concurrency Level:      5
Time taken for tests:   40.628 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      24910000 bytes
HTML transferred:       23390000 bytes
Requests per second:    246.14 [#/sec] (mean)
Time per request:       20.314 [ms] (mean)
Time per request:       4.063 [ms] (mean, across all concurrent requests)
Transfer rate:          598.76 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   6.3      1     236
Processing:     5   18  27.7     16    1024
Waiting:        5   17  27.4     14    1019
Total:          6   19  28.4     17    1025

Percentage of the requests served within a certain time (ms)
  50%     17
  66%     18
  75%     19
  80%     19
  90%     22
  95%     26
  98%     33
  99%    116
 100%   1025 (longest request)

TODO: add test coverage