Releases: yyzybb537/libgo
Releases · yyzybb537/libgo
libgo v2.6 released
v2.6是libgo的针对HTTP优化的版本,用于类似于HTTP这种半双工协议的场景下,性能相比上一个版本提升100%
主要变更
HOOK
- 增加安全signal的功能, 可以让signal在Run中触发, 编译时需使用参数 -DWITH_SAFE_SIGNAL=ON. 以此解决linux对signal里面调用的函数必须可重入的要求.
- Hook gethostbyname系列函数和gethostbyaddr系列函数,DNS解析阻塞也可以不阻塞线程了,具体实现依赖libcares. 编译时需使用参数 -DWITH_CARES=ON.
协程调度
- 优化协程切换响应速度, 100个协程频繁切换, 速度可达到1100万次/s
网络IO
- 默认使用ET模式,优化半双工协议场景的性能,提升100%
修复BUG
- 修复使用std::fstream时无法hook到close的bug.
libgo v2.4-stable released
v2.4-stable是libgo的第一个稳定版,经过了线上环境的大规模考验,也修复了很多线上测试过程中发现的bug。
目前有200多台linux服务器、600多个进程基于此版本7×24小时地运行着。
主要变更
协程调度
1.删除ENABLE_SHARED_STACK选项
2.多线程调度算法采用work-steal, 可以通过设置关闭
3.优化切换速度, 每秒切换次数达到千万级
4.增加go_dispatch, 创建协程时可以指定执行的线程
内存管理
1.增加一个栈内存malloc/free函数自定义的机制, 用户可以基于此做内存池优化、调试代码嵌入等事情.
2.修复协程function对象的析构在协程外执行的bug
网络IO
1.每个线程各使用一个epoll
定时器
1.定时器根据设置定时的参数不同, 使用system(受系统时间影响)和steady(不受系统时间影响)两种计时方式.
system_clock::time_point使用system计时
steady_clock::time_point和duration使用steady计时
libgo v2.3 released
1.重构IO层的Hook代码,通过跟踪socket状态的方式优化掉额外的系统调用,IO性能再次提升30%左右
2.支持共享监听端口的多进程服务器的使用方式
3.增加一个接口set_connect_timeout, 可以设置connect的超时时间. 弥补原生syscall不能设置connect超时时间的缺憾.
libgo v2.2 released
优化多线程模式下的性能
1.重新设计runnable列表的数据结构, 降低processer抓取coroutine的竞争
2.协程栈改为在创建协程时立即创建(ENABLE_SHARED_STACK模式除外)
3.重新设计delete列表的结构, 降低多线程竞争
4.重写bm.cpp性能测试代码
持续集成
1.travis-ci上增加两个版本的自动测试: ENABLE_BOOST_COROUTINE ENABLE_SHARED_STACK
2.持续集成测试环境改为Ubuntu14.04
libgo - v2.1 beta
1.增加一个宏go_stack, 可以指定创建的协程的栈大小
使用方法:
go_stack(102400) foo;
2.Channel的超时实现机制从轮询式改为使用定时器
3.release模式也生成调试信息
libgo - 2.0
1.完全支持Windows平台
支持Win7、Win8、Win10的x86和x64版本
2.提供更多的CMake编译选项
ENABLE_BOOST_COROUTINE
libgo在Linux系统上默认使用ucontext做协程上下文切换,开启此选项将使用boost.coroutine来替代ucontext.
使用方式:
$ cmake .. -DENABLE_BOOST_COROUTINE=1
ENABLE_SHARED_STACK
使用ucontext做协程上下文切换时可以开启此选项,开启后多个协程将共享使用同一个栈,
这个选项可以大概节约4倍的内存.
但是会有一定的副作用,参见下面的WARNNING第四条.
在使用ENABLE_BOOST_COROUTINE选项时, 此选项不可开启
使用方式:
$ cmake .. -DENABLE_SHARED_STACK=1
DISABLE_HOOK
禁止hook syscall,开启此选项后,网络io相关的syscall将恢复系统默认的行为,
协程中使用阻塞式网络io将可能真正阻塞线程,如无特殊需求请勿开启此选项.
使用方式:
$ cmake .. -DDISABLE_HOOK=1
3.减轻用户负担
默认编译参数下不再有协程栈上对象访问权限的限制
4.构建
libgo的源码、单元测试代码、性能测试代码全部使用CMake来构建
使用travis做持续集成、自动测试,保障代码可用性