使用 Eventlet 了解 Flask-SocketIO 的 Gunicorn Worker 和线程配置

问题描述 投票:0回答:1

我正在开发一个使用 SocketIO 的 Flask Web 应用程序,并且面临配置 Gunicorn 的问题,特别是工作线程和线程的数量。我的服务器运行在 Ubuntu 上,配备 32GB DDR4 内存和 i7 7700k CPU。我尝试了多种配置,但我对遇到的性能结果和 SocketIO 错误感到困惑。以下是使用不同命令时会发生的情况:

  1. 基本 Gunicorn 命令:
gunicorn --bind 0.0.0.0:5000 wsgi:app
Result: Extremely poor performance and SocketIO errors.
  1. 增加工人和线程:
gunicorn -w 12 -t 3 --bind 0.0.0.0:5000 wsgi:app
Result: Great performance but still SocketIO errors.
  1. 与一名 Worker 一起使用 Eventlet:
gunicorn -k eventlet -w 1 -t 100 --bind 0.0.0.0:5000 wsgi:app
Result: Great performance and no SocketIO errors.
  1. 将 Eventlet 与两个 Worker 一起使用:
gunicorn -k eventlet -w 2 -t 100 --bind 0.0.0.0:5000 wsgi:app
Result: Great performance but back to SocketIO errors.

鉴于上述场景,我有几个问题:

  1. Eventlet 中单个 Worker 的性能: 为什么我在场景 3 中仅使用一个 Eventlet Worker 就获得了良好的性能?这个单一工人如何有效地处理负载?
  2. 多个工作线程的 SocketIO 错误: 为什么在使用 Eventlet 时增加工作线程数量(场景 4)时再次出现 SocketIO 错误?如果
    eventlet -w 1
    为 eventlet 分配单个工作人员,那么我的程序是否会自动分配额外的工作人员?如果不是,那为什么我的应用程序表现良好?
  3. 性能和稳定性的最佳配置: 根据我的服务器规格和观察到的行为,平衡 Flask-SocketIO 和 Eventlet 的性能和稳定性的最佳 Gunicorn 配置是什么?
python flask socket.io gunicorn eventlet
1个回答
0
投票
  1. eventlet
    适用于
    IO bound
    任务。所以,使用这种类型的员工你会获得良好的表现。线程选项
    -t 100
    表示服务器将同时处理100个请求,当许多请求到来时,worker master将100个请求加载到部署应用程序的子worker。由于请求大多是IO任务,因此通过eventlet模式“并发”处理。如果您设置了
    few --thread
    ,则服务器为
    low performance
  2. 通过post:由于gunicorn使用的负载均衡算法有限,在使用该Web服务器时不可能使用多个工作进程。因此,上面的所有示例都包含
    -w 1
    选项。所以,如果你使用
    Flask-SocketIO version < 2.0
    ,它不支持多个worker并且会导致错误。每个worker都有不同的内存区域,导致客户端的请求被分配给另一个没有被前一个worker处理的worker
  3. 再次在使用多个workers的帖子中,您必须使用
    Flask-SocketIO >= 2.0
    并且需要一个
    queue
    ,例如redis,以便许多worker可以在增加worker数量之前获得其他worker的客户端连接。
© www.soinside.com 2019 - 2024. All rights reserved.