一次有关 DNS 解析导致 APP 慢的问题探究
一、业务背景
HTTTPDNS
AWS Router53
APP 使用 HTTPDNS, 为解决 DNS 解析生效慢, DNS 劫持等问题。
我们 IOS 和安卓都是使用了 HTTPDNS。
域名托管在 AWS Router53。
域名有多个解析(基于延迟),为了解决就近接入。
示例配置
ai.baidu.com CNAME 延迟 亚太地区(香港) alias-ai-hk.baidu.com
ai.baidu.com CNAME 延迟 默认值 123455.baidu.com
ai.baidu.com CNAME 延迟 中国 alias-ai-zh.baidu.com
alias-ai-zh.baidu.com A - - 18.18.18.18(国内ip接入)
二、 问题
很直观的体现就是, APP 打开很慢。反馈主要是国内的用户。APP 用户面向的群体是全球,所以我们有多个接入。背后通过专线打通。
三、问题排查
不管是从前往后查,还是从后往前查。每个阶段都需要查下。
- 用户访问到接入层的网络
- 接入层到网关的网络。
- 各个服务的耗时。看下链路追踪。
这里也就直接说下我们重点关注的问题的地方: DNS 解析。
3.1、问题一: 基于DNS 延迟的解析
因为我们发现由于是基于DNS 延迟的策略,我发现在深圳通过 HTTPDNS 接口获取对应域名的解析,有很大概率会解析到香港的节点。 我们发现这个并不准确。
然后我们调整为 基于 地理位置 的 路由策略。
ai.baidu.com CNAME 地理位置 香港 alias-ai-hk.baidu.com
ai.baidu.com CNAME 地理位置 默认值 123455.awsglobalaccelerator.com
ai.baidu.com CNAME 地理位置 中国 alias-ai-zh.baidu.com
alias-ai-zh.baidu.com A - - 18.18.18.18(国内ip接入)
我们经过测试,发现这个对应的大陆请求都是解析到大陆的节点。 经过这次调整,我们几个APP 好像打开都快了点(不知道是不是心里作用)。 我们继续往下看。
3.2、问题二:HTTPDNS侧
HTTPDNS基础理论

HTTPDNS 的原理:
原本用户进行 DNS 解析是向运营商的 DNS 服务器发起 UDP 报文进行查询,而在 HTTPDNS 下,修改为用户带上待查询的域名和本机 IP 地址直接向 HTTPDNS 服务器发起 HTTP 请求,这个 HTTPDNS 服务将返回域名解析后的IP地址。那么这个 HTTPDNS 服务器会做什么? 第一 HTTPDNS 获取到请求后,如果当前节点(HTTPDNS 有很多节点) 没有缓存,那么 HTTPDNS 当前节点会向 DNS权威服务器 发起请求获取对应的解析记录。
那么一个域名的 DNS 权威服务器是什么? 我们可以找到我们的域名再对应的 DNS 管理可以看到。我们的 DNS 服务器信息。

[root@185 ~]# dig xiaoaxiao.cn
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> xiaoaxiao.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16195
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;xiaoaxiao.cn. IN A
;; AUTHORITY SECTION:
xiaoaxiao.cn. 600 IN SOA dns27.hichina.com. hostmaster.hichina.com. 2022052002 3600 1200 86400 600
;; Query time: 261 msec
;; SERVER: ……
;; WHEN: Tue May 30 22:37:28 CST 2023
;; MSG SIZE rcvd: 105
其中 dns27.hichina.com 和 dns28.hichina.com 就是我们这个域名的对应的权威服务器。
每个域名的权威DNS服务器是指该域名的DNS服务器,它负责管理该域名下的所有DNS记录,包括IP地址、邮件服务器、别名等。权威DNS服务器的作用是回答其他DNS服务器关于该域名的所有DNS查询请求。当用户访问该域名时,他们的计算机会向该域名的权威DNS服务器发送查询请求,以获取与该域名相关的IP地址和其他DNS记录。
相关问题
前面讲到 HTTPDNS 会请求 该域名的 DNS 权威服务器, 这里注意我们的域名是托管在AWS 的 router53 上的,也就是该域名对应的 DNS 服务器是 AWS 的在海外的。 注意是海外的。 那么这里有个链路就涉及到跨地域了,我们国内的用户访问 HTTPDNS,HTTPDNS服务端 再去访问 AWS 的DNS 服务器,这就涉及到跨地域。我询问了下 httpdns 的技术人员,并让他们给出对比数据。 HTTPDNS服务端 再去访问 AWS 的DNS 服务器 这个延迟会比访问国内的 DNS服务器慢很多。
北京:dp(35ms),aws(110ms);
上海:dp(3ms),aws(61ms);
广州:dp(5ms),aws(90ms);
那么这也是一个慢的原因。
我们继续怀着疑问,那么 HTTPDNS 服务端的节点不会有缓存吗? 如果有缓存的话那也只有第一次会慢。 HTTPDNS对应的技术人员告诉我们目前的策略是,是有缓存的,基于域名的 ttl 值来进行缓存的。当到达 ttl 值的 30% 剩余时间,如果剩余时间内有请求过来,那么会异步去再去请求权威服务器来刷新当前的缓存值。 如果没有请求,则到了ttl 值缓存失效。
- ttl 值
- 请求量。
实际测试并不是这个逻辑。 根本没有 30% 的阈值和 异步。说是后期会有。
也就是说,HTTPDNS, 服务端做的缓存只有存在一个基于TTL的缓存,如果你的请求是在TTL 过期的时间后,那么那一次请求 HTTPDNS 会耗时比较久。我测试了几次,第一次获取基本需要400MS左右。
四、优化方向
4.1、域名解析配置
尽量只配置一层解析。或者使用 CNAME 加速。
假设
a.com,b.com,c.com都是在 解析的域名:域名 记录类型 记录值 www.a.com CNAME www.b.com www.b.com CNAME www.c.com www.c.com A 1.2.3.4 只配置一层解析也就是
www.a.com直接 A 记录到具体的IP,如果我们设置的是
www.a.comcname到www.b.com,www.b.comcname到www.c.com,www.c.comA 记录到具体的IP,一般情况下,递归需要到授权服务器请求三次才能得到
www.a.com的 IP 地址,如下图所示:

启用CNAME加速功能,授权服务器会把CNAME记录和最终的 A 记录一次返回给递归,递归服务器由请求三次授权服务器,减小到请求一次,如下图所示:

这样就极大地减少了请求和应答中网络通信消耗的时间,让解析变得更快,特别是在设置多条CNAME解析记录的情况下,加速效果更明显。
4.2、靠近 HTTPDNS 服务端层
缩减
HTTPDNS到权威服务器之间的耗时。 把域名切到DNSPOD、万网等国内域名商。AWS(非AWS中国)Router53不支持国内DNS节点。调整
TTL值, 也就是增大TTL值,让它在HTTPDNS服务端缓存失效的时间变长,时间变长,在相同时间范围内,需要去请求权威服务器的次数也会变少。增加请求量, 像
HTTPDNS某个运营商在国内有近100多个节点。 如果我们的请求量达不到一个层级的话。那么请求到每个节点的请求去命中缓存的概率也会降低。 这样可以通过拨测实现,但是注意,不是直接拨测对应的域名,拨测的应该特定的接口(HTTPDNS的接口)。 如果直接拨测域名的话,只是改变的公网解析的场景,而改变不了HTTPDNS的场景。
4.3、靠近用户层
也就是APP 层
减少请求HTTPDNS
尽量使用缓存的
DNS, 不要频繁请求HTTPDNS。预解析和乐观DNS
预解析: 绝大多数的
APP在应用初始化阶段都有一个启动期,我们可以在这个启动期做一些preflight工作,即在初始化阶段我们可以针对业务的热点域名在后台发起异步的HTTPDNS解析请求。这部分预解析结果在后续的业务请求中可以直接使用,进而消除首次业务请求的DNS解析开销,提升APP首页的加载速度。乐观DNS: 乐观
DNS(Optimistic DNS)是一种基于缓存的DNS解析方法,它认为大多数DNS查询都会命中缓存,因此不需要每次都向上游DNS服务器发送查询请求,而是直接使用本地缓存中的结果。只有在缓存中没有找到对应的解析结果时,才会向上游DNS服务器发送请求。
五、扩展
5.1、如何测试本地到权威DNS服务器 获取域名的时间
[root@185 ~]# time dig @ns4.dnsv4.com www.a.com
……
real 0m0.074s
user 0m0.006s
sys 0m0.008s
5.2、 同地区不同网络,访问HTTPDNS 会不会命中缓存。
比如同一个手机,不同的网络,切换 联通到电信 在TTL 时间范围内,访问 HTTPDNS(腾讯云) 会不会命中缓存?
比如后面的 DNS 配置只配置了,基于地理位置的逻辑的配置。 比如 国内 到 A , 国外到 B. 在这个场景下 会不会命中缓存? 可以想一想?
经过确认, 腾讯云的HTTPDNS 是 同一个地域(省或者直辖市)+同一个运营商,会命中同一个缓存。 但是注意,同一个地域的 HTTPDNS 后端节点有多个,可能请求会到不同的节点,也可能命中不了缓存。
一次有关 DNS 解析导致 APP 慢的问题探究的更多相关文章
- 连接慢的主要原因是DNS解析导致
连接慢的主要原因是DNS解析导致解决方法: 1.在ssh服务端上更改/etc/ssh/sshd_config文件中的配置为如下内容:UseDNS no# GSSAPI optionsGSSAPIAut ...
- Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析
默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...
- [实用]DNS解析命令,静静地学会【转载】
[实用]DNS解析命令,静静地学会 2016-08-04 06:50 一.Windows下的nslookup 简单的查某个域名,那就nslookup toutiao.com,上面是dns地址,下面是解 ...
- DNS解析过程和域名收敛、域名发散、SPDY应用
前段时间项目要做域名收敛,糊里糊涂的完成了,好多原理不清晰,现在整理搜集下知识点. 域名收敛的目的是什么?简单来说就是域名解析慢.那为什么解析慢?且听下文慢慢道来. 什么是DNS? DNS( Doma ...
- 我眼中的 Nginx(六):深入 Nginx/Openresty 服务里的 DNS 解析
张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技术的 ...
- 由Nginx的DNS缓存导致的访问404
现象 访问某个URL出现404,而且全站都是404.通过日志查看Nginx的规则也正确,请求被代理到指定位置. 排查 最近针对这个站点没有修改过Nginx配置也没有站点升级.所以应该是其他原因.首先P ...
- DNS解析全过程分析
DNS解析过程 1.检查浏览器缓存中是否缓存过该域名对应的IP地址 用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的IP地址, 当用户再次访问的时候,浏览器就会从缓存中查找该域名对应 ...
- 刷新DNS解析缓存
为了提高网站的访问速度,系统会在成功访问某网站后将该网站的域名.IP地址信息缓存到本地.下次访问该域名时直接通过IP进行访问. 一些网站的域名没有变化,但IP地址发生变化,有可能因本地的DNS缓存没有 ...
- DNS解析过程和DNS挟持
1.DNS解析过程详解 1).在浏览器中输入一个域名,例如www.tmall.com,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析, ...
- 分析DNS解析时间
提高网页的打开速度,一般地我们会选择使用CDN,利用“就近原则”让用户在最短的时间内获取到服务器资源,实际应用当中采用CDN的方式提高网站访问速度的效果也是最明显的.这也就是为什么国外的空间打开速度远 ...
随机推荐
- DSLinux介绍
本发行版 名字叫 Damn Small Linux 整个磁盘大小是40多M, 相对于如今几十G起步的操作系统(对, 就是你Windows), 确实太tm小了 Kernel版本是2.4.26, 2004 ...
- 企业信息化-3.6 IT资源管理2-系统及应用
笔者从业的主要是App Dev&Ops,对操作系统有些了解,对应用软件了解的更多.以下是总结了以前跟Host&Server Service.Cloud Service.IT Solut ...
- keyclaok~keycloak存到cookie中的值和session_state
keycloak存到cookie中的值 AUTH_SESSION_ID KEYCLOAK_IDENTITY KEYCLOAK_SESSION AUTH_SESSION_ID 用户的当前session_ ...
- python入门教程之二十邮件操作
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...
- Java对象内存管理
对象内存管理介绍 编译好的java程序需要运行在JVM中:JVM为java程序提供并管理所需要的内存空间:"栈"."堆"."方法区"三个区域 ...
- LeeCode 动态规划(三)
完全背包问题 题目描述 有 n 件物品和容量为 w 的背包,给你两个数组 weights 和 values,分别表示第 i 件物品的重量和价值,每件物品可以放入多次,求解将哪些物品装入背包可使得物品价 ...
- 23.oneOf
const { resolve } = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') // 提取cs ...
- .NET开源分布式锁DistributedLock
一.线程锁和分布式锁 线程锁通常在单个进程中使用,以防止多个线程同时访问共享资源. 在我们.NET中常见的线程锁有: 自旋锁:当线程尝试获取锁时,它会重复执行一些简单的指令,直到锁可用 互斥锁: Mu ...
- 一文搞懂 x64 IA-64 AMD64 Inte64 IA-32e 架构之间的关系
想要搞清楚 x64.IA64.AMD64 指令集之间的关系,就要先了解 Intel 和 AMD 这两家公司在生产处理器上的发展历史. x86 处理器 1978年 Intel 生产了它的第一款 16bi ...
- 掌握这些GitHub搜索技巧,你的开发效率将翻倍!
作为开发it行业一员,学习借鉴他人项目是很有必要的,所以我们一般都会从github或者 Gitee 上面去参考借鉴他人的项目来学习增加自己的项目经验 但是github你真的用对了嘛,他的功能其实很强大 ...
