前言

最近用了几个月的时间,一直在对EQueue做性能优化。到现在总算告一段落了,现在把一些优化的结果分享给大家。EQueue是一个分布式的消息队列,设计思路基本和阿里的RocketMQ一致,只是是用纯C#写的,这点大家应该都知道了。

  1. EQueue开源地址:https://github.com/tangxuehua/equeue
  2. EQueue相关文档:http://www.cnblogs.com/netfocus/category/598000.html
  3. EQueue Nuget地址:http://www.nuget.org/packages/equeue

之前EQueue 1.*版本,消息持久化是使用SQLServer的,之前也想做性能测试,但发现效果不理想。所以放弃了测试,转为专心对消息持久化这块进行优化。之前的持久化设计是通过Sql Bulk Copy的方式异步批量持久化消息。但是当数据库服务器和Broker本身部署在不同的服务器上时,持久化消息也会走网卡,消耗带宽,影响消息的发送和消费的TPS。而如果数据库服务器部署在Broker同一台服务器上,则因为SQLServer本身也会消耗CPU以及内存,也会影响Broker的消息发送和消费的TPS。所以,经过考虑后,最终决定狠下心来,采用终极方案来持久化消息,就是通过本地顺序写文件的方式来持久化消息。支持异步刷盘和同步刷盘两种方式。采用文件存储后,EQueue可以轻易的支持大量消息的堆积,你的硬盘有多大,就能堆积多少量的消息。

到现在为止,经过不断的测试,功能上我认为已经比较稳定了,性能也基本满足我的要求。另外,EQueue单纯的消息持久化模块(MessageStore)以及TCP通信层的性能是非常高的。MessageStore我设计时,尽量独立一些,因为我发现写文件和读文件的设计是通用的,以后可以被复用到其他项目,所以我设计时,确保持久化模块的通用性;而TCP通信层,也是也是一样,通用和高效。目前我自己写的通信层(在ECommon类库中)可以轻松把网卡压满。

关于EQueue 2.0文件持久化版本的具体设计,我下一篇文章会具体介绍,本文主要是想分享一下EQueue 2.0的性能测试结果。为大家在使用到线上环境前做架构选型给出性能方面的参考。

测试目的

测试单个EQueue Broker服务器的发送消息、消费消息的性能。

硬件环境

全部采用UCloud云主机进行测试。一台Broker,4台Client机器。Broker的配置为8核16G内存,120G的SSD硬盘,Client的配置为4核8G内存,普通硬盘。所有服务器操作系统均为Windows Server 2012。具体如下图所示:

测试场景1

1台生产者、1台消费者、1台Broker,异步刷盘,每隔100ms刷一次盘。

消息大小(字节)  发送TPS  消费TPS  发送网络吞吐量  消费网络吞吐量 Broker磁盘写入吞吐量  Broker CPU Broker内存 Producer CPU Producer内存 Consumer CPU Consumer内存
 128  56400  56400  10MB  13MB  13MB  35%  35%  30%  12%  30%  13%
 512  41000  41000  22MB  25MB  25MB  32%  35%  30%  13%  30%  13%
 1024  29000  29000  30MB  34MB  34MB  32%  35%  27%  12%  25%  13%
 2048  20000  20000  41MB  43MB  43MB  30%  35%  27%  12%  25%  13%

测试场景2

2台生产者、2台消费者、1台Broker,异步刷盘,每隔100ms刷一次盘。

消息大小(字节)  发送总TPS  消费总TPS  发送总网络吞吐量  消费总网络吞吐量 Broker磁盘写入吞吐量  Broker CPU Broker内存 Producer CPU Producer内存 Consumer CPU Consumer内存
 128  50000  50000  8.6MB  11MB  11MB  46%  35%  19%  13%  19%  13%
 512  40000  40000  21MB  24MB  24MB  48%  35%  19%  13%  19%  13%
 1024  31200  31200  32MB  35MB  35MB  47%  35%  19%  13%  19%  13%
 2048  23000  23000  48MB  51MB  51MB  45%  35%  19%  13%  19%  13%

结束语

一些说明

  1. 因为EQueue的Producer发送消息时,本地会有缓存队列。所以Producer发送消息采用的线程数对发送TPS并无什么影响。所以,我上面的测试中并没有考虑发送线程数;
  2. Broker的内存使用我们是可以控制的,我测试时配置为当内存使用到达40%时,开始自动清理内存,所以上面的测试结果,内存使用都不会超过40%;
  3. 因为消费者从Broker拉取消息时,EQueue的设计在内存足够的情况下,总是会将需要消费的消息缓存在非托管内存,所以消费者拉取消息时,总是从内存获取消息的。所以Broker没有磁盘的读取;且由于这个设计,消费者消费消息不会成为瓶颈,假设当前Broker上存在大量消息可以被消费,然后我们开一个Consumer,那消费速度是非常快的,1K大小的消息,10W TPS没有问题。所以,消息的消费不会成为瓶颈,除非消费者自己内部处理消息的代码太慢。这种情况下,消费者需要增加Consumer机器,确保消费速度跟得上发送速度。
  4. 上面的测试结果是基于UCloud的虚拟机,由于我没有物理机,所以不知道物理机上的性能。有条件的朋友我非常希望能帮忙测试下哦。像这种重要的分布式消息队列服务器,是应该部署在物理机上的。另外,我测试时,Producer和Consumer服务器使用的是普通的虚拟机,尽量真实的模仿一般应用的虚拟机配置。

测试结论

从上面的测试结果可知:

  1. 随着消息体的不断增大,发送消息的TPS不断降低,一般我们的消息大小为1KB,在有两个发送者客户端时,EQueue的发送消息TPS大概为31000。我觉得性能上应该满足大部分需求场景了。如果一个系统平均每秒产生31200个消息,一天是86400秒。那一天的消息量是27亿。这个数字已经很大了,呵呵。相信国内大部分网站都没有这么大的规模。当然我们不能这么简单的来算,实际的系统肯定有高峰期的,实际大家要根据自己的系统的高峰期发送消息的TPS来衡量具体要部署多少台EQueue Broker服务器。线上环境使用时,我们不能把Broker压满的,要给其有足够的处理余量,比如高峰期发送TPS为10W,每台Broker最大能承受3W,那我们至少要分配6台机器,确保应付可能出现的高峰。这样才能应付特别高的高峰。
  2. 大家可以看到上面的数据中,开两个生产者,两个消费者,消息大小为2KB时,Broker的进出总网络流量为99MB,这个数据还没有到达千兆网卡的总流量(125MB)。目前,我只申请了5台机器,4个客户端机器。但实际我们的应用的集群,客户端机器应该会更多,我不知道当客户端机器增加时,能否把Broker的网卡压满,如果压不满,则说明Broker本身的设计实现已经到达瓶颈了,也就是说EQueue Broker本身设计上可能还有性能优化的空间。
  3. 在上面的性能数据情况下,所有服务器的CPU,内存使用稳定,符合预期。在稳定性方面,我在个人笔记本上同时发送和消费消息,连续运行1天没有问题;也有其他网友帮忙测试了稳定性,运行几天也没有问题。各项指标均正常。所以我认为目前EQueue的稳定性应该问题不大了。
  4. Broker的消息持久化,采用的是顺序写文件的方式;目前的测试结果来看,完全还没达到写文件的瓶颈;如果我们单独测试写文件模块的性能,可以轻松达到300MB每秒,而我们的千兆网卡最大流量也只有125MB。所以,消息持久化不会再成为很大的瓶颈了,但写文件的响应时间本身也会影响Broker对外的TPS,目前的响应时间为60ms,我感觉是比较慢的,不知道是否是虚拟机的原因,不知道物理机上会如何。我觉得SSD硬盘,写入文件的响应时间不会这么慢的。
  5. 最后一点,当Broker的客户端增加时,Broker的CPU的使用也会相应增加一点。这个可以理解,因为TCP长连接的数量多了一倍。而生产者和消费者服务器的CPU内存的使用都非常稳定,符合预期。

EQueue 2.0 性能测试报告的更多相关文章

  1. 性能测试报告模板 V1.0

    1. 测试项目概述与测试目的 1.1 项目概述 本部分主要是针对即将进行压力测试的对象(接口.模块.进程或系统)进行概要的说明,让人明白该测试对象的主要功能与作用及相关背景. 1.2 测试目标 简要列 ...

  2. 【转】性能测试报告模板 V1.0

    1. 测试项目概述与测试目的 1.1 项目概述  本部分主要是针对即将进行压力测试的对象(接口.模块.进程或系统)进行概要的说明,让人明白该测试对象的主要功能与作用及相关背景. 1.2 测试目标  简 ...

  3. C#分布式消息队列 EQueue 2.0 发布啦

    前言 最近花了我几个月的业余时间,对EQueue做了一个重大的改造,消息持久化采用本地写文件的方式.到现在为止,总算完成了,所以第一时间写文章分享给大家这段时间我所积累的一些成果. EQueue开源地 ...

  4. intel Xeon(R) CPU E5-2650 v2 性能测试报告

                                          intel  Xeon(R) CPU E5-2650 v2                                 ...

  5. Odoo:全球第一免费开源ERP权威性能测试报告完整版(绝对珍藏)

    Odoo平台简介 Odoo(以前叫OpenERP)是世界排名第一的开源ERP系统,最早由比利时一家公司开发,经过十几年发展,目前全世界Odoo的使用者超过2百万人,Odoo被翻译成几十种语言,Odoo ...

  6. Jmeter-jtl性能测试报告转换-2种导出方法

    方法一*********************** 环境搭建 1.Java JDK   (版本最好在1.6或者1.6以上) 2.ANT 安装 下载地址:http://ant.apache.org/b ...

  7. 国产CPU 申威1621 异数OS基础组件理论性能测试报告

    国产CPU 申威1621 异数OS基础组件理论性能测试报告 文章目录 国产CPU 申威1621 异数OS基础组件理论性能测试报告 前言 测试平台 测试项目 SW1621 异数OS 容器虚拟交换机模拟性 ...

  8. Jmeter(三十七) - 从入门到精通进阶篇 - 输出HTML格式的性能测试报告(详解教程)

    1.简介 相对于Loadrunner,Jmeter其实也是可以有测试报告产出的,虽然一般都不用(没有Loadrunner的报告那么强大是一方面),但是有小伙伴们私下问,那宏哥还是顺手写一下吧,今天我们 ...

  9. Linux 服务器性能测试报告-sysbench命令实践

    Linux 服务器性能测试报告 我们使用linux 工具sysbench 来测试linux服务器性能,目前在Centos上进行操作 Install sysbench yum -y install sy ...

随机推荐

  1. 【.net 深呼吸】设置序列化中的最大数据量

    欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...

  2. 关于Unity3D自定义编辑器的学习

    被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做).  刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...

  3. eclipse 快捷键大全

    注:因eclipse版本.电脑配置等原因 有些快捷键可能导致不可用(遇到些许问题可在下方评论) [Ct rl+T] 搜索当前接口的实现类 1. [ALT +/]    此快捷键为用户编辑的好帮手,能为 ...

  4. [Java 缓存] Java Cache之 DCache的简单应用.

    前言 上次总结了下本地缓存Guava Cache的简单应用, 这次来继续说下项目中使用的DCache的简单使用. 这里分为几部分进行总结, 1)DCache介绍; 2)DCache配置及使用; 3)使 ...

  5. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  6. CentOS7 重置root密码

    1- 在启动grub菜单,选择编辑选项启动 2 - 按键盘e键,来进入编辑界面 3 - 找到Linux 16的那一行,将ro改为rw init=/sysroot/bin/sh 4 - 现在按下 Con ...

  7. javascript之Object.defineProperty的奥妙

    直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...

  8. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

  9. 【干货分享】流程DEMO-外出申请

    流程名: 外出申请  流程相关文件: 流程包.xml  流程说明: 直接导入流程包文件,即可使用本流程  表单:   流程: 图片:2.png DEMO包下载: http://files.cnblog ...

  10. SharePoint2016安装的过程的”Microsoft.SharePoint.Upgrade.SPUpgradeException”错误解决方法

    前提 在windows server 2012的服务器上运行安装sharepoint2016出现如下错误: Could not load file or assembly ‘Microsoft.Dat ...