【问题标题】:Is socket.getaddrinfo in Python using cache?Python中的socket.getaddrinfo是否使用缓存?
【发布时间】:2020-03-13 08:40:57
【问题描述】:

我的应用程序执行大量 RPC。并得到了一些 DNS 解析错误。发现tornado AsyncHttpClient没有缓存dns结果,每次都调用socket.getaddrinfo。

我找到了像https://github.com/jayvdb/dns-cache 这样的库

和sn-ps之类的

def _setDNSCache():
    """
    Makes a cached version of socket._getaddrinfo to avoid subsequent DNS requests.
    """

    def _getaddrinfo(*args, **kwargs):
        if args in kb.cache:
            return kb.cache[args]

        else:
            kb.cache[args] = socket._getaddrinfo(*args, **kwargs)
            return kb.cache[args]

    if not hasattr(socket, "_getaddrinfo"):
        socket._getaddrinfo = socket.getaddrinfo
        socket.getaddrinfo = _getaddrinfo

我应该使用应用层 dns 缓存库吗?

【问题讨论】:

  • 有一个称为生存时间 (TTL) 的属性,它是 DNS 请求过程的一部分。这指定了当前 DNS 记录有效且不应发出新请求的时间。这减少了网络请求。您是否觉得您正在使用的库缓存时间过长或请求过于频繁?
  • @vincent 非常感谢。我认为我的应用发送 dns 查询请求过于频繁。

标签: python sockets tornado


【解决方案1】:

Python 没有自己的 DNS 缓存;每次都会调用getaddrinfo。对getaddrinfo 的调用是否被操作系统缓存取决于许多因素。上次我调查这个时,它通常不是默认的,但那是几年前的事了。安装dnsmasq 是(或曾经是)获取系统范围的 DNS 缓存(理解并遵守 TTL 等)的最简单方法

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 2013-08-08
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多