今天听说了一个新的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. 【LeetCode】111. Minimum Depth of Binary Tree 解题报告(Python)

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

  2. leetcode5225最大相等频率

    题目 正整数数组nums,找到满足条件的最长前缀,返回其长度.该前缀满足:删除一个元素后,剩下的每个数字出现的次数相同. ps:如果删除后没有元素存在,也可以认为每个数字有相同的次数. 数组长度:[2 ...

  3. github项目托管方式(看项目自身是否自带有 .git)

    一.本地仓库和远程仓库建立联系 方式一:项目自身带有 .git文件的[自身就是一个本地仓库的](这里咱以vue-cli3项目为例) 1.创建自带.git本地仓库:创建一个叫 my-vue 的项目 2. ...

  4. Histogram Processing

    目录 HISTOGRAM EQUALIZATION 代码示例 HISTOGRAM MATCHING (SPECIFICATION) 其它 Gonzalez R. C. and Woods R. E. ...

  5. The Expressive Power of Neural Networks: A View from the Width

    目录 概 主要内容 定理1 定理2 定理3 定理4 定理1的证明 Lu Z, Pu H, Wang F, et al. The expressive power of neural networks: ...

  6. vue项目报错如下:(Emitted value instead of an instance of Error)

    (Emitted value instead of an instance of Error) the "scope" attribute for scoped slots hav ...

  7. CS5213高性价比替代AG6200芯片|兼容台湾AG6200芯片|CS5213Capstone

    CS5213是一款HDMI转VGA带音频信号转出的芯片方案,CS5213支持HDCP协议,且外围电路比台湾安格AG6200要少,且本身CS5213芯片成本比AG6200要低,整个方案设计简单性价比较高 ...

  8. 剖析Defi之Uinswap_0

    Uniswap是什么,不需要讲了吧.YYDS(永远嘀神) 介绍几个概念: 恒定乘积算法:可以简单看作X * Y = K,这里K(乘积)保持不变,所以叫恒定乘积算法,该函数是一个反曲线. 自动流动性协议 ...

  9. 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具

    查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...

  10. 云南农职 - 互联网技术学院 - 美和易思大一SCME JAVA高级结业考试机试试题

    目录 一.语言和环境 二.实现功能 1.文件复制功能(IO) 2.消息接受站建设 三.评分标准 四.实现代码 一.语言和环境 实现语言:Java. 开发工具:eclipse. 使用技术:IO流+网络编 ...