QEMU 是一个行为级模拟器,公司在使用 QEMU 作为模拟器进行软件开发、模拟测试等工作。最近在 QEMU 上使用 ftp 时发现了一个问题,当传输 1k 文件时工作正常,传输 2k 文件时无法正常工作。
通过在内核中加 Log 信息,确认了几点问题:
通过 Log 信息,可以判断出一个结论,模拟器传输时,数据包没有被正确合并。通过网上资料查找 gso 相关信息时,确认了一个信息:
GSO不只针对TCP,而是对任意协议,尽可能把segmentation推后到交给网卡那一刻,此时会判断下网卡是否支持SG和GSO,如果不支持则在协议栈里做segmentation;如果支持则把payload直接发给网卡
由此确认,模拟器的网卡没有正确实现对 GSO 的支持。进入模拟器,在数据包发送函数中进行修改,支持 GSO。完成后,ftp 操作能够正常执行成功了。
参考文献:
linux内核网络协议栈学习笔记:关于GRO/GSO/LRO/TSO等patch的分析和测试