[基于Epoll内置Leader-Follower服务端实现, 已可达50万echo qps(全新支持Lua啦)] - C/C++ - ChinaUnix.net -
- 空间积分
- 0
- 信誉积分
- 498
- UID
- 27208017
- 阅读权限
- 90
- 积分
- 21852
- 帖子
- 2196
- 精华
- 1
- 可用积分
- 21854
- 专家积分
- 0
- 在线时间
- 978 小时
- 注册时间
- 2012-07-28
- 最后登录
- 2013-03-26
- 帖子
- 2196
- 主题
- 21
- 精华
- 1
- 可用积分
- 21854
- 专家积分
- 0
- 在线时间
- 978 小时
- 注册时间
- 2012-07-28
- 最后登录
- 2013-03-26
- 论坛徽章:
- 0
| 本帖最后由 linux_c_py_php 于 2013-02-21 17:38 编辑 程序在论坛众亲友的给力指导下, 在公司内核部门的指导之下, 长连接性能最终达到了50万qps, 短连接性能最终达到了7万qps, 测试机器CPU为12核心, 64MB内存, 测试环境为单机lo网口. 程序基于epoll的EPOLLONESHOT选项, 充分利用了epoll的线程安全特性, 通过独立的监听线程最大化连接建立速率, 通过线程池配合epoll简易的实现了Leader-Follower的程序结构, 对于各类业务逻辑能够普遍适用. 程序优化过程中, 主要是2个瓶颈点的化解: 1, epoll线程安全, 所以内部的锁会造成多线程共享epoll fd的瓶颈, 通过创建多组epoll fd, 减小锁的竞争可以化解瓶颈, 充分利用硬件性能. 2, 短连接建立能力差, 未经过优化网络参数, 只能达到3万/秒的建立能力, 经过参数优化, 可以达到8万/秒的建立能力, 具体参数参考代码里的Readme. 代码如下,最初的255行小代码, 有明显的瓶颈:(15万QPS) server.tar.gz (1.85 KB, 下载次数: 89) 解决上述两个问题后的代码, 能够支撑50万qps: lfepoll.tar.gz (2.69 KB, 下载次数: 106) 这是引入了lua的代码, 不支持yield, 因为考虑到需要把代码改成状态机的太费劲, 并且程序本身就是leader-folllower的, 所以提供一些异步connect等实用接口的必要性不大: lfepoll.tar.gz (4.27 KB, 下载次数: 33) 测试lua版本性能, 发现luaL_loadstring频繁调用性能损耗严重, 所以做成了只加载一次, 然后保持一份引用在注册表里, 以便重复使用, 现在程序瓶颈已经转移到了lua_pcall, 目测已经无法优化了.(注意测试前修改logic.lua, 改为纯echo服务, 否则会导致test压力工具工作不正常) lfepoll.tar.gz (4.38 KB, 下载次数: 36) |
|