Domain-Name-System

由 psycopg2.OperationalError 引起的間歇性 500 錯誤:無法翻譯主機名

  • October 13, 2021

對我們的後端 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

引用自:https://serverfault.com/questions/1080450