过去几十年互联网呈爆发式的增长,内容的丰富以及层出不穷的DDoS攻击等,对网络性能提出了极大的挑战,也同样促进了网络基础设施的快速发展。运营商的带宽越来越大,CPU/网卡等硬件的性能也会越来越强。但在很长时间内,软件的性能提升落后于硬件的性能提升,并严重限制了应用程序的性能,大部分时间不得不依靠堆机器来应对,造成了大量的资源浪费和成本提高。
随着软件的不断发展,在新世纪的第一个10年时,通过多线程和事件驱动(kqueue/epoll等)解决了C10K的问题。但是在第二个10年却不堪重负,亟需新的解决方案来应对网络流量的增长。
比如腾讯云对外提供的HttpDNS服务每隔几个月请求量都会翻倍,对高性能的网络处理和用户态协议栈都有强烈的需求。HttpDNS早期使用的内核协议栈只能做到单机不到10万QPS的TCP 短连接服务。随着技术的进步和发展,如REUSEPORT等,后续内核协议栈也可以做到几十万QPS了,但依然存在非常大的横向扩展瓶颈。基于这样的瓶颈下,腾讯云迫切需要一个高性能的网络服务框架,所以选择了通过DPDK+用户态协议栈来进行内核旁路来提升网络性能。
Robert David Graham 在2013年针对C10M的演讲中,对于如何达到千万并发连接,最主要的观点就是内核才是阻碍性能提升的问题,我们应该绕过内核(kernel by pass,内核旁路)以及大量其它的技术优化,如轮询、零拷贝、Hugepage等。
Linux内核后续引入的eBPF和XDP同样能够大幅提升网络性能,但是其提升性能的本质依然是绕过内核,目前还未能对Intel DPDK生态造成实质的冲击,尤其是对高内核版本和网卡驱动的依赖,严重限制了在企业的使用推广。
在此次演讲之前,相关的技术已经得到了一定的应用,如演讲中提到的PF_RING,Netmap,IntelDPDK等数据驱动,腾讯云DNSPod在2012年就已经完成了相关软硬件的调研选型工作,并最终选择DPDK(此时尚未开源)实现了新一代的权威DNS服务器达到了单10GE 1100万 QPS的性能,大幅提升了DNS的常规解析和抗攻击能力。但是确实直到该演讲出现后,相关技术才在业界得到了大规模的开发应用,尤其是从中脱颖而出的DPDK,几乎成了高性能网络程序的标配。而我们也是在16年的时候将权威DNS中使用DPDK的网络模块单独抽出来作为一个独立的通用的网络框架,可以复用到多个业务上提升网络性能,也就是现在的F-Stack。
F-Stack介绍及技术特点
F-Stack是一个全用户态的高性能的网络接入开发包,基于DPDK、FreeBSD协议栈、微线程接口等,用户只需要关注业务逻辑,简单的接入F-Stack即可实现高性能的网络服务器。将网络包进行内核旁路到应用层进行处理虽然大幅提升了网络性能,但是也无法再使用内核的网络协议栈了,这对4层以下以及简单的UDP 7层应用影响不大,但是对其他的7层应用来说,一个成熟的用户态协议栈是必须的,所以F-Stack就是腾讯云DNSPod给出的方案。
F-Stack是基本完整的网络编程框架,相当于用胶水粘合了了DPDK网络I/O模块、FreeBSD用户态协议栈、POSIX Like API,异步编程接口、部分上层应用等,供用户接入使用。
使用纯C开发(部分第三方组件使用了C++,F-Stack进行了封装),容易上手,但也要求用户有一定的DPDK使用基础。使用BSD 2-Clause开源协议,对商业使用非常友好。那对于F-Stack都有哪些技术特点呢?接下来将继续介绍。