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,希望通知我们,我们会加入您项目的相关信息。

原文发布于微信公众号 - FStack(F-Stack)

原文发表时间:2017-05-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

C语言贪吃蛇源码

今天笔者为大家展示C语言写的贪吃蛇游戏,让大家玩一玩自己写的游戏~ 是纯C语言哦~VC6.0开发 无问题 首先,开始界面: ? 游戏界面如下: ? 部分代码截图...

71360
来自专栏LiveEdu在线科技教育平台

10最好用的Node.js工具、插件和资料库

每一个称职的程序员都应该拥有一套极好的工具来提高自己的工作效率。在Livecoding.tv 上,那里的程序员分享了10个他们认为是最好用的工具、插件和资料库。...

361110
来自专栏java一日一条

我的编码习惯 - 配置规范(导读)

工作中少不了要制定各种各样的配置文件,这里和大家分享一下工作中我是如何制定配置文件的,这是个人习惯,在我在的项目组中目前要定义配置文件都安装这个步骤,效果还不错...

9720
来自专栏蓝天

GCC 4.7相对4.6.x的改进点

原文:http://www.iteye.com/news/24628 针对C的功能改进: 支持ISO C11标准中的更多特性。除了之前的-std=c1x...

8930
来自专栏腾讯NEXT学位

《Node.js在CLI下的工程化体系实践》成都OSC源创会分享总结

14320
来自专栏菜鸟致敬

【Lua菜鸟①】初识Lua

简介 Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 特性 轻...

42590
来自专栏逍遥剑客的游戏开发

GDC2015: Networking for Physics Programmers

30890
来自专栏轮子工厂

1. C语言的第一个程序

(。・∀・)ノ゙嗨!大家好,我是呆博~很开心可以在这里给大家分享我的 C 语言学习笔记~

22540
来自专栏我是攻城师

spark sql 快速体验调试小例子

37050
来自专栏老九学堂

【面试题】2018 年,百度 Java 后端面试题目!

本题目来自粉丝投稿推荐,答案不唯一,在这里只列题目,感兴趣的小伙伴可以在底部留言区交流。 百度一面 1、给一个函数,返回 0 和 1,概率为 p 和 1-p,请...

37930

扫码关注云+社区

领取腾讯云代金券