服务器网络带宽优化

我们经常能看到讲述程序性能优化的文章,通过降低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%的体积。

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