Friday, February 14, 2014

LSO, TSO, GSO和网络虚拟化

先来看三个缩写到底具体代表什么:Large Segment Offload (LSO),TCP segmentation offload (TSO), 以及Generic Segmentation Offload (GSO)。

首先来看LSO。我们知道计算机网络上传输的数据基本单位是离散的网包,既然是网包,就有大小限制,这个限制就是MTU(Maximum Transmission Unit)的大小,一般是1518字节。比如我们想发送很多数据出去,经过os协议栈的时候,会自动帮你拆分成几个不超过MTU的网包。然而,这个拆分是比较费计算资源的(比如很多时候还要计算分别的checksum),由CPU来做的话,往往会造成使用率过高。那可不可以把这些简单重复的操作offload到网卡上呢?

于是就有了LSO,在发送数据超过MTU限制的时候(太容易发生了),os只需要提交一次传输请求给网卡,网卡会自动的把数据拿过来,然后进行切,并封包发出,发出的网包不超过MTU限制。

反过来,当网卡收到很多碎片包的时候,也可以辅助自动组合成一段较大的数据,一次性提交给os处理。

很典型的,TCP协议中就考虑了分片存在的情况,往往是切分TCP的数据包,叫做TSO。而一般的情况,则称为LSO或者GSO。
对于其他不支持切片的协议例如UDP,则只能进行IP层上的切片。

这样做,一方面大大降低了CPU利用率,又增强了网卡等转发设备的feature,所以说有时候适当的进行offload很重要!

那么,这三个SO,跟虚拟化有什么联系呢?

在网络虚拟化中,一个最常见的技术就是隧道,这是实现overlay的通用手段。而实现隧道无非就两种思路,一种是把转发信息放到包头上,即封装/解封装(无论VXLAN还是STT都是这个思路);另外一种是由额外的数据库管理,转发时候进行查询。这两种思路各有利弊,这里不细说,如果我们采用封装/解封装的作法,那么可能原来网包并没有超过MTU限制,加上封装包头就超了,这就需要进行切片了。

所以VMware在其旗舰产品NVP中强调可以通过TSO来提高转发性能。

但是显然,前提是网卡能够支持,并且在os中配置打开。
可以通过ethtool -k eth0来查看当前状态
通过ethtool -K eth0 gso off/on 这样的命令来开关

1 comment:

  1. 通俗易懂,查了下,用 ethtool -K eth0 就能看网卡对 TSO、LRO 是否支持了。

    ReplyDelete