F-Stack 助力 HTTP 网络服务器性能提升

时间:2022-04-25
本文章向大家介绍F-Stack 助力 HTTP 网络服务器性能提升,主要内容包括名词解释、实战表现、混合连接、长连接、附录、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

HTTP 协议因其易用性和普适性得到了大规模的普及,我们说HTTP协议是互联网的基石一点也不为过,当前提供HTTP服务的Server性能要求越来越高,如何提高 HTTP 服务器的性能变得非常重要。近年来网卡性能快速发展,给高性能HTTP服务提供了硬件支持,但是linux 内核却越来越成为高性能网络服务器的瓶颈。

HTTP 的传输层协议为 TCP ,TCP作为面向连接的协议能够提供可靠传输,但是在性能有非常大的短板,尤其在短连接网络业务服务中,受限于PCB表锁竞争等因素,系统内核大并发创建 TCP 连接的性能(CPS)非常低。实际HTTP服务开发中我们一般会尽量使用长连接来优化网络性能,但是在部分面向终端用户的业务中很难完全使用长连接,而且即便是长连接,其性能在某些应用上依然无法让人满意。

为了提高网络服务器性能,业界提出了好几个 Kernel Bypass 方案,比如Intel DPDK、NetMap、PF_RING等,这些方法的入门槛较高,而且主要是提供二层的收发包能力,没有提供完整的协议栈能力。 F-Stack 提供了一个低门槛、高性能、完整协议栈能力的网络服务器解决方案,F-Stack 使用 Intel DPDK 开发套件提高网络收发包性能,移植 FreeBSD 协议栈至用户态,提供了 Posix 和 微线程的编程接口,并集成了 Nginx 等实用应用程序,适用大部分的 HTTP 网络服务器场景并尽量降低业务接入 F-Stack 的接入门槛,HTTP 网络服务器无需改动业务代码或替换系统的网络API即可快速接入,并获得更高的性能。

名词解释

F-Stack:F-Stack是一个全用户态的高性能的网络接入开发包,基于DPDK、FreeBSD协议栈、微线程接口等,用户只需要关注业务逻辑,简单的接入F-Stack即可实现高性能的网络服务器

CPS:Connections Per Second,每秒钟新建(断开)连接数,本文主要指服务器每秒钟可以建立的 TCP 连接数。

TPS:Transactions per second,每秒钟事务数,在本文中指从客户端发起并完成一个完整的 HTTP 请求,过程包括建立 TCP 连接,发起 HTTP GET请求,F-Stack 服务器接收并回复 body 大小为600字节的数据(总数据包大小为),客户端接收完成相应数据,断开连接。

实战表现

本节介绍 F-Stack 在适用于不同业务场景状态下的测试及结果表现,所有测试数据由 Nginx 直接返回内存中缓存的数据,实际业务性能还受业务逻辑的影响,具体测试环境如下:

网卡:Intel Corporation Ethernet Controller XL710 for 40GbE QSFP+
CPU:Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz
内存:128G
操作系统:CentOS Linux release 7.2 (Final)
内核版本:3.10.104-1-tlinux2-0041.tl2数据包大小:HTTP HEADER 239字节, body 600 字节或 body 3.7k 字节(仅达到线速的测试使用该大小),包越大整体带宽表现会越好。

短连接

腾讯云的 HttpDNS 服务是一个典型的短连接服务,受限于系统内核 CPS 的性能瓶颈,在万兆网卡上原系统性能只有5万 TPS。在接入 F-Stack 之后,性能可以达到百万 TPS,F-Stack 使用了多进程的架构,每个进程有单独的协议栈,无资源共享和竞争,虽然单进程协议栈提升并不明显(约20%-50%),但是整体系统性能有了质的提升。下图为 F-Stack 上进行短连接的 HTTP TPS 测试数据。

短连接测试数据

混合连接

腾讯云的 CDN 业务是主要使用长连接的业务,长连接能大幅提升用户的访问速度,但是在实际用户访问统计中,平均一个 TCP 连接只会处理2-3个 HTTP 请求,系统内核的 CPS 性能瓶颈依然会极大影响 CDN 的整体性能,而且即便单个连接处理更多的请求,其性能差距依然十分巨大。下图为使用 F-Stack 与系统内核进行的对比测试结果,分别为每个连接处理3个和10个 HTTP 请求。

每个连接处理3个HTTP请求

每个连接处理10个HTTP请求

长连接

当数据传输不涉及到终端用户时,就比较容易在服务器间使用长连接提提升性能,且随着处理的数据包越来越大时,系统内核 CPS 性能瓶颈的影响将会逐渐减小,如长连接大包的业务场景下使用系统内核依然能达到 40GE 网卡的线速。

但是 F-Stack 此时依然有其实用价值,因为 F-Stack 除了多进程对共享资源的优化外,全用户态的协议栈同时也对锁竞争、内存拷贝、中断处理、上下文切换等进行了优化,能够消耗更少的资源达到相同的性能表现。 下图为长连接场景下小文件(典型场景如通信服务器之间的数据传输)与较大文件(典型场景如 CDN 业务中边缘节点和中间源间的数据传输)时 F-Stack 与系统内核的对比测试。

长连接小文件(Nginx表示未将网卡队列中断到不同CPU)

长连接较大文件

附录

F-Stack 相关资源:

GITHUB地址: https://github.com/f-stack/f-stack, 您的使用、 加入开发、 star 一下,都是对我们最好的支持。

官方网站: http://www.f-stack.org/,如果您的项目使用了 F-Stack,希望通知我们,我们会加入您项目的相关信息。