对我们的后端 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
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