mTCP是指的是TCP on multicore system,是一种用户态TCP协议栈。传统TCP/IP
协议栈需要占用过多的CPU周期,因此,作者通过实现用户态的packet I/O Lib和TCP协议栈,将TCP协议栈的工作从内核态解放出来,从而实现性能的大幅提升。
背景和动机
运行在内核态的TCP协议栈需要占用过多的CPU周期。对于大量数据来说,传输开销不在于协议栈的处理流程,但是现如今数据量小的TCP连接越发常见,所以协议栈开销所占比重增大。
在该文之前的研究与优化方法均没有解决协议栈性能受制于CPU的情况,于是该文提出在用户态实现TCP协议栈的功能,从而提升性能。除此之外,作者还综合了之前所有已知的优化方法。
设计
总体的设计如图三所示,作者将socket功能和协议栈的功能都实现在了用户态。所有应用程序可以调用的接口最多只做少量改变。
图4展示了协议栈部分更为细节的内容,实现的关键在于图中:双方均可读写的buffer、应用传递操作给协议栈的job queues、协议栈传递操作给应用的event queue。对于这些部分的读写都是异步的,所以每次都可以读批量的内容。
总的来说,作者即是将部分协议栈的内容实现在了用户态,应用程序原本需要去内核态做的事情改成了去用户态做。由此将大部分开销由系统调用和上下文切换转换为函数调用。又通过设计一些队列使得可以多线程处理问题,进而函数调用的开销也平摊了。
以收到一个控制包为例,整个的工作流程如下:
- 一个SYN/ACK包到达
- 向accept队列中写入操作
- 向internal event queue中写入内容
- 当mTCP批处理完包(往队列中塞了很多元素)后,mTCP会排空这个internal event queue,将内容填充到Event queue,最终递交给APP。同时mTCP传递一个signal唤醒APP线程
- 线程同样批量获取和处理队列中元素
- 应用处理完之后,调用write()接口buffer中写入数据
- 往write queue中入队写操作
- mTCP批量取出write queue中的内容,并据其从buffer中取出数据,分块放入Data list中
作者关于mtcp的项目代码地址为:https://github.com/mtcp-stack/mtcp