MSMQ内存中的实例

本文关键字:实例 内存 MSMQ | 更新日期: 2023-09-27 18:01:49

我正在尝试调整我的验收测试套件的性能。我发现大多数性能瓶颈是由于MSMQ存储文件位于慢IO VM磁盘上。我已经尝试将MSMQ存储文件夹移动到RAM磁盘,但由于一些奇怪的原因,当您尝试在Windows Server 2012 R2上使用"计算机管理"创建私有队列时,MSMQ抛出I/O设备错误。它在Windows 7、8和10上运行良好。所以我真的不知道RAM磁盘,MSMQ和Windows 2012 R2的问题是什么。

作为替代方案,我在想,而不是担心将我的MSMQ文件存储在快速磁盘甚至RAM磁盘上,为什么不只是创建一个新的内存中的MSMQ组件实例,然后在内存中拥有我所有的队列。

请注意,此代码将仅用于改进我的验收单元测试套件的性能。ATM,需要2.5小时才能完成(4000个测试,使用NServiceBUS, MSMQ和RavenDB)。我已经设法将所有组件移动到RAMDISK,这减少了近40%的运行时间。这是我在Windows 7、8、10上使用RAMDISK上的MSMQ测试的结果。在Windows 2012 R2中做同样的事情时,我可以将所有内容移动到RAM磁盘并且它工作正常,但我无法让MSMQ在RAMDISK上工作。奇怪的是,当MSMQ不在RAMDISK上时,我失去了所有性能收益。我猜I/O瓶颈真的很糟糕!

任何建议吗?

MSMQ内存中的实例

我明白了。我使用的ramdisk驱动程序不支持带有存储存储的Win 2012 R2。它可以很好地工作,但由于某种原因,MSMQ不喜欢它。所以我尝试了另一个ramdisk驱动程序(Primo ramdisk Server Edition), msmq终于工作了。

我使用以下命令来移动MSMQ文件的位置:

$MSMQStoragePath = "P:'MSMQ"
$MessageFilePath = "$MSMQStoragePath'MessageFiles"
$XactLogsPath = "$MSMQStoragePath'XactLogs"
$StoragePath = "$MSMQStoragePath'Storage"
Write-Host "$MessageFilePath - $XactLogsPath - $StoragePath"
$MSMQPath = Split-Path -Path $MessageFilePath -Parent
New-Item -ItemType Directory -Force -Path "$MessageFilePath'LQS" -Verbose
New-Item -ItemType Directory -Force -Path $XactLogsPath -Verbose
New-Item -ItemType Directory -Force -Path $StoragePath -Verbose
icacls $MSMQPath /grant "NT SERVICE'MSMQ:(OI)(F)"
icacls "$MessageFilePath'LQS" /grant "NT SERVICE'MSMQ:(OI)(F)"
Set-MsmqQueueManager -MessageQuota 10485760 -JournalQuota 10485760 -MsgStore $MessageFilePath -MsgLogStore $XactLogsPath -TransactionLogStore $StoragePath -Verbose -Confirm:$false
Start-Service MSMQ -Verbose

运行我的测试套件现在需要67分钟,从150分钟减少!