我使用Daphne进行socket和http连接。我正在运行4个worker容器,并且现在在一个docker容器中本地运行所有的东西。
如果我尝试上传400MB的文件,我的daphne服务器会失败。它可以很好地处理15MB以下的小文件。
我的docker容器退出,错误代码为137。我在daphne日志中没有得到任何错误。daphne容器死了,而worker容器继续运行。
有没有人知道有没有办法提高daphne上的上传限制,或者我错过了其他东西?
我通过daphne -b 0.0.0.0 -p 8001 project.asgi:channel_layer --access-log=${LOGS}/daphne.access.log启动了daphne服务器
发布于 2019-03-19 17:18:05
这是因为daphne在通过通道将控制权转移到django之前完全加载了整个HTTP POST请求正文。
所有的400MB内存都加载到内存here中。由于out of memory原因,您的停靠容器已死。
这甚至在检查django中的请求体的大小之前就发生了。请参阅here
如果你现在想阻止它,可以使用uvicorn来代替daphne,这是开放的here。Uvicorn必须使用块将控制权传递给Django。根据FILE_UPLOAD_MAX_MEMORY_SIZE django的设置,您将在硬盘上(而不是在内存中)收到一个临时文件。但您需要编写自己的AsyncHttpConsumer或AsgiHandler,因为来自通道的AsgiHandler和AsgiRequest也不支持分块正文。在PR之后,这将成为可能。
https://stackoverflow.com/questions/46986220
复制相似问题