Недавно мы добавили 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.