13

服务器网络带宽优化

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzI0NTQ5NTM1Mw%3D%3D&%3Bmid=2247483960&%3Bidx=1&%3Bsn=b82d0710bf5826f2d1261e00f8ad55bb
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

我们经常能看到讲述程序性能优化的文章,通过降低cpu、磁盘和网络io耗时,达到提升服务处理能力的目的。 当服务稳定下来后,出于节省带宽成本考虑,通常还需要对网络带宽进行优化,具体来说就是降低网卡进出流量。

流量分为入口和出口两类,入口就是外部到server的流量,出口是server到外部的流量,这两类流量一般分开计费。 一般不考虑机房内部的流量,比如server A到server B的流量,属于内部请求,主要关心的是与 server与公网 的流量。

降低网络流量,简单来说有两种方法,一是减少网络交互次数,二是降低每次交互的数据量。

减少交互次数

这个很好理解,尽量降低client请求server的次数,比如client通过轮询方式每隔1分钟向server发送请求,拉取最新的数据,如果数据很长时间才变更一次,那么就有很多无效的请求,可以改为当数据发生变化时,server主动推送给client。  

对于下载类操作,比如从cdn服务器下载文件,当大量client在高峰期集中向cdn拉取文件时,cdn出现 流量峰值 ,由于cdn使用峰值计费模式,导致cdn费用大增。 此时可考虑使用 p2p模式 下载文件,具体逻辑如下:

  1. 每个client定期向p2p-server上报自己的活跃状态以及本地缓存的文件块,p2p-server保存所有活跃client的信息

  2. 当clientA下载某文件时,先请求p2p-server获取存储了该文件的所有活跃client,也叫peer,得到可用的peer列表

  3. 若有可用的peer列表,clientA与每个peer建立p2p连接(涉及到udp打洞技术),尝试从peer处下载文件

  4. 若通过p2p方式下载文件成功,即可避免从cdn服务器下载文件

  5. 若p2p方式失败,再从cdn服务器下载,保障下载功能正常

还有一类减少路由次数的方法,比如serverA请求serverB中间需要经过n次nginx集群的转发操作,效率低且可能有计费,若能绕过不必要的nginx转发,只经过1个nginx,或者serverA直接请求serverB,就能避免不必要的计费,提升处理效率。

降低交互数据量

为降低网络流量,可采用有压缩效果的数据编码,比如用protobuf协议传递数据。 若使用http协议传输json数据,可通过gzip压缩降低数据量,具体逻辑如下:

  1. 若为GET请求,可在请求header里加上 "Accept-Encoding: gzip" 表示client可以接受gzip格式的返回数据

  2. server端可对返回数据进行gzip压缩,并在响应header加上 "Content-Encoding: gzip" ,告诉client,响应的body数据是gzip编码的

  3. client发现响应header里有"Content-Encoding: gzip",执行gzip解压,得到原始数据

  4. 若为POST请求,由于POST携带了body数据,同理也可以执行gzip压缩,可以在请求header里加上"Content-Encoding: gzip" 以及 "Accept-Encoding: gzip",表示client请求body里的数据是gzip编码的,同时可以接受gzip格式的返回数据,后续逻辑同上

gzip的压缩效果是显著的,对于json数据,压缩后可以只有原始数据的10%~50%,具体配置可以在nginx.conf里通过gzip相关指令实现。

若需要传递视频流,目前普遍使用H.264格式编码的视频文件,可以升级为H.265编码格式,H.265格式具有更高的压缩比及更好的画质,同样的视频文件,H.265可比H.264减少约30%的体积。

服务器带宽优化通常在业务稳定后才有所关注,但通常是一个见效极快的优化手段,希望本文能给大家带来有些帮助。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK