爱上开源之网络通信库boot4go-fastnet,简单而不乏高能

58 篇文章 5 订阅
20 篇文章 0 订阅

准备在物联网中间件这块做一些创新的产品, 故先提前准备了剥离出以后自己御用的底层tcp通讯的网络库boot4go-fastnet。

boot4go-fastnet项目简单,主要代码大小不足20K,但是性能不输其他的网络库。 boot4go-fastnet对网络通讯的优化思想的灵感主要是来自于另一个高性能的http服务fasthttp。 只是fasthttp仅仅只是提供了http的通信实现,并没有在tcp层次上进行实现,在做中间件的过程中,很多的服务都是通过tcp或者端口通信实现的,所以必须要有一个tcp的通讯底层的网络库,对比了网上相对来说比较有名的epoll,gnet,go-netty等项目,其中epoll,gnet都是类似于redis的多路复用的实现方式,在网络通信的方式上,采取了nio的方式来实现,在看etcd等代码的时候,都没有看到其使用类似的方式,其实go的协程方式,已经非常好的解决了以前bio的弊端,之所以有nio出现,主要是在以往的bio方式中,都有一个线程对于去处理监听得到的连接, 线程的维护开销较大,在大量的长连接的情况下,会导致系统的开销非常的吃紧,这才有了nio的模型,但是在go里,其中的协程对于大量多并发的情况处理,没有线程这样的重,在看看redis的io模型,redis的之所以性能优秀,多路复用是其我们都知道的,但是要知道首先redis是单线程处理,这样他的多路复用才真正的有意义,另外,redis的快,还有个关键点,就是内存复制这块,零拷贝机制,这也是一个非常的关键点,最后一点,redis是基于内存的操作,通过RDB和AOF结合方式,尽可能减小磁盘写对性能的影响,综合以上,才有了redis的高性能,所以如果一味的说nio就能有网络高性能,就是一叶障目,目光短浅了。  正是有这样的怀疑,所以还是先压数据测性能先, 自己就写了个简单的网络通信库,按照fasthttp的思想,进行以下的优化点实现

1. 引入协程池,将协程的开销进一步压缩

2. 内存复用, 缓存池,对象均使用对象池的实现,进一步减小内存分配和Gc的开销

3.  零拷贝,这里并不是真正的零拷贝,只是通过bytebuffer仅可能的减少不必要的内存拷贝。

看看fastnet和Epoll的PK结果。

两者都在我的机器上,在并发数2000的时候,数据意义比较大,超过2000的时候,会有一些jmeter的报错,数据失真,数据包使用的是不到1k的小包

直接上结果:

fastnet

 

 

Epoll

 

 

原生的golang的net库实现,比较差,并发2000的情况下,jmeter容易报错,1000的情况下,数据才有意义

2000的数据

 

 1000的情况

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inthirties

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值