今天听说了一个新的C++语言开发的网络框架,叫做seastar

seastar有何特别之处呢?先看看官网提供的性能数据:

性能

  • HTTPD benchmark:

    cpu # request/sec
    2 637,430(相当于单核性能318715/s )
    4 1,303,761
    6 1,907,912
    8 2,493,690
    12 3,495,012
    16 4,385,829
    20 5,359,786
    24 6,291,073
    28 6,826,827
    32 6,869,199

CPU Seastar Memcached with DPDK Stock Memcached (multi process) Stock memcached (multi threaded)
2 553,175(单核性能276587/s) 350,844 321,287
4 1,021,918 615,270 573,149
6 1,703,790 857,428 709,502
8 2,149,162 1,102,417 741,356
10 2,629,885 1,335,069 608,014
12 2,870,919 1,528,598 608,968
14 3,217,044 1,726,642 440,658
16 3,460,167 1,887,060 603,479
18 4,049,397 2,167,573 902,192
20 4,426,457 2,281,064 1,128,469

网络框架单核的极限性能我做过很多次,我几年前测试得到的数据大约是:

  • http网络服务,单核极限性能7万~9万/s
  • tcp协议网络服务,单核极限性能21万~24万/s

以上的测试是简单的echo服务,没有任何业务逻辑。TCP服务更是简单,每个请求仅50字节。

在seastar框架中,http协议的单核处理能力上涨了约4.5倍。这虽然让人欣喜,但并不惊奇。令人惊奇的地方在于,框架的处理性能随着核数的增加而线性增加!

通常而言,随着操作系统和业务的复杂性,网络框架的处理性能并不会因为核数线性增加,应该类似于对数曲线的效果:

而从官方测试数据看,几乎是达到了线性增长的效果。如果是使用现在的上百核的服务器,单机性能超过千万每秒是毫无疑问的。

单机网络处理性能超过千万每秒,这就是我激动的原因。

C10K问题与C10M问题

这时就要谈起高性能网络服务器的两个经典问题,称为C10K问题和C10M问题。

  • C10K就是指单机网络处理性能达到1万/每秒的并发处理能力
  • C10M指单机网络处理性能达到1000万/每秒的并发处理能力

The C10K problem 由 Dan Kegel 于2003/11/03 提出。在当时的硬件水平和操作系统能力上,单机支持1万并发是很有难度的事情。由这个问题开始,催生了epoll为核心网络编程技术的推广。

The C10M problem 由 Robert Graham 于2013/02提出。十年过去了,硬件、网络、操作系统都有大幅的提升,如何做到单机1000万并发呢?当时讨论的可行方案是多队列网卡+多核IO+用户态协议栈。后来,intel放出了DPDK这个网络包处理的神器,陆续开始有团队基于DPDK挑战C10M的具体实现。

而今,seastar出现了,这就意味着后台程序员可以以很低的门槛轻松写出具备C10M性能的网络服务!!!令人惊叹。

seastar的牛叉之处

对于其内部理念的介绍,我推荐阅读这篇:《Seastar:多核机器上编写高效复杂的服务器应用程序的 C++ 库》

通过官方文档可以了解到这些特性:

  1. 底层包处理的API不是epoll,而是DPDK

    有了DPDK,网卡中的包直接被传输到用户空间的buffer中,免去了内核协议栈的层层处理。当然这里还需要一个用户态的协议栈,使得可以以更少的内存和更小CPU消耗来处理大量的网络包。

    DPDK的使用门槛还是比较高的,而seastar已经把这个神器封装在了框架之中,实在是皆大欢喜。

  2. 无共享设计

    这也就是网络框架处理性能随着核数增加而增加的秘诀。

    首先,处理上是多核IO的,充分发挥出了服务器的IO能力;

    其次,各个核的处理逻辑独立,减少了操作系统调度和NUMA结构的影响;

    就算各个核之间需要通讯,seastar也提供了很好的通讯机制来避免加锁。

  3. 充分利用了C++语言的新特性

    高性能的网络框架毫无疑问应该设计成纯异步非阻塞的。但是异步代码难写难调试,开发周期太长。seastart利用了Futures and promises这样的C++语言特性,使得代码可以同步编写异步执行,降低了心智负担,又不会带来性能的损失。

seastar会带来什么改变

我认为seastar并不仅仅只是又一个网络框架的轮子而已,它的出现将会改变一些领域的玩法:

  1. 倍数的性能提升,以及可以随着核数增加而线性增加的性能,使得很多不得不依赖分布式解决的问题可以依赖单机解决,并且获得更高的吞吐量和更低的成本。特别是纯网络服务一类的应用,例如DNS POD分享的经验,之前做了很多分布式的方案来解决大量域名托管的问题,后来硬件水平上去了就可以简单粗暴的单机解决。

    典型的应用有:NTP服务,DNS服务,cache服务,内存数据库等。seastar能够让这类服务的硬件成本缩减数倍。
  2. 云上的微服务,其通讯不再使用TCP/IP了,而是有特定的系统调用来专门发给特定的类似seastar写成的服务进程。让微服务的开发更简单,又能充分榨干网络服务器的性能。
  3. 在高带宽低延迟的场景,seastar能够让团队快速开发出满足要求的应用。典型的是实时音视频传输的场景,流量又大,对延迟又敏感,传统的nginx一类的网络服务框架,在seastar面前黯然失色。

对这个框架也有一些期待:

  1. 希望尽快有rust语言的版本,系统编程领域,rust才是未来;
  2. 希望有支持seastar框架的容器环境;(毕竟DPDK不是操作系统内置的协议栈)

希望这个发现对你也有用,have fun

今天太开心了,因为我知道了seastar框架的更多相关文章

  1. 感悟:搞了整整一天,拯救一个Ubuntu系统

    最开始,我在windows平台上,准备打开计算机组成原理的实验工程,突然来了一个想法:每次要用windows的时候,都要切换系统(win8以上的系统必须在关闭快速开机的状态下才能正常在Linux平台下 ...

  2. R语言爬虫初尝试-基于RVEST包学习

    注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧.. 最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://w ...

  3. 我与A协

    大学毕业以后发现离曾经的圈子越来越远,非常怀念原来在A协和大家一起奋斗的日子,在这里写一篇文章,献给有很多美好回忆的A协,也献给渐渐远离A协的我. 首先,回顾一下我为什么会参与到A协的建设工作中来.我 ...

  4. Android drawable微技巧

    家都知道,在Android项目当中,drawable文件夹都是用来放置图片资源的,不管是jpg.png.还是9.png,都可以放在这里.除此之外,还有像selector这样的xml文件也是可以放在dr ...

  5. U盘快捷方式中毒处理办法

    这是网上某位大神的,对于我这个U盘总中毒的人真的很好用,太开心啦啦 http://blog.csdn.net/jzwong/article/details/51002568

  6. Windows Phone 8下 友盟社会化组件SDK的使用。

    由于项目的需要,要将友盟的社会化组件SDK由0.9更新至2.0. 版本变化比较大. 1.很多类以及命名空间已经取消了. 如UmengSocialSDK.Net.Request命名空间, UmengSo ...

  7. Python 程序如何高效地调试?

    作者:Rui L链接:https://www.zhihu.com/question/21572891/answer/26046582来源:知乎著作权归作者所有,转载请联系作者获得授权. 这个要怒答一发 ...

  8. JS魔法堂:浏览器模式和文档模式怎么玩?

    一.前言 从IE8开始引入了文档兼容模式的概念,作为开发人员的我们可以在开发人员工具中通过“浏览器模式”和“文档模式”(IE11开始改为“浏览器模式”改成更贴切的“用户代理字符串”)品味一番,它的出现 ...

  9. 个人总结 HTML+CSS

    从大一下学期接触,一直到今年,接触的时间也挺长的了,最近一些认识的盆友和同学说是想学习前端,自己也开始慢慢停下脚步,不再拼命地去学很多框架的东西,回归到基础,慢慢把基础打牢 很多知识碎片一直来不及整理 ...

随机推荐

  1. Python 属性方法、类方法、静态方法、 特殊属性__doc__ (内建属性)

    总结:和类的关联性讲:属性方法>类方法>静态方法 属性方法@property:仅仅是调用方式不用+括号. 类方法@classmethod:访问不了累的属性变量,只可以访问类变量. 静态方法 ...

  2. response 返回js的alert()语句,中文乱码如何解决

    response 返回js的alert()语句,中文乱码如何解决, 步骤1:在后台加上如下代码: response.setCharacterEncoding("utf-8"); r ...

  3. 关于编写c++动态库常用的定义

    1. 关于 1.1 最近一段时间,写了不少动态库,慢慢的也积累了东西. 1.2 之前一直做Windows的动态库,没有做过Linux和OS X的动态库,太缺乏经验了: 代码缺乏 编译器支持的判断.缺乏 ...

  4. 【LeetCode】412. Fizz Buzz 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目大意 解题方法 方法一:遍历判断 方法二:字符串相加 方法三:字典 日期 [L ...

  5. 【LeetCode】1037. Valid Boomerang 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 中学数学题 日期 题目地址:https://leet ...

  6. 【LeetCode】459. Repeated Substring Pattern 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历子串 日期 [LeetCode] 题目地址:ht ...

  7. 【LeetCode】837. New 21 Game 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 相似题目 参考资料 日期 题目地址:htt ...

  8. LeetCode118. Pascal's Triangle 杨辉三角

    题目 给定行数,生成对应的杨辉三角 思考 同一行是对称的,最大的下标为(行数+1)/2;1,1,2,3,6;下标从0开始,则对应分别为0.0.1.1.2.2 对于第偶数行,个数也是偶数,对于奇数行,个 ...

  9. uniapp动态修改导航栏

    1.修改导航栏buttons 如图动态修改角标 <template> <view> </view> </template> <script> ...

  10. JSP、JSTL标签、EL表达式

    JSP.JSTL标签.EL表达式 1.EL表达式:${} 功能: 获取数据 执行运算 获取web开发的常用对象 2.JSP标签 例如: jsp标签还有很多功能,这里只列举出一种. <jsp:fo ...