DNS clients-per-query 参数详解

问题背景

通常内网DNS在生产中的角色如下图,生产机器上的DNS server配置的IP地址为内网DNS的地址,线上机器需要做域名查询的时候,比如访问www.baidu.com,先把dns请求到内网DNS,内网DNS逐级去查询www.baidu.com的地址,查询完毕之后,把结果返回给线上机器;问题出现的背景,线上有服务反馈偶发查询域名会有超时,查询机器的各项基础指标,发现没有出现cpu彪高,网络丢包等问题,DNS server日志查询发现那一个时间段,仍然能收到用户请求,但是有错误提示如下

errors-clinets-per-query

named.conf配置中相对应的参数:
named.conf配置截图

参数介绍

问题锁定在 clients-per-query 参数,和 max-clients-per-query 参数,来看一下这两个参数的意思:

同一时间请求一个域名

在同一时间请求相同域名的次数上有限制,这个参数就是 clients-per-query , 字面上的意思是一次请求的clients数量,这个参数默认是10,就是说默认只能10个client同一时间请求www.baidu.com,这时bind去查询,在查询结果没有返回之前,如果仍然有请求发来,这个时候,Bind就会drop这个请求,client DNS解析失败。如果Bind查询www.baidu.com返回了正确的结果,这是 clients-per-query 这个参数的限制就增加了5,就是说,这次容许15个client来同时查找相同域名,第16个被drop,这次查询成功之后,再增长5,直到增长到 max-clients-per-query,默认是100,就说是每次都能成功查询之后,同时容许100个clients来查询相同的记录;

解决方案

线上环境很容易出现,一个查询被大量查的情况,需要调大 clients-per-query,max-clients-per-query两个参数,具体参数值应该根据线上的情况设定,一般设置100到500,可以满足正常的查询请求,不建议把这两个参数设置成无限大,因为这个机制本身也是Bind保护自己的一个手段,假如大量的clients同时查询错误的域名,这些查询会占用Bind的处理时间。这也是clients-per-query如果查询成功之后,逐次递增设计的原则。

你可能感兴趣的:(DNS clients-per-query 参数详解)