python-requests多久执行一次dns查询?

12
我们正在使用Locust来对负载均衡后的 REST API 服务进行负载测试。我看到了这篇文章,关于负载均衡和自动扩展,这正是我们正在测试的内容。
Locust使用python-requests,它使用urllib3。我的问题是,是否每次连接 python-requests 都会进行DNS查询?如果不是,它是否可配置?

Urllib3 可能正在使用 socket.getaddrinfo,根据另一个 SO 问题上的这个 答案,应该使用您正在使用的操作系统的 getaddrinfo。因此,它应该根据每个后续请求到相同主机名的操作系统缓存结果。 - Cory Shay
根据这个问题:https://dev59.com/9mgu5IYBdhLWcg3w3ara 大多数Linux配置都禁用了缓存。 - djonsson
3个回答

5

Locust使用的是Python requests,而Python requests使用的是urllib3,而urllib3使用的是socket.getaddrinfo。根据这个SO线程的说法(假设您的测试机器运行Linux),socket.getaddrinfo禁用了DNS缓存。


1

1

是的,Python requests 库在每次请求时执行 DNS 查询;

然而,您可以通过使用 requests-cache 来改善这种行为。

requests-cache 是一个持久化的 HTTP 缓存,它提供了一种简单的方式来提高使用 Python requests 库的性能。

使用它非常简单,只需 1 分钟、2 行代码,您就可以开始使用了。

import requests
import requests_cache

requests_cache.install_cache('my_simple_cache')

您随后的 Python requests 调用现在应该自动使用缓存。如果您希望,还有更多细粒度的选项可供选择,例如自定义过期时间等。

(这解决了我在尝试批量处理某个东西时遇到的问题,突然在调用达到 10K 后停止工作,不是因为服务不可用,而是因为 DNS 请求被我的内部网络 DNS 服务器拒绝。)


经过多次尝试使用systemd-resolved后,这个方法可以显著减少DNS调用。 - sp1111
1
据我所知,requests-cache是用于缓存有效载荷而不是DNS缓存的。 - MattK
@MattK 嗯,那么现在你知道更多了!它也提供主机名到IP的DNS缓存。就像我在回答中描述的那样,以及sp1111在他的评论中提到的那样。 - Vinícius M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接