TornadoのGET/POSTをベンチマーク

ちょっとした理由から ノン・ブロッキングウェブサーバー Tornado 2.4 の GET/POST の処理能力を計測。

送信データ

GET は以下の3種類

  1. UNIX タイムを返す
  2. データベースでSELECTを実行
  3. (tornado.gen version)データベースでSELECTを実行

データベースは PostgreSQL 8.4。SQL は 100万件のレコードが入ったテーブルを COUNT。
DB 接続は psycopg momoko(tornado.gen) を利用。

POST は以下の2種類

  1. RSSファイルをPOSTし、ローカルファイルシステムに保存
  2. GZIP圧縮したRSSファイルをPOSTし、ローカルファイルシステムに保存

RSS ファイルは 165 KB、圧縮したものは 35KB。
フィードは TechCrunch を利用。(http://feeds.feedburner.com/TechCrunch/)

送信回数
10, 100, 1000 の3回を実行
並列数は 4

測定ツール

ab(Apache HTTP server benchmarking tool) を利用。
http://httpd.apache.org/docs/2.2/programs/ab.html

計測マシン
OS : Ubuntu 12.04 64 bit
CPU : Intel(R) Pentium(R) CPU G6950 @ 2.80GHz
MEMORY : 16GB

#クライアント・サーバーともに同じマシン

========================

測定結果

GET(request unix time)

$ ab -n 1000 -c 4 http://localhost:8000/

GET(synchronous/asynchronous database query)

$ ab -n 1000 -c 4 http://localhost:8000/async-db

総処理時間は async:sync=1:2。一方、1リクエストあたりの処理時間は async:sync=2:1 と真逆。

POST(upload plain/gzipped RSS file)

$ ab -n 1000 -c 4 -p TechCrunch.rss.gz http://localhost:8000/

ファイルサイズは圧縮:非圧縮 = 1:5。処理速度は圧縮:非圧縮 = 1:2

サーバーのコード

import tornado.options
import tornado.httpserver
import tornado.ioloop
import tornado.web
from tornado import gen

import tempfile
import time

import momoko
import psycopg2

import settings

def save(body):
    fd, path = tempfile.mkstemp(dir='/tmp/test', prefix='tornado_')
    os.write(fd, body)
    os.close(fd)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        self.write(str(time.time()))

    def post(self):
        save(self.request.body)
        self.write('ok')
class DBHandler(tornado.web.RequestHandler):
    @property
    def db(self):
        conn = self.application.db
        return conn

    def get(self):
        self.db.execute('SELECT count(*) from person;')
        self.write('Query results: %s' % self.db.fetchall())
        self.finish()

class AsyncDBHandler(tornado.web.RequestHandler):
    @property
    def async_db(self):
        return self.application.async_db

    @tornado.web.asynchronous
    @gen.engine
    def get(self):
        cursor = yield gen.Task(self.async_db.execute,
                                'SELECT count(*) from person;', ())
        self.write('Query results: %s' % cursor.fetchall())
        self.finish()

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[
      (r"/",         IndexHandler),
      (r"/db",       DBHandler),
      (r"/async-db", AsyncDBHandler),
    ])
    conn_string = "host='%s' dbname='%s' user='%s' password='%s'" \
      %(settings.host, settings.database, settings.user, settings.password)
    app.db = psycopg2.connect(conn_string).cursor()

    app.async_db = momoko.AsyncClient({
        'host': settings.host,
        'port': settings.port,
        'database': settings.database,
        'user': settings.user,
        'password': settings.password,
        'min_conn': settings.min_conn,
        'max_conn': settings.max_conn,
        'cleanup_timeout': settings.cleanup_timeout
    })

    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8000)
    tornado.ioloop.IOLoop.instance().start()

MEMO

Tornado だけでなく EventMachine Gevent Eventlet も時間があれば計測しておきたい。

Advertisements
Tagged with:
Posted in middleware, python

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 5 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 5 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: