Почему использование Gunicorn с GEvent может увеличить время запроса к Redis / Database? - PullRequest
0 голосов
/ 29 мая 2019

При фактической производственной нагрузке (веб-приложение) с сервером Redis (v4.x) при использовании gunicorn с worker_class gevent время запроса увеличивается на 3. Доступ к базе данных также ухудшился (но не так сильно, только на 50%),Я пытаюсь понять, почему это произошло.Есть идеи?Приложение очень ограничено вводом-выводом, с большим количеством запросов к базе данных и повторным доступом для каждого запроса, что должно быть идеальным сценарием для gevent.

Переход от SYNC к GEVENT (~ 11:00)

Query time increase after moving from SYNC to GEVENT

Повлияет ли обезьяна, исправляющая паттерн на сокет, как-то снизит производительность?Я попытался отрегулировать worker_connections безуспешно, даже крайне низкий уровень, равный всего лишь двум (снова почти синхронизированный), дал мне такие же плохие результаты.Я что-то упустил из-за того, как gevent работает псевдо-поток?

Отказ от ответственности: я использую NewRelic для мониторинга производительности и redis-py / django / mysql.Я попробовал некоторые настройки, такие как использование BlockingConnectionPool для Redis, но моя производительность доступа к базе данных также снизилась, поэтому Redis - не единственная проблема.Рабочий размер 5 (ЦП * 2 + 1).У меня также были тонны GreenletExit / ConnectionError [redis] в случайное время, которое было минимизировано путем перемещения worker_connections с 2k (по умолчанию) на 10.

1 Ответ

0 голосов
/ 29 мая 2019

Пример подключения к Redis после монкипатчинга.

_rconn = None
def redisconn():
    global _rconn
    if _rconn is None:
        try:
            _rconn = redis.StrictRedis(host=redisconfig['host'], port=redisconfig['port'], db=redisconfig['db'])
        except:
            traceback.print_exc()
            _rconn = None
    return _rconn

class RedisCache(object):
    def __init__(self):
        #in case of a lost connection lets sit and wait till it's online
        global _rconn
        if not _rconn:
            while not _rconn:
                try:
                    redisconn()
                except:
                    print('Attempting Connection To Redis...')
                    gsleep(1)
        self.r = _rconn
        self.rpool = self.r.connection_pool

    def get(self, key):
        return self.r.get(key)

    def set(self, key, meta, expire=86400, nx=True):
        return self.r.set(key, json.loads(meta), ex=expire, nx=nx)

    def connections(self):
        return self.rpool._created_connections

    def inuse(self):
        return self.rpool._in_use_connections
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...