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