我正在开发一个使用 SocketIO 的 Flask Web 应用程序,并且面临配置 Gunicorn 的问题,特别是工作线程和线程的数量。我的服务器运行在 Ubuntu 上,配备 32GB DDR4 内存和 i7 7700k CPU。我尝试了多种配置,但我对遇到的性能结果和 SocketIO 错误感到困惑。以下是使用不同命令时会发生的情况:
gunicorn --bind 0.0.0.0:5000 wsgi:app
Result: Extremely poor performance and SocketIO errors.
gunicorn -w 12 -t 3 --bind 0.0.0.0:5000 wsgi:app
Result: Great performance but still SocketIO errors.
gunicorn -k eventlet -w 1 -t 100 --bind 0.0.0.0:5000 wsgi:app
Result: Great performance and no SocketIO errors.
gunicorn -k eventlet -w 2 -t 100 --bind 0.0.0.0:5000 wsgi:app
Result: Great performance but back to SocketIO errors.
鉴于上述场景,我有几个问题:
eventlet -w 1
为 eventlet 分配单个工作人员,那么我的程序是否会自动分配额外的工作人员?如果不是,那为什么我的应用程序表现良好?eventlet
适用于 IO bound
任务。所以,使用这种类型的员工你会获得良好的表现。线程选项-t 100
表示服务器将同时处理100个请求,当许多请求到来时,worker master将100个请求加载到部署应用程序的子worker。由于请求大多是IO任务,因此通过eventlet模式“并发”处理。如果您设置了 few --thread
,则服务器为 low performance
-w 1
选项。所以,如果你使用Flask-SocketIO version < 2.0
,它不支持多个worker并且会导致错误。每个worker都有不同的内存区域,导致客户端的请求被分配给另一个没有被前一个worker处理的workerFlask-SocketIO >= 2.0
并且需要一个queue
,例如redis,以便许多worker可以在增加worker数量之前获得其他worker的客户端连接。