Lec 21: Networking
网络协议
- 以太网 Ethernet
以太网帧: Header + Payload = Dest MAC(48b) + Src MAC(48b) + Type(16b) + Payload 实际的以太网帧的开头和结尾有软件不可见的数据: 开头有 Preamble + SFD, 结尾有 FCS. - ARP 协议
地址解析协议(Address Resolution Protocol), 根据 IP 地址获取 MAC 地址. - IP 协议
- UDP 协议
网络协议栈
网卡
缓存的队列作用
- 接收方向: 应对短暂的大流量
- 发送方向: 提高网卡发送性能的利用率
- 帮助组件之间解耦
网卡接收到数据包的操作
网卡内置有内存, 数据包到达后网卡将其缓存在其内存中, 然后向主机发送中断. 主机的驱动有一个循环程序, 会询问网卡是否缓存了数据包, 并将其拷贝到主机内存中(为使用 DMA). E1000 网卡使用了 DMA (Direct Memory Access). 主机软件会格式化一个 DMA ring, 里面存储着缓冲区的指针, 缓存由驱动初始化网卡时分配. 网卡接收到数据包时, 网卡会记住当前应该在 DMA ring 的位置, 并通过 DMA 将数据包直接写入对应的内存缓冲区中. 传输完成后, 网卡记录的指针会指向 DMA ring 的下一个位置.
现代网卡
- 支持网卡多队列. 即能同时与多个 RX ring 传输数据.
- 完成一些 TCP 的处理, 例如校验和计算.
中断活锁
路由器性能图分析
这是一个双网卡路由器, 从一个网卡接受数据包, 从另一个网卡发出.
- 黑色圆点的曲线开始时上升的原因?
在达到路由器处理瓶颈前, 可以处理和发送更多的数据包. - 曲线没有一直上升的原因?
CPU 的性能瓶颈, 网络的性能瓶颈. - 曲线下降的原因?
随着数据包接收速率增加, 每收到一个数据包(包括超过性能瓶颈的数据包)都会产生一个中断(此处网卡未使用 DMA, 通过中断从网卡拷贝数据包到主机内存). 中断有更高的优先级, 需要 CPU 进行处理, 而越多的数据包则需要消耗越多的 CPU 时间处理中断, 致使有越少的时间来转发数据包. 该现象被称为中断活锁(Interrupt Live lock).
其它产生活锁的情况
- 对于使用 DMA 的网卡, 可能 DMA 耗尽了内存的处理时间, 网卡占据了内存而导致 CPU 不能使用内存.
- 若 CPU 数据都消耗在数据包处理线程上, 而可能没有 CPU 时间给上层应用程序读取处理后的数据包, 同样会发生活锁.
活锁发生的根本原因
浪费 CPU 时间处理了最终被丢弃的数据包.
解决方案
描述
当网卡第一次触发中断时, 会导致中断处理函数运行. 中断处理程序不会从网卡拷贝数据包到内存, 而是会唤醒网络线程(处理数据包的线程), 并关闭网卡的中断. 网络线程有一个循环, 会一直检查并从网卡拉取固定数目的数据包进行转发. 若网卡中没有等待处理的数据包, 则网络线程会打开网卡中断, 并进入休眠状态. 对于上层应用程序没有 CPU 时间产生的活锁, 网络线程将查看对应应用的套接字队列, 若其变长(由于数据长时间未被应用程序处理), 网络线程会关闭中断, 并停止从网络接口读取数据包, 从而留给应用程序处理数据的时间, 直到套接字队列变短.
分析
该方法将中断方案(interrupt scheme)转变为轮询方案(polling scheme). 在高负载情况下中断会被关闭, CPU 会一直轮询读取并处理数据包. 由于中断被关闭, CPU 时间不会被中断占据. 而在低负载情况下则打开中断, 网络线程由中断程序唤醒. 本方案中, 网卡中有无等待处理的数据包不是由中断处理函数检查, 而是由网络线程本身检查. 这样网络线程是从网卡读取数据包而不用经过中断处理程序, 同时网卡本身会将超过其缓存队列的数据包丢弃, 从而就不会出现过多中断触发造成的活锁.
|