SIGPIPE 写入 EBS Docker 应用程序中的关闭管道错误
Posted
技术标签:
【中文标题】SIGPIPE 写入 EBS Docker 应用程序中的关闭管道错误【英文标题】:SIGPIPE writing to a closed pipe error in an EBS Docker app 【发布时间】:2021-07-29 09:29:11 【问题描述】:在 EBS 和本地运行 docker 容器时出现莫名其妙的错误。该容器运行一个裸 uWSGI 进程,该进程加载一个运行长时间(超过 5 秒)请求的应用程序。 docker 容器在本地运行良好;并且当通过盒子上的 ssh 运行时,整个代码路径在 EBS 主机上运行良好(通过以编程方式将请求提交到入口函数,该函数模拟来自客户端的 POST 参数)。但是当通过 API 路由通过 http 调用代码路径时,它会出错:
Fri May 7 03:01:40 2021 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /preview-map (ip 172.17.0.1) !!!
2021-05-07 03:01:40] log_exception 1761 - Exception on /preview-map [POST]
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
...
File "./scene.py", line 135, in scenePreview
quality=10) # quality=1 => no shadow/reflection, quality=10 is 'normal'
File "/usr/local/lib/python3.7/site-packages/vapory/vapory.py", line 102, in render
quality, antialiasing, remove_temp)
File "/usr/local/lib/python3.7/site-packages/vapory/io.py", line 114, in render_povstring
raise IOError("POVRay rendering failed with the following error: "+err)
TypeError: can only concatenate str (not "bytes") to str
我调试了几个小时,假设错误与堆栈跟踪有关:POVRay(由 Vapy 库在 Python 中抽象的 3D 场景渲染引擎),但我可以在 EBS docker 容器上运行 POVRay 函数没问题。
是否有可能我在 EBS 中的 uWSGI 进程在 3 秒后关闭了我的连接,而这种代码中断只是巧合?它是 docker,所以我的本地环境和远程环境之间真的没有任何区别,除了 EBS 正在做的事情来过早关闭连接。
我被难住了。知道如何进一步调试吗?
【问题讨论】:
【参考方案1】:TL;DR - /usr/local/lib/python3.7/site-packages/vapory/io.py
文件中的 err
应该是 err.decode('ascii')
。这可能是在以后的版本中修复的错误。
让我们看看回溯的最后一部分:
File "/usr/local/lib/python3.7/site-packages/vapory/io.py", line 114, in render_povstring
raise IOError("POVRay rendering failed with the following error: "+err)
TypeError: can only concatenate str (not "bytes") to str
显然,错误来自render_povstring
函数在/usr/local/lib/python3.7/site-packages/vapory/io.py
文件中的这一行:
raise IOError("POVRay rendering failed with the following error: "+err)
看来err
的类型是bytes
而不是str
,为了证明这一点,我安装了vapory
模块并导航到io.py
文件。我在render_povstring
函数的文件中看到的是
raise IOError("POVRay rendering failed with the following error: "+err.decode('ascii'))
所以这曾经是包中的一个错误,可能会在以后的版本中得到修复。
【讨论】:
错误是一个红鲱鱼。由于 uWSGI 超时,服务器正在关闭进程。当我将进程迁移到作业队列(Django Q FTW)时,问题就消失了。【参考方案2】:与此处相同的解决方案:Fixing broken pipe error in uWSGI with Python
增加 uWSGI 超时。
ENV UWSGI_CONNECT_TIMEOUT=2400 UWSGI_READ_TIMEOUT=2400 UWSGI_SEND_TIMEOUT=2400
【讨论】:
以上是关于SIGPIPE 写入 EBS Docker 应用程序中的关闭管道错误的主要内容,如果未能解决你的问题,请参考以下文章
在 AWS beanstalk 下将特定的 EBS 卷挂载到 Docker
使用 EBS 部署多容器 docker 环境(flask 和 nginx)
如何使用 docker-compose.yml 和 ecs-cli 将 EBS 卷附加到我的容器
为啥python在关闭fifo文件时会生成sigpipe异常?
避免SIGPIPE导致的iOS应用闪退/Avoiding SIGPIPE signal crash in iOS(mach_msg_trapSIGPIPE信号)