无论是以前工作需要,还是兴趣爱好,我们大多数人可能都只是研究学习过少数几种网络协议。因公司规模或者说项目的原因,流量远达不到需要我们去关心网络方面问题,又或者没机会去接触。
笔者现在参与网络项目的研发,发现自己很多网络知识都不了解,在跨部门沟通时很是被动,需要补一些网络方面的知识。
本篇我们一起从一个后端开发者的视角,理解带宽、以及内容分发网络CDN。
网络带宽
影响应用吞吐量瓶颈的因素,除了我们开发常说的CPU核心数与内存大小,还有最容易被忽视的网络带宽。
对于服务端开发者而言,我们更关心的影响应用吞吐量的是公网带宽、内网专线带宽。而网卡带宽一般都很大,一般不需要我们关注。
你有没有遇到过这种现象:CPU负载很正常,内存使用率也很低,GC什么的也正常,单节点的QPS就是上不去。如果统计出站流量,就能根据每秒流量和带宽比较,是否是带宽瓶颈。
那么,如何计算带宽多大才支撑得起期望的QPS呢。
首先我们要理解带宽是什么?
一般1M带宽是指1Mbps(bit), 并不是平时说的字节(byte)。例如,4Mbps带宽,即每秒传输数据量最大为4/8=0.5M bit/s,等于512KB/s。
带宽包括出入带宽,出带宽指服务器响应给客户端的出站数据流量带宽,入带宽指服务器接收客户端的入站数据流量带宽。为云虚拟机购买公网带宽时,一般入网带宽等于出网带宽。
常用的需求带宽计算公式:每秒出站流量字节数×8(转为bit)/ 0.7(70%的利用率)/ (1024*1024) = 需求宽带(Mbps)。
假设某接口数据包大小为1kb,受硬件限制支持最大200 QPS。那么理论上对带宽的需求就是2Mbps。
笔者做了一组测试来验证理论。
笔者编写了一个简单的web应用,只提供一个响应1kb大小的json数据的接口,并统计平均QPS。已在本地测试,忽略带宽的情况下,将性能优化到最佳。
然后,在阿里云上购买了两台虚拟机,为了排除CPU和内存的影响,买了两台4核8G的虚拟机,然后一台虚拟机选择公网带宽为1Mbps、另一台是4Mbps。这两台虚拟机同机房、同配置,唯一不同的就是带宽。
将服务部署到虚拟机上后,本地启动个并发脚本,测试数据如下。
带宽 | **平均QPS ** | 100%利用率需要的带宽 | 70%利用率需要的带宽 | **实际带宽占用峰值 ** |
---|---|---|---|---|
1Mbps | 114 | 0.89Mbps | 1.27Mbps | 1.07Mbps |
4Mbps | 438 | 3.42Mbps | 4.88Mbps | 3.77Mbps |
阿里云控制台查看监控带宽使用情况(显示的是每分钟的平均值):
(1Mbps带宽-虚拟机网络监控)
(4Mbps带宽-虚拟机网络监控)
结论:公式不确定是否符合实际,但可以肯定的是,固定带宽会影响应用吞吐量。
内容分发网络CDN
CDN可能大家比较熟悉,也经常听到这个词。如果对CDN比较陌生,可以登录阿里云、腾讯云、华为云、Akamai、Cloudflare,搜索CDN,然后查阅CDN的介绍文档。工作原理如图所示。
(图片来源:华为云-内容分发网络 CDN-产品介绍-工作原理)
CDN早期主要应用于静态资源加速,缓解源站压力,降低带宽和服务器需求成本。将源站隐藏在CDN后面,还能借助CDN防DDoS攻击。随着技术的发展,CDN也被应用于直播音视频流、信令的加速,解决用户最后一公里的接入问题。
- 源站:CDN回源的站点,当CDN没有缓存资源时,会请求源站获取资源,然后缓存,再响应给客户端。
- 信令:请求响应。
在没有接入CDN的情况下,用户向后端服务发送请求,假设后端服务用的是电信运营商,用户使用联通网络发送请求。在国内,由于三大运营商网络通过公共交换中心互联,支持跨网互通,但其质量难以保证。如若物理距离还很远,网络延时大会使连接极其不稳定。
不知道你小时候有没有玩过热血江湖、魔域这类网游,当时游戏都是分很多大区的,比如网通一区、联通一区、电信一区,都是使用运营商分区的,不同区数据不互通,而且如果你是电信用户,玩联通一区,可能网络就会很卡,延迟高。
接入CDN后,用户只需要与地理位置最近、择优同运营商的CDN节点建立连接(通过DNS解析获取),保证了用户与CDN节点之间的网络稳定性。而CDN节点是怎么回源到源站的,不同厂商的实现也不同。
CDN节点或通过内网直接回源源站(配置内网回源),或通过公网直接回源源站(配置公网回源),或通过内部路径择优路由技术,先将请求转发到离源站最近的CDN节点,再由该节点走内网/公网转发请求给源站。
另外,CDN加速可以覆盖全球的线路。CDN厂商通过和运营商合作,自己搭建BGP网络,实现了跨运营商、跨地域的全网覆盖互联互通。实际上,现在我们购买云虚拟机,云厂商分配的IP都已经是多网互通的,而不能指定运营商了。
如果感兴趣,在Mac系统上,我们可以使用traceroute host命令追踪路由,获取从源主机到目标主机经过的所有路由器。能够知道网络通不通、需要经过多少跳、以及到达各个路由器的耗时。通过ip138等网站查询路由器所属运营商,观察是否有跨运营商情况。
参考文献:
- cdn详解:https://www.ucloud.cn/yun/11581.html
- BGP漫谈:https://zhuanlan.zhihu.com/p/25433049
- traceroute使用与实现原理分析:https://zhuanlan.zhihu.com/p/36811672