Libgo Versions Save

Go-style concurrency in C++11

v2.6

7 years ago

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.

v2.4-stable

7 years ago

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计时

v2.3

8 years ago

1.重构IO层的Hook代码,通过跟踪socket状态的方式优化掉额外的系统调用,IO性能再次提升30%左右 2.支持共享监听端口的多进程服务器的使用方式 3.增加一个接口set_connect_timeout, 可以设置connect的超时时间. 弥补原生syscall不能设置connect超时时间的缺憾.

v2.2

8 years ago

优化多线程模式下的性能

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

v2.1-beta

8 years ago

1.增加一个宏go_stack, 可以指定创建的协程的栈大小

    使用方法:
        go_stack(102400)  foo;

2.Channel的超时实现机制从轮询式改为使用定时器

3.release模式也生成调试信息

v2.0

8 years ago

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做持续集成、自动测试,保障代码可用性