Flask request.data 很慢
Flask request.data is slow
我们在亚洲和美国有一些客户,我们在处理他们的 POST 请求时调用 request.data 时看到了这种奇怪的行为:
- 新加坡客户端超快(> 10 毫秒)
- 美国客户端没有那么快(50 - 100 毫秒)
- 中文客户端最慢(200+ms)
我们使用cProfile得到了上面的数据,所以应该是准确的(我想?)。每个客户端的有效载荷在 50 - 700 字节之间变化,但似乎没有表现出任何模式(新加坡客户端有一个中等大小的 POST 有效载荷,而中国客户端有一个小尺寸)
查看 this question 后,我怀疑我们遇到了类似的情况,即在收到 headers 后立即处理请求,因此调用 request.data 块直到完整POST 收到有效负载。我猜中国客户端是最慢的,因为 GFW 减慢了 POST 有效负载的传输。
我有两个问题:
- 分析的有道理吗?
- 我该如何解决这个问题?上述行为似乎效率很低,因为我的 API 实例被阻塞了额外的时间并浪费了 CPU 周期。如果在发送到 API 实例
之前完全接收到请求,它似乎会工作得更好
FWIW,我继承了这个代码库,我的理解可能存在一些差距,但我们的 DCOS 架构类似于下图。我尝试在外部马拉松 LB 中寻找配置选项以增加缓冲或仅发送完全接收到的请求,但我没有找到这样的选项。
看来我想通了!
显然 Marathon LB 是 HAProxy 的包装器,HAProxy 有一种机制可以在将其转发到后端之前接收完整的 HTTP 请求负载。将 http-buffer-request 选项添加到 Marathon-LB 配置似乎已经成功了!
我们在亚洲和美国有一些客户,我们在处理他们的 POST 请求时调用 request.data 时看到了这种奇怪的行为:
- 新加坡客户端超快(> 10 毫秒)
- 美国客户端没有那么快(50 - 100 毫秒)
- 中文客户端最慢(200+ms)
我们使用cProfile得到了上面的数据,所以应该是准确的(我想?)。每个客户端的有效载荷在 50 - 700 字节之间变化,但似乎没有表现出任何模式(新加坡客户端有一个中等大小的 POST 有效载荷,而中国客户端有一个小尺寸)
查看 this question 后,我怀疑我们遇到了类似的情况,即在收到 headers 后立即处理请求,因此调用 request.data 块直到完整POST 收到有效负载。我猜中国客户端是最慢的,因为 GFW 减慢了 POST 有效负载的传输。
我有两个问题:
- 分析的有道理吗?
- 我该如何解决这个问题?上述行为似乎效率很低,因为我的 API 实例被阻塞了额外的时间并浪费了 CPU 周期。如果在发送到 API 实例 之前完全接收到请求,它似乎会工作得更好
FWIW,我继承了这个代码库,我的理解可能存在一些差距,但我们的 DCOS 架构类似于下图。我尝试在外部马拉松 LB 中寻找配置选项以增加缓冲或仅发送完全接收到的请求,但我没有找到这样的选项。
看来我想通了!
显然 Marathon LB 是 HAProxy 的包装器,HAProxy 有一种机制可以在将其转发到后端之前接收完整的 HTTP 请求负载。将 http-buffer-request 选项添加到 Marathon-LB 配置似乎已经成功了!