烧瓶MQTT高CPU使用

发布于 2025-02-13 02:34:33 字数 2151 浏览 3 评论 0原文

我在嵌入式系统上的项目上使用烧瓶,并且遇到了性能问题。我正在与一个Eventlet Worker一起运行:

Gunicorn -B 0.0.0.0 - worker -class Eventlet -w 1'app:create_app()'

我面临的问题是,当MQTT消息开始以更多的节奏涌入时,该应用程序几乎开始使用我可用的所有CPU。我最初的想法是,我在理想情况下处理这些消息并不理想,但是,我什至拿走了我的处理程序,只是收到消息,问题仍然存在。

我还有另一个Python应用程序与PAHO客户端订阅了相同的信息,这不是问题,因此我假设我在烧瓶应用程序中缺少某些内容,而不是信息本身。

我的代码是:


import eventlet

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, current_user
from flask_socketio import SocketIO
from flask_mqtt import Mqtt

eventlet.monkey_patch()

#USERS DB
db_alchemy = SQLAlchemy()

#socketIO
socketio = SocketIO(cors_allowed_origins="*", async_mode='eventlet')

# MQTT
mqtt_client = Mqtt()

'''
 APPLICATION CREATION
'''
def create_app():
    app = Flask(__name__)
    if app.config["ENV"] == "production":
        app.config.from_object("config.ProductionConfig")
    else:
        app.config.from_object("config.DevelopmentConfig")

    #USERS DB
    db_alchemy.init_app(app)

    #LoginManager
    login_manager = LoginManager()
    login_manager.login_view = "auth.login"
    login_manager.init_app(app)

    #SOCKETIO
    socketio.init_app(app)

    #FLASK-MQTT
    app.config['MQTT_BROKER_URL'] = 'localhost'  #
    app.config['MQTT_BROKER_PORT'] = 1883  
    app.config['MQTT_KEEPALIVE'] = 20  
    app.config['MQTT_TLS_ENABLED'] = False  
    mqtt_client.init_app(app)

    return app

#MQTT
@mqtt_client.on_connect()
def mqtt_on_connect():
    mqtt_client.subscribe('testTopic/#', 0)

@mqtt_client.on_disconnect()
def mqtt_on_disconnect():
    loggerMqtt.warning(' > Disconnected from broker')

@mqtt_client.on_subscribe()
def mqtt_on_subscribe(client, obj, mid, granted_qos):
    pass

@mqtt_client.on_message()
def mqtt_on_message(client, userdata, message):
    pass
    #mqtt_topicSplitter(client, userdata, message)

您可以看到我的处理程序 mqtt_topicsplitter 已评论,但我仍有性能问题。我尝试在on_message处理程序上添加睡眠命令[Eventlet.sleep(0.1)],该处理程序解决了CPU消耗问题,但导致我的应用程序不断地从经纪人中踢出。

我还尝试使用其他工人(gevent,asyncio,..)而没有成功。使用烧瓶开发服务器不是一个选择,因为不建议生产。

很抱歉,如果我不清楚,但我不是专家,请随时问我任何问题。

提前致谢。

I'm using Flask on a project on an embedded system and I'm having performance issues. I'm running gunicorn with one eventlet worker by running:

gunicorn -b 0.0.0.0 --worker-class eventlet -w 1 'app:create_app()'

The problem I'm facing is that, when the MQTT messages start to pour with more cadence, the application starts to use almost all the CPU I have available. My initial thought was that I was handling the messages not ideally but, I even took out my handler, and just receive the messages, and the problem still persists.

I have another python application that subscribes to the same information with the paho client and this is not an issue, so I'm assuming I'm missing something on my Flask application and not the information itself.

My code is:


import eventlet

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, current_user
from flask_socketio import SocketIO
from flask_mqtt import Mqtt

eventlet.monkey_patch()

#USERS DB
db_alchemy = SQLAlchemy()

#socketIO
socketio = SocketIO(cors_allowed_origins="*", async_mode='eventlet')

# MQTT
mqtt_client = Mqtt()

'''
 APPLICATION CREATION
'''
def create_app():
    app = Flask(__name__)
    if app.config["ENV"] == "production":
        app.config.from_object("config.ProductionConfig")
    else:
        app.config.from_object("config.DevelopmentConfig")

    #USERS DB
    db_alchemy.init_app(app)

    #LoginManager
    login_manager = LoginManager()
    login_manager.login_view = "auth.login"
    login_manager.init_app(app)

    #SOCKETIO
    socketio.init_app(app)

    #FLASK-MQTT
    app.config['MQTT_BROKER_URL'] = 'localhost'  #
    app.config['MQTT_BROKER_PORT'] = 1883  
    app.config['MQTT_KEEPALIVE'] = 20  
    app.config['MQTT_TLS_ENABLED'] = False  
    mqtt_client.init_app(app)

    return app

#MQTT
@mqtt_client.on_connect()
def mqtt_on_connect():
    mqtt_client.subscribe('testTopic/#', 0)

@mqtt_client.on_disconnect()
def mqtt_on_disconnect():
    loggerMqtt.warning(' > Disconnected from broker')

@mqtt_client.on_subscribe()
def mqtt_on_subscribe(client, obj, mid, granted_qos):
    pass

@mqtt_client.on_message()
def mqtt_on_message(client, userdata, message):
    pass
    #mqtt_topicSplitter(client, userdata, message)

As you can see my handler mqtt_topicSplitter is commented but I'm still having performance issues. I've tried adding an sleep command [eventlet.sleep(0.1)] on the on_message handler which solved the CPU consumption problem but resulted on my application being constantly kicked from the broker.

I also tried using other workers (gevent, asyncio, ..) without success. Using the Flask development server is not an option, since is not recommended for production.

I'm sorry if I wasn't clear, but I'm not an expert, please feel free to ask me any questions if needed.

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文