Flask Socketio Eventlet Redis RQ ЦП привязан - PullRequest
0 голосов
/ 12 октября 2018

Недавно мы добавили Flask-RQ2 (RQ + Redis) в приложение Flask-SocketIO .Мы используем Eventlet для управления сокетом io.Предполагается, что веб-сокеты передадут интенсивную работу бэкэнду.

Однако при добавлении кода RQ наш процесс начал регулярно привязывать свое ядро ​​и полностью снижать производительность.Перезагрузка сохраняет приложение ненадолго, но только на короткое время.

Моя гипотеза заключается в том, что eventlet не удается выполнить monkeypatching redis.connection.socket, как это намеревается, поэтому он остается блокирующим импл и вызываетЗагрузка.Однако мы используем eventlet, как указано здесь - import eventlet и eventlet.monkeypatch() - вторая строка нашего основного модуля.Мы запускаем приложение с помощью socketio.run(APP, debug=APP.config['DEBUG'], host=APP.config['HOST'], port=APP.config['PORT'])

При запуске strace, чтобы попытаться выяснить, что делает процесс, пока он размечен, я вижу такие вещи, как: wait4(11, 0x7ffe0b2689fc, WNOHANG, NULL) = 0.Кроме того (и, возможно, не имеет значения), я видел два fd, помеченные [eventpoll] в выводе lsof, когда процессор работает, в то время как счастливый процесс показывает только один.

Утечки файлового дескриптора - одно из объяснений, которое я вижуWNOHANG сообщение (см. здесь ), но кроме множества [eventpoll] fds, я не вижу ничего такого зловещего.

Буду очень признателен за любые мысли или советы!Мы используем Python 3.6, колбу 0.12.2, колбу-rq2 18.0, колбу-сокетио 3.0.1 и redis 2.10.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...