Python socket.gethostbyaddr查询延迟过高的原因排查求助
Python socket.gethostbyaddr查询延迟过高的原因排查求助
各位大佬好,今天碰到一个百思不得其解的问题,希望能得到大家的指点!
我有一批运行Python脚本的EC2服务器,当用户通过负载均衡连接过来时,我会根据用户IP获取对应的反向PTR记录,之前一直用这段代码:
import socket details = socket.gethostbyaddr(request.user_ip) print('User PTR is', details[0])
结果今天发现gethostbyaddr的查询耗时高得离谱——有的居然花了300秒!平均耗时1秒,还经常出现20-30秒的情况。我看到有资料说这个方法默认5秒超时,但在我的场景里完全不成立。
我的服务器是Debian 12系统,resolv.conf配置如下:
nameserver 172.31.0.2 search .
也就是依赖AWS VPC的DNS解析器。
我做了个简单的统计:只要gethostbyaddr耗时超过1秒,就记录时长和对应的IP。之后我在同一台服务器上用Python Shell单独查询那些慢IP,大部分要么几毫秒出结果,要么直接返回“无法解析主机”的错误,但有少数几个IP还是会出现秒级甚至分钟级的延迟。
我自己琢磨了几个可能的原因,想请大家帮忙验证是否合理:
- 会不会Python的
gethostbyaddr是串行排队处理的?哪怕我用了多进程,一旦有几个查询卡住,其他查询就得等相关socket资源释放才能继续? - Debian系统层面有没有对DNS查询做排队?当大量慢请求堆积时,新的请求就会被堵在队列里,导致延迟飙升?
- AWS的VPC DNS是不是存在某些问题,或者针对这类反向查询做了限流、延迟处理?
目前我用了一个临时解决方案:手动构造反向DNS查询(把IP反转后拼接成[ip-in-reverse].in-addr.arpa.的格式),直接调用Cloudflare的1.1.1.1 DNS服务器查询,现在耗时直接降到几毫秒,问题暂时解决了,但我还是搞不懂原来的方法为什么会有这么高的延迟。
想问问大家,我有没有漏掉什么可能的原因?到底是什么导致了gethostbyaddr的超高延迟?
备注:内容来源于stack exchange,提问作者Cyril N.
相关产品推荐
相关产品推荐

