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?

避免SIGPIPE导致的iOS应用闪退/Avoiding SIGPIPE signal crash in iOS(mach_msg_trapSIGPIPE信号)