通过内存盘提高MSMQ的消息吞吐能力

转载:http://www.ikende.com/blog/00f2634be4704b79a3e22439edeb1343

由于MSMQ的消息交互都需要对磁盘进行读写操作,所以提高MSMQ的消息吞吐能力相对比较有效的方法就是提高磁盘读写能力.可以简单地把MSMQ的消息,日志等文件存储到不同的磁盘来降低MSMQ对一个磁盘IO依赖从而达到更高的读写效能.由于MSMQ一般都是存储流水数据,如果消息结构比较少和消费积累量不高的情况把MSMQ存储放到内存则是一个非常不错的选择,这样能够大大提高MSMQ的读写效能(缺点:断电部分数据存在丢失).下面针对MSMQ内存存储的一些实现和简单测试.

构建内存盘

首先要从内存中创建一个盘出来,这个可以通过一些工具就能实现,这里选择了Dataram RAMDisk(这款工具如果的虚拟4G以下的空间是免费的).对于要分析多少内存则根据实际情况需要,以下是简单地分析2G空间构建一个磁盘出来.如果你存储的消息不大,而消息停留时间不长的情况其实足够用的.

创建完成后只需要点击Start RAMDisk按钮即可产生一个内存盘.

制定内存盘备份

完全把数据存放到内存中风险还是比较大的,可以根据实里需要把内存盘的数据写入一个镜象文件中.Dataram RAMDisk这个工具想得比较周到的它提供了内存盘数据来源的镜象文件和定期保存镜象的设置.

保存镜象信息就根据实际情况设置.

更改MSMQ存储路径

当内存盘构建完成后你只需要把MSMQ的文件存储路径指向内存盘即可.

性能测试对比

MSMQ的存储指向内存盘后,其实整体的读写效率是不是会提高呢?下面做个简单的测试.

[ProtoContract]
    public class Employee
    {
        [ProtoMember(1)]
        public string EmployeeID { get; set; }
        [ProtoMember(2)]
        public string FirstName { get; set; }
        [ProtoMember(3)]
        public string LastName { get; set; }
        [ProtoMember(4)]
        public string Title { get; set; }
        [ProtoMember(5)]
        public string Address { get; set; }
        [ProtoMember(6)]
        public string City { get; set; }
        [ProtoMember(7)]
        public string Region { get; set; }
        [ProtoMember(8)]
        public string PostalCode { get; set; }
        [ProtoMember(9)]
        public string Notes { get; set; }
        [ProtoMember(10)]
        public string Extension { get; set; }
    }
    [ProtoContract]
    public class Order
    {
        [ProtoMember(1)]
        public string OrderID { get; set; }
        [ProtoMember(2)]
        public string CustomerID { get; set; }
        [ProtoMember(3)]
        public string EmployeeID { get; set; }
        [ProtoMember(4)]
        public DateTime OrderDate { get; set; }
        [ProtoMember(5)]
        public DateTime RequiredDate { get; set; }
        [ProtoMember(6)]
        public string ShipName { get; set; }
        [ProtoMember(7)]
        public string ShipAddress { get; set; }
        [ProtoMember(8)]
        public string ShipCity { get; set; }
        [ProtoMember(9)]
        public string ShipRegion { get; set; }
        [ProtoMember(10)]
        public string ShipPostalCode { get; set; }
        [ProtoMember(11)]
        public string ShipCountry { get; set; }
    }

普通磁盘测试结果

内存盘测试结果

总结

从测试结构来看,内存盘的收益还是很明显的.接收消息和发送消息都有着1/3的提高.由于消息的并不大,在队列中停留的时间不长,在跑了3亿多的消息调度后内存占用的空间只用了30MB,这么小空间内存盘的镜象短时间进一个保存应该不会存在多大问题.但内存盘毕竟有风险存在,如果你的业务调度消息是完全不允许丢失的话那还是不建议用内存盘做MSMQ的存储.

这个测试结果也说明了一个问题,如果想提高MSMQ的吞吐能力,一个读写效率高的磁盘是比较重要的.

时间: 2024-11-08 19:55:09

通过内存盘提高MSMQ的消息吞吐能力的相关文章

【大话QT之九】ZMQ偏执海盗模型调研以及模拟实现网盘负载均衡间消息通讯

应用需求: 由于网盘服务端既需要承载用户文件目录的监控又要负责文件的上传和下载,当某一时刻用户访问量较大或用户操作较为频繁是,单台文件监控服务器和文件传输服务器往往无法满足需求,极端情况下很可能造成服务器内存和CPU使用率爆表的情况,而且当Client与文件监控服务器间网络状况不好的情况下,很有可能造成用户操作序列的丢失,即用户在客户端的操作序列没有及时反映到服务端,造成用户本地目录和服务器端存储的文件不一致的情况.基于上述情况的考虑,必须要设计一套负载均衡系统,它能够满足在用户访问量增加或用户

使用内存盘构建自己的分级存储而不是笃信SSD

SSD技术正日渐成熟,容量越来越大,价格越来越便宜,符合摩尔定律,但是内存技术似乎在同样的道路上走得更快.昨晚我想下载几个电影,一共4G多,但是连接上迅雷之后,资源不少,但是速率却成锯齿状,我就不信是网速问题,也不是TCP问题,因为分布式P2P下载的原理和单TCP通道的HTTP以及FTP完全不同,后来用命令查看发现是IO的瓶颈...我的磁盘是这么分配的:SSD:我的SSD容量太小,128G吧,上面放了很多虚拟磁盘之类的,剩下的空间不足3G了.HDD:这是一个1T的物理磁盘,规格就不说了,反正就是

内存盘

一.简介 大多数的Linux发行版本中,内存盘默认使用的是/dev/shm 路径,文件系统类型为tmpfs,默认大小是内存实际的大小,操作这个路径就是对内存的操作.   tmpfs是一种虚拟内存文件系统,特点是的存储空间在VM(virtual memory)中.linux下面VM的大小由RM(Real Memory)和swap组成,RM的大小就是物理内存的大小,而Swap的大小是由你自己决定的.Swap是通过硬盘虚拟出来的内存空间,因此它的读写速度相对RM(Real Memory)要慢许多,我们

利其器:如何利用内存盘加速电脑

[创建内存盘]: 用软媒魔方内存盘来创造内存盘,让硬盘休息! 用了1G给内存盘,电脑是8G内存: 备份路径到非系统盘: 勾选关机保存,以后要正常关机: [修改chrome浏览器缓存目录]: 先剪切原来的User Data目录到F:\Google\Chome\下,上一层目录Chrome不用管,如下图: 重命名为UserData空目录,记得不含空格 mklink/D "C:\Users\Administrator\AppData\Local\Google\Chrome\User Data"

Mac OS X RAM Disk(内存盘) Shell

本文提供改进版的Mac OS X RAM Disk(内存盘)创建程序和实用说明. 顾虑 Mac迅雷下载时IOPS太高,可能是没使用缓存,这导致磁盘吱吱地响,因此担心磁盘很快报废,而不能安心下载.作者已多次向其开发者提议,但至今未收到答复. 好在本机的内存空间宽裕,突然想到内存盘这一概念. 探索 试用了TmpDisk一段时间,效果还行.但细心的同学会发现:在活动监视器/磁盘页中,进程TmpDisk的显示的写入数据量为实际内容写入数据量的两倍以上.比如:以10M网速全速下载,预计连续写入1MiB/s

java内存回收提高性能

这是本人的第二篇文章.通过上一篇文章的总结后,我觉得有必要对java内存回收问题再详细叙述一下.因为大多数javaer估计都是习惯了自己的java编码风格,尤其是对象声明等,想在哪声明就在哪声明,之后就不管了,因为他知道java有一个很好的内存管理机制,那就是GC(垃圾回收机制).其实这对一般的java程序猿来说这是无可厚非的.呵呵...因为我也是这样过来的.然而,随着接触的项目庞大和性能的要求,我们开始审视自己写的代码,看看有没有一些代码需要优化,或者其他编码风格需要改变从而对系统的性能提升有

创建内存盘

我打算把内存虚拟盘放在/opt/var/tmp .使用以下简单的命令: # mount -t tmpfs -o 128m none /opt/var/tmp 也可以不指定内存盘大小: # mount -t tmpfs none /opt/var/tmp 在内存盘建立之后,查看top 或者系统监视器,可用内存并未相应减少(明确指定大小的内存盘也是如此).经过测试,未明确指定大小的内存盘会动态分配内存,可以持续向内存盘中写入文件,当再无可用物理内存时才会报空间不足的错误. tmpfs 文件系统默认采

使用mfsbsd制作FreeBSD内存盘系统

使用mfsbsd制作FreeBSD内存盘系统 项目github地址:https://github.com/mmatuska/mfsbsd 项目主页:http://mfsbsd.vx.sk/ root password for all images: mfsrootAll images have mfsbsd.autodhcp set - all network cards are configured for DHCP. mfsBSD Copyright (c) 2007-2016 Martin

【c#】队列(Queue)和MSMQ(消息队列)的基础使用

原文:[c#]队列(Queue)和MSMQ(消息队列)的基础使用 首先我们知道队列是先进先出的机制,所以在处理并发是个不错的选择.然后就写两个队列的简单应用. Queue 命名空间 命名空间:System.Collections,不在这里做过多的理论解释,这个东西非常的好理解. 可以看下官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.collections.queue?view=netframework-4.7.2 示例代码 我这里