免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wlmqgzm
打印 上一主题 下一主题

[C++] ASIO,无锁,高并发,高可靠, 统一,网络架构,抗DOS,低端4核心服务器CPU 每秒87万QPS ECHO [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
131 [报告]
发表于 2015-11-03 20:58 |只看该作者
本帖最后由 wlmqgzm 于 2015-11-03 21:00 编辑

刚找到一个网络框架,  基本上一看FAQ就知道,
这个是做网络架构的业内专业人士, 基本覆盖了大部分要点, 大公司的网络库基本上把这些事情全部解决了, 并且提供了一致性的优秀的解决方案,

刘勇进 开发的, EasyNetwork网络开发框架,致力于为服务端的开发提供一个快速高效的方法.

    源码svn地址: easynetwork.googlecode.com/svn/trunk/
    框架详细介绍: code.google.com/p/easynetwork/wiki/NetFramework
    联系邮箱: xmulyj@gmail.com
    FQA
        服务器开发需要做什么
        什么是框架
        什么是EasyNetwork网络开发框架
        EasyNetwork?框架扩展性如何
        EasyNetwork怎么管理连接
        EasyNetwork什么时候收/发数据
        EasyNetwork怎么收发数据
        EasyNetwork怎么编/解码(序列化/反序列化)数据
        EasyNetwork支持自定义协议格式吗
        EasyNetwork怎么处理粘包现象
        EasyNetwork怎么处理高并发要求
        EasyNetwork怎么处理高吞吐量要求
        EasyNetwork内存管理与优化
        如何利用EasyNetwork框架搭建自己的服务器
        服务器代码自动化生成工具server_tool

    用EasyNetwork搭建的Server
        下载服务器(支持多任务多线程,支持断点续传)
        memcache服务器(敬请期待...:p)

    slog多线程安全日志库


    模块介绍

    3分钟搭建服务器
    Socket
    IOBuffer
    IODemuxer
    EventHandler
    Protocol
    MemManager
    Thread
    ThreadPool
    NetInterface

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
132 [报告]
发表于 2015-11-03 21:15 |只看该作者
本帖最后由 wlmqgzm 于 2015-11-03 23:47 编辑

回复 127# benjiamsh


    呵呵,很明显,我有足够的能力 以及足够的经验,所以才能指出你测试的错误。
至于你说ab发的是小包 我就只能呵呵了。至于百万连接 你应该先做做看。github搜索c1000k 去看我的代码即可。

=======================================================================
c1000k是目前网络架构对网络并发数量提出的目标, C1000k这个目标不是你的代码, c10k以后, 陆续C100k, C1000k, C10M, 这些都是对网络层的要求,  

我现在是个人独立开发, 没有那么多资源, 不是随便再找台机器做客户端就可以测试100万在线连接的,    ,  

论坛徽章:
0
133 [报告]
发表于 2015-11-03 23:04 来自手机 |只看该作者
好吧,继续做你的井底之蛙!你连1000k连接是什么样子都没见过,居然还在谴责别人是忽悠,我工作的环境服务器在6000台以上,我可以直接操作管理的在800台以上,所以我随时可以做c1000k的测试。对了我不是ops,我是dev。
建立1000k的连接毫无技术含量,有技术的是让它们都吞吐数据,以及系统的优化!
既然不信,你就继续吧! 当然你会觉得我所说的毫无意义,因为我是个骗子。你大可以在微博上找bat sina里面专门负责这方面开发的人 比如诸霸 timyang,让他们对你的东西做个评价即可!
不再回了

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
134 [报告]
发表于 2015-11-03 23:23 |只看该作者
本帖最后由 wlmqgzm 于 2015-11-04 00:10 编辑

回复 130# benjiamsh

好吧,也许我们的层次不一样吧, 我现在关注的比较底层, 低到每一行代码级别, 而且还有大量的代码没有完成, 现在就只有一个ECHO SERVER,
你做的高级, 比较高层的框架, C1000K, 大家都在做, 只是关注的方面不一样.

我现在的关注点是包转发, 你现在的关注点是包连接, 其实, 最后, 这些都是要测试的,
但是包转发在开发代码的过程中, 码农用ab做测试比较迅速, 一般到后期才测试大负载(100万连接)下的包转发能力, 前期,一般不测试, 太浪费资源, 代码每天的变化又非常多,
今天还在改网络框架的接口, 新增"网络层"的异步反向调用接口, 支持高层异步事件后的再次回调, 就是双异步, 网络架构层和应用逻辑层双异步.

其实, 很多东西, 都是要花大量时间熬出来的, 我这部分代码才刚做一个多月, 也是首次做网络层的代码, 还有很多很多东西没有做完, 可能我的关注点还在代码本身, 还没有到测试, 集群, 大数据的层次, 也没有到关注连接数量的层次, 而且是个人开发, 首次做,  各种资源受限, 算我错了. 我前面说话口气不好,   现在边学习边做代码中........
抽时间还是要做100万连接下的压力测试的,  我也可以确定这个代码支持100万连接, 因为底层架构本身是朝这个方向努力的.
最终, 网络层的代码, 还是要到应用的, 准备选择一个单机的痛点去做.

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
135 [报告]
发表于 2015-11-04 08:32 |只看该作者
本帖最后由 wlmqgzm 于 2015-11-04 08:58 编辑

apache开源软件基金会开发的apache http server是目前世界上最多用户的www服务器,

ab是著名的apache开源软件基金会开发的benchmark工具, 下面是原版的介绍

ab - Apache HTTP server benchmarking tool

ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give you an impression of how your current Apache installation performs. This especially shows you how many requests per second your Apache installation is capable of serving.

我每天测试ab的发包量很大, log中, 没有遇到到大字节包, 全部数据包都是一样长的小字节包, 唉.   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
136 [报告]
发表于 2015-11-04 10:38 |只看该作者
实现网络架构层和应用逻辑层双异步:

这两天在继续改进网络框架的代码, 正在实现网络架构层和应用逻辑层双异步, 就是说包处理的流程也可以是异步的,

当网络层把数据包交给上层代码,  

1)简单的同步系统中, 上层代码就直接放到一个函数中, 函数引用收发数据的容器,  处理数据包, 要发送的数据包放到容器中, 调用过程是当前函数处理完毕后, 函数返回.   是同步调用过程, 因为就一个函数, 并且在同一个线程中,   
返回0后,网络层内部处理收发包, 上层不用关注网络层的调用过程, 这种可以适应简单的全内存操作的处理过程.

2)复杂的异步系统, 上层代码收到网络层的数据包后, 启动上层代码的异步过程, 调用函数返回1, 网络层暂时没有发包可以处理, 可以继续io_service内部循环,  
网络层继续执行当前io_service下其他socket的收发包处理, 减少数据收发包的延时,
网络层线程不涉及上层调用, 上层应用不占用网络线程的CPU处理能力,
上层代码经过其他专用线程处理各类复杂调用, 包括各类异步IO事件(例如:读写硬盘,读写远端网络,读写数据库等)的处理等, 最终形成要输出的结果, 再异步调用网络层接口, 实现发包处理,
这个就是 网络架构层和应用逻辑层双异步.

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
137 [报告]
发表于 2015-11-04 11:50 |只看该作者
回复 133# wlmqgzm

我说w同学,做东西没错,有钻研精神也是好的,不过你要是想拿帖子当记事本的话,能不能就编辑你1楼的帖子把新内容加进去啊?

顺便说一下,你用不着把完整的ab输出贴上来,就帖Requests per second这一行就好了,别的东西也没人看

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
138 [报告]
发表于 2015-11-06 09:39 |只看该作者
本帖最后由 windoze 于 2015-11-07 11:42 编辑

目前已经实现每秒87万QPS ECHO,  性能比以前提高大约6%,
主要的改进是: 线程池底层, 换用自己的实现(原来是Boost::thread_group),  指定各线程的CPU亲缘性, 并且双份连接建立后不变的数据, 尽量使用线程内部内存, 减少对全局内存的读, 避免cache丢失, 提高了多核下高并发的处理能力, 但也降低了单核下的处理能力.

Requests per second:    217503.31 [#/sec] (mean)
Requests per second:    217499.26 [#/sec] (mean)
Requests per second:    216934.52 [#/sec] (mean)
Requests per second:    215427.64 [#/sec] (mean)

Windoze: 没什么特别的原因留这一行就好了

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
139 [报告]
发表于 2015-11-08 10:46 |只看该作者
本帖最后由 yulihua49 于 2015-11-08 10:51 编辑
wlmqgzm 发表于 2015-11-04 08:32
apache开源软件基金会开发的apache http server是目前世界上最多用户的www服务器,

ab是著名的apache开源 ...

大包小包混合用,最能体现异步优势。
大包,要到64K以上才能表现出特点。
我们现在实用的大包是64K-500K(压缩后)。
现在的系统就是大小包混合应用系统。

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
140 [报告]
发表于 2015-11-09 22:32 |只看该作者
继续改进:

阅读io_service代码, 发现一个问题, 就是linux下, 未定义  detail::signal_init<> init_,  
如果程序中对所有的error_code都有正确的处理方式, 那么程序不会有问题;  否则, 可能造成2次error, 系统将产生SIGPIPE中断,
如果程序未对SIGPIPE进行处理, 则程序默认将执行退出.

因此, 为了更加可靠, 在使用ASIO的对象中增加下列定义:    boost::detail::signal_init<> sig1   // 接管SIGPIPE

下面是IO_SERVICE的源代码:
private:
#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
  detail::winsock_init<> init_;
#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \
  || defined(__osf__)
  detail::signal_init<> init_;
#endif

下面是:/boost/asio/detail/signal_init.hpp 的源代码:
template <int Signal = SIGPIPE>
class signal_init
{
public:
  // Constructor.
  signal_init()
  {
    std::signal(Signal, SIG_IGN);
  }
};
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP