OWenT's blog
  • Introduction
  • About Me
  • 2020
    • 近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)
    • xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
    • 在游戏服务器中使用分布式事务
    • libcopp接入C++20 Coroutine和一些过渡期的设计
    • libatbus 的大幅优化
    • nftables初体验
    • 容器配置开发环境小计
  • 2019
    • PALM Tree - 适合多核并发架构的B+树 - 论文阅读小记
    • 跨平台协程库 - libcopp 简介
    • C++20 Coroutine 性能测试 (附带和libcopp/libco/libgo/goroutine/linux ucontext对比)
    • 尝鲜Github Action
    • 一些xresloader(转表工具)的改进
    • protobuf、flatbuffer、msgpack 针对小数据包的简单对比
    • 协程框架(libcopp) 小幅优化
    • Excel转表工具(xresloader) 增加protobuf插件功能和集成 UnrealEngine 支持
    • Anna(支持任意扩展和超高性能的KV数据库系统)阅读笔记
    • C++20 Coroutine
    • libcopp merge boost.context 1.69.0
    • Google去中心化分布式系统论文三件套(Percolator、Spanner、F1)读后感
    • Rust玩具-企业微信机器人通用服务
  • 2018
    • 使用ELK辅助监控开发测试环境服务质量和问题定位
    • Webpack+vue+boostrap+ejs构建Web版GM工具
    • 2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现
    • Rust的第二次接触-写个小服务器程序
    • 理解和适配AEAD加密套件
    • atsf4g-co的进化:协程框架v2、对象路由系统和一些其他细节优化
    • 协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比
    • 可执行文件压缩
    • 初识Rust
    • 使用restructedtext编写xresloader文档
    • atframework的etcd模块化重构
    • C++的backtrace
  • 2017
    • ECDH椭圆双曲线(比DH快10倍的密钥交换)算法简介和封装
    • protobuf-net的动态Message实现
    • pbc的proto3接入
    • atgateway内置协议流程优化-加密、算法协商和ECDH
    • 整理一波软件源镜像同步工具+DevOps工具
    • Blog切换到Hugo
    • libcopp v2的第一波优化完成
    • libcopp(v2) vs goroutine性能测试
    • libcopp的线程安全、栈池和merge boost.context 1.64.0
    • GCC 7和LLVM+Clang+libc++abi 4.0的构建脚本
    • libatbus的几个藏得很深的bug
    • 用cmake交叉编译到iOS和Android
    • 开源项目得一些小维护
    • atapp的c binding和c#适配
    • 对象路由系统设计
    • 2016年总结
    • 近期的一个协程流程BUG
  • 2016
    • 重写了llvm+clang+libc++和libc++abi的构建脚本
    • atsf4g完整游戏工程示例
    • atframework基本框架已经完成
    • 游戏服务器的不停服更新
    • 对atbus的小数据包的优化
    • Android和IOS的TLS问题
    • pbc的一个陈年老BUG
    • boost.context-1.61版本的设计模型变化
    • 接入letsencrypt+全面启用HTTP/2
    • 理解Raft算法
    • libatbus基本功能及单元测试终于写完啦
    • 博客文章和文档迁移到gitbook
  • 2015
    • 博客文章和文档迁移到gitbook
    • 给客户端写得LRU缓存
    • 近期活动比较零散
    • 关于BUS通信系统的一些思考(三)
    • 针对Java JIT的优化(转表工具:xresloader)
    • libcopp更新 (merge boost 1.59 context)
    • 小记最近踩得两个C++坑
    • Redis全异步(HA)Driver设计稿
    • Vim常用命令
    • 关于firewalld和systemd的一些命令速记
    • Jenkins(hudson)插件记录
    • 我们的Lua类绑定机制
    • LLVM+Clang+Libcxx+Libcxxabi(3.6)工具链编译(完成自举编译)
    • 回顾2014
    • Android NDK undefined reference to ___tls_get_addr 错误
    • gitlab腾讯企业邮箱配置
  • 2014
    • 回顾2013
    • C++11动态模板参数和type_traits
    • C++又一坑:动态链接库中的全局变量
    • tolua++内存释放坑
    • [转]类似github的框架
    • Lua性能分析
    • 集成Qt Webkit 到cocos2d-x
    • Gitlab环境搭建小计
    • 近期研究VPN的一些记录(OpenVPN,pptp,l2tp)
    • LLVM + Clang + Libcxx + Libcxxabi 工具链编译
    • 关于BUS通信系统的一些思考(二)
    • 关于BUS通信系统的一些思考(一)
    • [libiniloader] Project
    • 记录一些在线编辑器
    • [WP Code Highlight.js] Project
    • 再议 C++ 11 Lambda表达式
    • 基于Chrome插件的开发工具链
    • [ACM] HDU 1006 解题报告
    • Linux 编译安装 GCC 4.9
    • 又碰到了这个解谜游戏,顺带记下地址
    • 简单C++单元测试框架(支持一键切到GTest或Boost.Test)
    • 捣鼓一个协程库
  • 2013
    • std和boost的function与bind实现剖析
    • 不知道是哪一年的腾讯马拉松题目 照片评级 解题报告
    • Lua 挺好用的样子
    • VC和GCC成员函数指针实现的研究(三)
    • VC和GCC成员函数指针实现的研究(二)
    • VC和GCC内成员函数指针实现的研究(一)
    • 一个C++关于成员变量偏移地址的小Trick
    • ptmalloc,tcmalloc和jemalloc内存分配策略研究
    • POJ 2192 Zipper HDU 2059 龟兔赛跑
    • 从Javascript到Typescript到Node.js
    • 网络编程小结
    • 试试Boost.Asio
    • Lnmp yum 安装脚本 (for CentOS)
    • ARM 交叉编译环境搭建
    • Linux 编译安装 GCC 4.8
    • [记录]虚拟硬盘的压缩|磁盘写零
  • 2012
    • Boost.Spirit 初体验
    • “C++的90个坑”-阅读笔记
    • AC自动机
    • C++ 标准过渡期
    • 程序员修炼之道 -- 阅读笔记
    • [转载]狼与哈士奇
    • C++ 新特性学习(八) — 原子操作和多线程库[多工内存模型]
    • C++ 新特性学习(七) — 右值引用
    • 理解Protobuf的数据编码规则
    • 忆往昔ECUST的ACM时代
    • Linux编译安装GCC 4.7
    • JSON显示库 -- showJson (Javascript)
    • C++ 新特性学习(六) — 新的字符串编码和伪随机数
    • C++ 新特性学习(五) — 引用包装、元编程的类型属性和计算函数对象返回类型
    • C++ 新特性学习(四) — Bind和Function
  • 2011
    • C++ 新特性学习(三) — Regex库
    • C++ 新特性学习(二) -- Array、Tuple和Hash库
    • C++ 新特性学习(一) -- 概述+智能指针(smart_ptr)
    • Linux 和 Windows PowerShell 常用工具/命令 记录
    • 非常帅气的Linq to sql
    • 2011 Google Code Jam 小记
    • C++总是很神奇
    • 大学生创新项目[国家级]经费使用记录
    • 常用官方文档整理
    • 我们学校的IPV6很不错嘛
  • 2010
    • 线段树相关问题 (引用 PKU POJ题目) 整理
    • 2010 ACM 赛前笔记
    • POJ PKU 2596 Dice Stacking 解题报告
    • POJ PKU 3631 Cuckoo Hashing 解题报告
    • POJ PKU 1065 Wooden Sticks 3636 Nested Dolls 解题报告
    • HDU 3336 Count the string 解题报告
    • Hash模板 个人模板
    • ZOJ 3309 Search New Posts 解题报告
    • POJ PKU Let's Go to the Movies 解题报告
    • 注册表常用键值意义
    • PKU POJ 1724 ROADS 解题报告
    • 《神奇古今秘方集锦》&《民间秘术大全》
    • PKU POJ 1720 SQUARES 解题报告
    • POJ PKU 2155 Matrix 解题报告
    • PKU POJ 1141 Brackets Sequence 解题报告
    • PKU POJ 2728 Desert King 解题报告
    • PKU POJ 2976 Dropping tests 解题报告
    • PKU POJ 3757 Simple Distributed storage system 解题报告
    • GCD Determinant 解题报告
    • Southeastern European 2008 Sky Code 解题报告
    • HDU HDOJ 3400 Line belt 解题报告
    • 线性筛法求质数(素数)表 及其原理
    • HDU HDOJ 3398 String 解题报告
    • 树状数组模块(个人模板)
    • 浙江理工 省赛总结 team62 By OWenT of Coeus
    • POJ PKU 3659 Cell Phone Network 解题报告
    • USACO 2008 March Gold Cow Jogging 解题报告
    • C#格式化输出(记录)
    • 参加有道难题笔记
    • POJ PKU 2446 Chessboard 解题报告
    • POJ PKU 1986 Distance Queries 解题报告
    • 计算几何算法概览[转载]
    • 关于差分约束(转载)
    • POJ PKU 2826 An Easy Problem?! 解题报告
    • 数论模板(个人模板)
    • 简易四则运算(ACM个人模板)
    • Catalan 数
    • The 35th ACM/ICPC Asia Regional Tianjin Site —— Online Contest 1009 Convex 解题报告
    • JQuery扩展插件--提示信息
    • ACM 计算几何 个人模板
    • 解析网站字符串型参数 Javascript QueryString 操作 TQueryString类
    • POJ PKU 1474 Video Surveillance 解题报告
  • 2009
    • 模式匹配(kmp)个人模板
    • 并查集 模板
    • POJ 3267 The Cow Lexicon 解题报告
    • C/C++语言常用排序算法
    • POJ 2606 Rabbit hunt 2780 Linearity 1118 Lining Up 解题报告
    • 打造最快的Hash表(转) [以暴雪的游戏的Hash为例]
    • ECUST 09年 校赛个人赛第六,七场总结
    • ECUST 09年 校赛个人赛第三场部分解题报告(A,D,F,I)
    • 牛顿迭代解方程 ax^3+bX^2+cx+d=0
    • 09年8月9日 ECUST ACM 练习赛总结
    • 连接最多点直线 (OWenT 个人模板)
    • 点到直线距离 和 线段间最短距离 (OWenT 模板)
    • ECUST 09年 校赛个人训练赛第五场总结
    • ECUST 09年 校赛个人赛第八场(最后一场)总结
    • 09年8月14日 ECUST ACM 练习赛总结
    • 矩阵相关 (增强中)
    • Prime最小生成树(个人模板)
    • 最长单调子序列 复杂度nlog(n)
    • POJ PKU 2549 Sumsets 解题报告
    • POJ PKU 3277 City Horizon 解题报告
    • 我的ACM生涯
    • POJ PKU 2528 Mayor's posters 解题报告
    • POJ PKU 2378 Tree Cutting 解题报告
    • POJ PKU 1990 MooFest 解题报告
Powered by GitBook
On this page
  • 重构工程配置脚本
  • 符号隐藏和DLL导出
  • 移除msgpack
  • 支持使用字符串路径的共享内存通道
  • 增加协议跨版本向前向后兼容管理,增加简单的验证功能
  • 支持多个自定义子网
  • 其他细节优化
  • 未来计划

Was this helpful?

  1. 2020

libatbus 的大幅优化

author: owent categories:

  • Article

  • Blablabla

    date: 2020-04-16 20:51:58

    draft: false

    id: 2003

    tags:

    tags:

  • atframework

  • atbus

  • libatbus

  • bus

  • connection

  • async

  • tree

  • flatbuffers

    title: libatbus 的大幅优化

    type: post

重构工程配置脚本

符号隐藏和DLL导出

支持使用字符串路径的共享内存通道

现在支持字符串路径的共享内存(使用: shm_open/ftruncate/mmap/munmap/shm_unlink/close/fstat 来管理),支持字符串命名的共享内存(长度限定为NAME_MAX(255))。但是posix标准里这个路径是不能有子目录的,所以新版本版本的glibc里也不允许(一些老版本的glibc允许)。另外linux下英文功能内存会放 tmpfs 的目录 /dev/shm 里,可以建立子目录。但是为了统一跨平台兼容性,我还是没有支持多级目录的。另外这个长度也受glibc库的限制,所以我设置了按NAME_MAX的长度。

增加协议跨版本向前向后兼容管理,增加简单的验证功能

这主要是考虑到后续如果同时多个业务使用或者多个环境使用的时候可能更新有先后。然后如果又不兼容的版本,集群之间可以互相不主动连接,以防不断地尝试重连然后断开。另外增加共享内存通道的版本号检查和架构校验,也是防止共享内存通道如果版本不兼容,随意attach上去可能会破坏数据。atproxy已经接入了这个特性。

额外增加了一个简单的验证功能,这是为了防止多个项目使用的时候误操作,发送了指令到别的业务(如果互通的话)。并不提供严谨的安全机制。

支持多个自定义子网

其他细节优化

还有一些其他细节优化列举如下:

  1. 增加连接层错误计数,超出容忍值直接断开连接

  2. 增加大量错误流程的单元测试,优化Unix Sock的单元测试,以支持WSL2

  3. 规范版本号规则:第一位变化表示有向前不兼容的变更;第二位表示有功能增加,向前兼容,第三位表示BUG修复和优化

  4. 更换数据回包的回调名字。

    最早的想法是仅失败的时候回包通知,但是后来为了适应有些需求需要尽快知道是否发送成功,所以加了强制回包功能。所以现在的数据转发回包不仅仅是错误处理了,叫on_fail也不合适。所以改成了on_receive_response

不打算支持 protobuf 2.X 了, protobuf 2.X 的最后一个版本到现在已经快5年了,而且proto3的支持现在也已经很完善了。所以我并没有测试protobuf 2.6的兼容性。

未来计划

  1. endpoint 离线后保留一段时间,如果期间重连成功了自动重发

  2. 增加data sequence,事件去重和切换节点的sequence重置

  3. 共享endpoint的写缓冲区(也许后面可以一句这个支持多路并行发包)

  4. 重发消息的超时机制,增加不确定是否成功的错误码

  5. 兄弟节点离线后自动重连几次

  6. 增加endpoint尝试轮询连接数据通道,减少不必要的数据通道,仅保留最快的方式。

Previouslibcopp接入C++20 Coroutine和一些过渡期的设计Nextnftables初体验

Last updated 5 years ago

Was this helpful?

最近零碎的事太多了,拖了好久没写blog。一些小的碎片话的东西也不值得写,另一方面是这次大幅优化了 的一些流程细节,特别是针对我们这两年来业务的需求,对 进行了一次大重构。这里记录一下重构的内容吧。

为了拥抱Modern CMake,我对 中所有的项目(当然也包含 )进行了重构,主要是一方面重构整理最近几个项目编译和交叉编译 , 等几个构建流程比较恶心的库的自动化构建流程和工具脚本。如果不追求全部功能的话,还可以用 来代替 。也合并适应了给客户端用的交叉编译iOS、Android、等平台使用的构建流程。

另外 中所有的C++项目都用cmake的export功能导出了,这样无论是作为某个工程的子项目,还是prebuilt之后直接可以使用Modern CMake推荐的find_package(MODULE)机制导入。

之前写的时候没太注意跨平台符号这块,所以都是建议使用静态库。我们前段时间预研了一段时间的引擎,涉及一个问题就是把服务器通信组件集成到中,然后使用的Dedicated Server和我们自己的服务器通信。这时候就碰到了一些问题。首先官方提供的预编译包是不开RTTI和Exception的。而如果使用静态编译版本的 得开启RTTI和Exception,这就导致得完全重编,这非常慢切很麻烦。所以这次重构也梳理了一遍符号导出问题。

现在Linux和Windows下得符号导出和符号隐藏规则统一了,并且这样以后,对PE这种独立堆的ABI,也可以编译成dll使用了。这样也就可以编译成外部模块给使用。

移除

之前使用是因为它宣称效率是的4倍。但是自从 3.0以后,可以使用Arena来减少碎片,我预估这个对性能的影响还挺明显的。反倒是我之前对的时候也是暴力new/delete的。所以综合来说我觉得 3.0+更好一些。另外生成的接口和反射支持比方便太多了。

第二个原因也是和上面一条一样,想要支持关闭RTTI和异常。而代码里写死的异常处理,而只要开一个编译宏就能完全关闭异常。

新的替代品是 ,我用完全替换掉了原来提供的功能。在切到之前,我还考虑过使用,写了个简单的对比,有兴趣的童鞋可以看看 。 和 的原理一样我就没特意去再写一个测试了。简单的说就是我觉得对小包太不友好了,对向后兼容也不太友好,感觉可能还是只适合配置和数据转储。

这是为了atproxy可以部署再自己的前缀分组里,然后管理其他前缀分组的子网。这是为了方便更灵活的运维层面的部署结构。这个改动也影响了协议层变化。不过反正都换了也是大换血了。

atframework
libatbus
atframework
libatbus
openssl
protobuf
libressl
openssl
Unreal Engine
atframework
Unreal Engine
Unreal Engine
Unreal Engine
Unreal Engine
libatbus
Unreal Engine
Unreal Engine
msgpack
msgpack
protobuf
protobuf
msgpack
protobuf
protobuf
msgpack
msgpack
protobuf
protobuf
protobuf
msgpack
protobuf
flatbuffer
《protobuf、flatbuffer、msgpack 针对小数据包的简单对比》
cap'n proto
flatbuffer
flatbuffer
protobuf