[NIO]从300万到700万——dawn的协程优化

dawn的协程库,使用的是kilim,不过已经远非kilim的原有代码,主要保留了协程的两个基本原语,再往上层,已经全部被替换了。

协程库,我学习过boost asio中的协程,也在我的机器上测试过单纯上下文切换的速度。这个速度在不同的机器之间没有可比性,因为彼此的cpu可能不同。但是在同一台机器上的不同库的对比,具有一定的参照性。

我记得,当时asio协程单线程情况下,协程切换的最高持续吞吐量大概是400万次每秒。

我当时是准备使用kilim,所以在同一时间也测试了kilim,我记得当时测试出来的持续吞吐量大约是260万次左右,当时稍微有点失望,不过拿asio参考的话,也达到了50%以上,所以,也就采用了kilim。

在前一段时间写dawn的时候,我专门优化过协程这块,最开始用的是红黑树做的定时器,跑的最大持续吞吐量大概是360-380万每秒。我怀疑是红黑树在不稳定的情况下发生了过多的翻转,导致了额外的开销。

于是,第二天,写了一个时间轮,换上去之后,不停的调整参数,测试吞吐量,发现还是380万左右。无论怎么调,都上不去。用jprofiler检测,看不出来明显的毛病,当时给我的感觉就是慢在内存的访问上,因为我的时间轮的每个tick用的都是链表。我下意思里觉得是慢在这,不过这已经是最简单的链表了,还能怎么优化?

就这样,我暂停了优化,全部精力投入了工作以及dawn的完善以及bug修改。

两周后的今天,早上醒来后,我躺在床上,就瞎琢磨了一下,就想到了这个问题,突然想,如果把tick上的链表换成循环队列呢?试试,立马起床,写了一个循环队列,为了避免循环队列溢出,我在循环队列的内部加上了链表,把超出循环队列容量的元素放入链表。我把循环队列的大小开到了10万。用循环队列代替了链表,开启测试用例,这次居然能跑到560万次每秒了,说明思路对了。我就调了调参数,大概把循环队列的大小设置为5万的时候,平衡性最好,吞吐量大约是600万每秒。看看时间,也写了将近一个小时了,于是我又躺着看了会新闻。

觉得这个循环队列+链表的方式还不够好,因为循环队列满的时候会启用链表,加大了开销,反而会在繁忙的时候降低吞吐量。如果只用循环队列而不用链表,又怕会溢出。突然,我想到,如果把链表的每个节点扩大点扩展成数组,不就结了。

立马动手,写了一个LinkedArrayList,数组链表,这样就不怕溢出了,也会保持很高的性能。换掉刚才的循环队列,运行测试用例,不出意外,第一次就跑到了600多万,经过10多分钟的参数调整,最后,把数组长度定为5000,单个线程,20万协程,协程上下文切换达到700多万次每秒。

达到这个速度,还是很超出我的预期的,我最开始觉得能到500多万就满足了,最终到了700多万。

于是我又测试了一下定时任务,竟然执行了到了1100万次每秒,以往最好的历史记录大约是900多万,这足以说明,这次改进降低了协程调度的成本。

其实调度速度的快慢并没有决定意义,但是,这可以给上层应用一个更好的基础,让出更多的cpu资源给应用程序,或者是让应用可以使用更多的协程,让系统繁忙的时候运行的更有效率。

好吧,先调到这里吧,到这里,已经暂时达到我现有水平的极限了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 09:21:32

[NIO]从300万到700万——dawn的协程优化的相关文章

【转载】5年内从3500元到700万的过程,有爱情、有奋斗、有。。。泪水

穷人总是担心创业失败,又失去了现有的稳定的收入,落得个俗话说的偷鸡不成蚀把米.所谓的稳定收入是很多人行动的障碍,犹如人生的鸡肋,说到底还是反映比较缺乏自信.对绝大多数人来说,靠薪水永远只能满足生活的基本要求.老板之所以雇你,不是要让你发大财的,也不是要和你共同富裕,如果他挖不出价值,雇你等于零.所以最终,要创造自己的幸福,还得靠你自己.所以该做的时候找到机会就做吧.... 奋斗5年 从月薪3500到700万! 偶的忠告:要想学点什么,首先学会有耐心 阅读准备:眼药水+眼镜+耐心+一颗平淡的心 来

QQ营销经典案例,给家具业务员的一堂课 (三个月实现月销1万到100万的蜕变)

价值8000元的给家具业务员的一堂课 (三个月实现月销1万到100万的蜕变) 大家好!先给大家分享个我身边的故事.我有个朋友,姓刘,我称他老刘,据说以前从事过很多行业的销售,单我知道的他做过:节能灯销售.太阳能热水器销售,卫浴销售,至于他还有没有做其它行业的销售我就不知道了,我经常给他开玩笑,老刘360行都快做一遍了吧. 作为一个销售员,为什么如此频繁换行业呢!我给他的分析是这样的, 1:是做不出成绩,没成绩肯定挣不到钱.结果不是被领导辞掉,就是自己不好意思再做了. 2:做事情没有恒心,听风就是

只有700万人的香港!为什么支付宝和微信都如此看重?

话说,支付宝和微信支付在中国内地的支付大战还在如火如荼地展开,没想到又将战火"烧到"了中国香港.而就目前来看,很显然支付宝和微信支付对香港也都是势在必得的.据悉,腾讯的子公司WeChat Pay HK注册用户数在今年2月激增了44%--主要是烧钱太厉害了,据说营销.补贴成本可能达3500万港元. 比如就在2月份WeChat Pay HK对麦当劳每餐超过25港元的订单提供10港元补贴.此外,春节红包也在香港显现威力--WeChat Pay HK共发放价值约1000万港元的红包.而支付宝也

当你有700万的时候 你就会获得快乐

努力去挣700万吧 至少也要挣到350万 因为这样可以在望京买一套100平米的大房子 如果一个月能存一万 一年是12万 10年才120万 如果一个月能存两万 一年是24万 10年是240万 30年就可以买房了 如果一个月能存三万 一年是36万 10年是360万 20年就可以买房了 想要舒适无忧无忧虑的生活至少也要能月存2-3万 人的一天只有24个小时,睡觉至少要有8个小时(否则状态会差 剩下的16个小时 希望不要把超过1个小时放在上下班公司的路上 那么下面,第一个目标就是在明年时候内能做到月存一

Stackful 协程库 libgo(单机100万协程)

libgo 是一个使用 C++ 编写的协作式调度的stackful协程库, 同时也是一个强大的并行编程库. 设计之初是为高并发分布式Linux服务端程序开发提供底层框架支持,可以让链接进程序的同步的第三方库变为异步库,不影响逻辑的前提下提升其性能. 目前支持两个平台: Linux (GCC 4.8+) Windows (Win7.Win8.Win10 x86 and x64 使用VS2013/2015编译) 使用libgo编写并行程序,即可以像golang一样开发迅速且逻辑简洁,又有C++原生的

从10万到1000万:如何让App的用户数快速增长

简要:本文为移动互联网李建华在<人人都是产品经理>微信群做的一次经验分享,文章主要写的是当你的用户数已经有10万或者几十万的时候,如何通过一些高端的战略和战术的方法,让你的App用户数增长至千万甚至上亿,文章所写内容根据作者自身的实战推广经验而成,不具有绝对性,可以为一些做App推广的朋友提供参考和借鉴. 一.知己:如何对自己.对市场进行分析,有10万的用户,已经算是完成了一个从0到1的过程,现在市场和自己的产品都会有变化,这个时候,该如何对自己分析? 老是写干货,快写光了,没有办法我是个实在

一枚价值700万的

http://v.qq.com/page/a/f/z/k0414xw7v0f.html http://v.qq.com/page/a/f/z/k0414xw7v0f.html http://v.qq.com/page/a/f/z/k0414y3nv9n.html http://v.qq.com/page/a/f/z/k0414yg0qhk.html http://v.qq.com/page/a/f/z/k0414yg0qhk.html http://v.qq.com/page/a/f/z/k04

Hbase万亿级存储性能优化总结

hbase主集群在生产环境已稳定运行有1年半时间,最大的单表region数已达7200多个,每天新增入库量就有百亿条,对hbase的认识经历了懵懂到熟的过程.为了应对业务数据的压力,hbase入库也由最初的单机多线程升级为有容灾机制的分布式入库,为及早发现集群中的问题,还开发了一套对hbase集群服务和应用全面监控的报警系统.总结下hbase优化(针对0.94版本)方面的一些经验也算对这两年hbase工作的一个描述. 服务端 1.hbase.regionserver.handler.count:

mysql数据库3600万测试数据生成方法及优化测试

为公司项目优化调整,需要大容量数据表做测试,测试过程发现了很多有趣的东西,这里一并发出来. 本次测试为myISAM表的大容量数据查询优化所做的测试数据,在测试过程中使用了merge分表,每张表1800万数据,对程序来说,分表操作被包装起来,程序操作如同是同一张表,测试结果较为满意,各位看官可以使用本方法的命令行运行来生成测试数据,也可以借鉴merge分表来拆分大容量数据. 测试数据表准备 CREATE TABLE `time_1` ( `id` bigint(20) NOT NULL AUTO_