0

単純な NGnix + Gunicorn + Django + MySQL (RDS on AWS) スタックを実行しようとしていますが、明らかに、MySQL クエリで何かが発生すると、速度が低下し、サービスがロックダウンされます。

それを防ぐために、私は eventlet を使い始めました (Celery との相性も良い) が、MySQLdb にパッチを当てると、パフォーマンスが低下し (応答時間が 2 ~ 3 倍)、不安定になる (再起動時にすべてのデータベース接続が数秒間ロックされる可能性がある) ようです。

セロリと同じロジックのイベントレットは問題なく動作するようですが、何が足りないのでしょうか?

try:
    import eventlet

    worker_class = 'egg:gunicorn#eventlet'
    worker_connections = 1000
    def do_post_fork(server, worker):
        eventlet.monkey_patch()
        eventlet.monkey_patch(MySQLdb=True)

    post_fork = do_post_fork
except ImportError as e:
    import logging
    logging.exception(e)
    pass

ありがとう!

4

1 に答える 1

0

遅いクエリによってサービス全体が遅くなることはありません。特定のリクエストは 1 つだけにする必要があります。他のワーカーは他のリクエストに対応できます。

たくさんのシングル スレッド ガンコーン ワーカーを使用してみてください。多くのメモリを消費しますが、これが最も堅牢なソリューションです。

私は AWS の専門家ではないので、以下は勝手な推測です。

残念ながら、mysqldb は C 拡張であるため、「適切に」パッチを適用する方法はありません。代わりに、eventlet はスレッド プールを使用して、mysqldb を greenthread に適したものにします。

Python3.3 より前のスレッドは、正当な理由もなく大量の CPU リソースを浪費します。したがって、パフォーマンスの問題は、greenlet、Python スレッド、および AWS 仮想化の互換性が悪いことが原因である可能性があります。繰り返しますが、正確な理由はわかりません。推測です。

于 2013-09-13T14:15:17.983 に答える