resolv.conf 的超时(timeout)与重试(attempts)机制

resolv.conf 的超时(timeout)与重试(attempts)机制

 

/etc/resolv.conf 有两个默认的值至关重要,一个是超时的 timeout,一个是重试的 attempts,默认情况下,前者是 5s 后者是 2 次。
这个估计很多工程师都不是很在意,一般情况下,使用默认的值倒没什么大问题,特殊情况我会在最后说明。

要测试,不要使用 dig, host, nslook 这类工具,因为他们并没有调用 resolver 的库,可以使用 getent 来测试。上面提到的只是一些诊断的工具,对于日常的应用来说,包括 web server、mail client、db 以及各种 app server 等等,任何使用 glibc resolver 都需要经过 resolv.conf 文件。

对于 libresolv 来说,只认 resolv.conf 的前三个 nameserver,所以写的再多也没什么意义。正常情况下,resolver 会从上至下进行解析,每个 nameserver 等待 timeout 的时间,如果一直到第三个都没结果,resolver 会重复上面的步骤 (attempts – 1) 次。

为了真正理解,例如下面这个场景:
search test.example.com example.com  
nameserver 192.168.0.1  
nameserver 192.168.0.2

假设 192.168.0.1 不返回结果(可能根本就不是台 DNS),我们假设需要解析 "www.devel",而这个仅仅在 www.devel.example.com 里面有记录,下面是整个执行的步骤:
1. "www.devel" on 192.168.0.1, wait until timeout (default 5 secs)
2. "www.devel" on 192.168.0.2, get reply: no such hostname
3. "www.devel" on 192.168.0.1, wait until timeout (default 5 secs)
4. "www.devel" on 192.168.0.2, get reply: no such hostname
5. "www.devel.test.example.com" on 192.168.0.1, wait until timeout (default 5 secs)
6. "www.devel.test.example.com" on 192.168.0.2, reply no such hostname
7. "www.devel.test.example.com" on 192.168.0.1, wait until timeout (default 5 secs)
8. "www.devel.test.example.com" on 192.168.0.2, reply no such hostname
9. "www.devel.example.com" on 192.168.0.1, wait until timeout (default 5 secs)
10. "www.devel.example.com" on 192.168.0.2, reply with IP address

默认情况下是 5s 超时,我做了两个简单的测试,把 resolv.conf 的前三个 nameserver 全部换成不存在的 1.1.1.1, 2.2.2.2, 3.3.3.3,然后可以观察下面 strace 跟踪的结果,对于 ping 以及 getent 来说,已经算是上层的应用结果了。
1. strace -t getent hosts baidu.com 
2. strace ping baidu.com

把 timeout 设置为 1s 的结果可以看下面这个测试结果:
strace -t ping baidu.com(options timeout:1)

对于生产有什么意义了?
对于任何的代码,不管何种形式的(HTTP 的也好,DB 的连接也罢),只要是一端对另外一端的连接,都应该加上超时重试以及异常处理的。上面其实一共涉及三个点:
1. 超时,目前绝大多数的 API 都支持这类参数,包括我们线上用的 grequestsMySQLdb 等等
2. 重试,对于代码层面同样重要,跟上面类似
3. 异常处理,好的代码对于无法连接或者连接超时等问题应该及时的抛出异常打 log,而不是什么都没有,否则会加大问题定位的工作量,后期维护起来也会异常的麻烦。

这里有个有意思的脚本能检测最佳的 DNS。

最后,记得 dig, nslook 只会解析 resolv.conf 的内容,而不会解析 hosts 里面内容,所以如果想让 dig 解析 hosts 里面的内容,可以通过 dnsmasq 实现。

ref:
https://access.redhat.com/solutions/21420
http://serverfault.com/questions/562079/adjusting-how-long-linux-takes-to-fail-over-to-backup-dns-server-listed-in-resol

原文地址:http://jaseywang.me/2015/01/02/resolv-conf-%E7%9A%84%E8%B6%85%E6%97%B6timeout%E4%B8%8E%E9%87%8D%E8%AF%95attempts%E6%9C%BA%E5%88%B6/

### 如何正确配置 `/etc/resolv.conf` 文件 在 Linux 中,`/etc/resolv.conf` 是用于指定 DNS 名称解析器的关键文件。如果该文件缺失或配置错误,可能会导致网络连接问题以及依赖于 DNS 解析的服务无法正常运行,例如 Kubernetes 初始化失败的情况[^1]。 以下是关于如何正确配置 `/etc/resolv.conf` 的说明: #### 1. 基本结构 `/etc/resolv.conf` 文件通常包含以下几个字段: - `nameserver`: 定义 DNS 服务器的 IP 地址。 - `search`: 设置域名搜索列表,在查询主机名时自动附加这些域。 - `options`: 配置名称解析的行为选项。 一个典型的 `/etc/resolv.conf` 文件可能如下所示: ```bash nameserver 8.8.8.8 nameserver 8.8.4.4 search example.com options timeout:2 attempts:3 ``` 上述配置指定了两个公共 DNS 服务器(Google 的 DNS),并设置了默认的域名搜索路径和超时时间。 --- #### 2. WSL 特殊情况下的处理方法 对于 Windows Subsystem for Linux (WSL),有时会因为修改了 `/etc/wsl.conf` 或其他原因导致 `/etc/resolv.conf` 被删除或覆盖。在这种情况下,可以通过以下方式恢复文件: - 如果之前误删了 `/etc/resolv.conf` 并且未注释 `/etc/wsl.conf` 中的相关设置,则需要重新启用注释部分以允许系统自动生成此文件[^2]。 具体操作步骤为编辑 `/etc/wsl.conf` 文件并将相关内容注释掉: ```bash sudo nano /etc/wsl.conf ``` 找到类似以下的内容并将其注释: ```ini [network] generateResolvConf = false ``` 保存后重启 WSL 即可生成新的 `/etc/resolv.conf` 文件。 --- #### 3. 手动创建或修改 `/etc/resolv.conf` 如果需要手动创建或调整 `/etc/resolv.conf` 文件,可以按照以下方式进行: ```bash sudo nano /etc/resolv.conf ``` 然后输入所需的 DNS 和其他参数。完成后记得赋予适当的权限以防止被意外覆盖: ```bash sudo chmod 644 /etc/resolv.conf ``` 需要注意的是,在某些发行版中(如 Ubuntu 使用 systemd-resolved),直接编辑 `/etc/resolv.conf` 可能会被动态管理工具重写。因此建议通过 NetworkManager 或者 systemd-resolved 来间接更改 DNS 设置。 --- #### 4. 修改主机名的影响 当使用图形界面工具(如 RedHat/Fedora/CentOS 提供的 `/usr/sbin/system-config-network` 工具)来更改主机名时,也可能影响到 `/etc/resolv.conf` 的内容[^3]。此时应确保同步更新相关配置以免引发冲突。 另外还可以尝试检查是否有隐藏的安全策略限制访问特定目录或者文件,比如 SELinux机制可能导致异常行为[^4]。 --- ### 示例代码:验证 DNS 功能 为了确认新配置生效否,可以用命令测试 DNS 查询功能: ```bash nslookup google.com ping google.com ``` 如果返回正常的 IP 地址则表明一切正常;否则需进一步排查网络环境或其他潜在干扰因素。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值