由 psycopg2.OperationalError 引起的间歇性 500 错误:无法翻译主机名

由 psycopg2.OperationalError 引起的间歇性 500 错误:无法翻译主机名

我们的后端 Django 应用程序(使用 ECS 和 Postgres RDS 部署在 AWS 上)的 20% 请求抛出了 500 个错误。查看 ECS 日志,显示各种相关错误:

psycopg2.OperationalError: could not translate host name "abc.efg.us-east-1.rds.amazonaws.com" to address
OSError: [Errno 16] Device or resource busy
<built-in function getaddrinfo>) failed with OSError

我们使用 gunicorn 和 gevent 来提供我们的应用程序:

gunicorn -t 1000 -k gevent -w 4 -b 0.0.0.0:8000 backend.wsgi

答案1

getaddrinfo是一个 gevent 函数,详情如下:https://www.gevent.org/dns.html

这些文档提到 gevent 提供了 4 个解析器。默认解析器“本机基于线程的主机名解析”提到“有一些关于长时间延迟、性能缓慢甚至挂起的报告,特别是在发出大量 DNS 请求的长期程序中。”并建议如果你遇到这种情况,请切换解析器。

我们改变了向 ares 解析器提供应用程序的方式,但此后我们就无法重现此问题了:

GEVENT_RESOLVER=ares gunicorn -t 1000 -k gevent -w 4 -b 0.0.0.0:8000 backend.wsgi

相关内容