【发布时间】:2018-07-14 15:44:38
【问题描述】:
我编写了一个简单的 WSGI 应用程序(使用 Flask),由 uWSGI(即除了 uWSGI 之外没有其他 HTTP 服务器)提供服务,它只支持单个 PUT 路由,客户端可以使用该路由上传文件(可能约为 400MB 大小),并对其进行处理在服务器上,然后发回。
在 uWSGI 日志中,一段时间后我注意到两种超时错误。发送响应时通常是超时:
Feb 02 20:46:30 myserv uwsgi[18948]: uwsgi_response_sendfile_do() TIMEOUT !!!
Feb 02 20:46:30 myserv uwsgi[18948]: OSError: write error
Feb 02 20:46:30 myserv uwsgi[18948]: [pid: 18954|app: 0|req: 1795/3935] aa.bb.cc.dd () {32 vars in 455 bytes} [Fri Feb 2 20:46:06 2018] PUT /sample.exe => generated 0 bytes in 24314 msecs via sendfile() (HTTP/1.1 200) 6 headers in 258 bytes (3353 switches on core 0)
但有时,接收 PUT 请求时也会超时:
Feb 03 20:18:32 signserv uwsgi[18948]: [pid: 18953|app: 0|req: 2975/5670] aa.bb.cc.dd () {32 vars in 455 bytes} [Sat Feb 3 20:18:02 2018] PUT /samplefile.exe => generated 0 bytes in 29499 msecs via sendfile() (HTTP/1.1 200) 6 headers in 258 bytes (2930 switches on core 0)
Feb 03 20:20:30 signserv uwsgi[18948]: [uwsgi-body-read] Timeout reading 16384 bytes. Content-Length: 354414781 consumed: 0 left: 354414781
一些调试表明,这通常发生在非常慢的客户端(即负载很高)上。
我想通过增加一些超时来缓解这种情况,但是 uWSGI 似乎支持过多的超时,我不清楚它们中的哪些与这里相关。我确定了三个超时,听起来我可能想增加它们,但我很难找到关于它们有何不同的文档:
socket-timeouthttp-timeoutharakiri
谁能阐明这些超时的影响、它们的默认值是什么以及应该调整哪些(如果有)以避免上述问题?
【问题讨论】:
-
不管怎样,将
socket-timeout和http-timeout都设置为60 会使超时错误消失。我不知道它们中的任何一个是否足够,但它现在有效 - 所以我是一个快乐的露营者。不过,如果能得到一些信息丰富的答案仍然会很好,所以我将把这个问题留着。