MongoDB在服务器硬件上的写入性能非常慢

时间:2015-09-03 17:39:12

标签: c# windows performance mongodb

在Windows上评估MongoDB时,我遇到了一个奇怪的性能问题。

我一直在基本的Windows 7笔记本电脑(16GB内存,i7-3540M CPU)上运行,并且表现出色。

我已获得更强大的Windows 2008 R2服务器(128GB RAM,Xeon E7-4807(4个处理器))进行测试。

我正在对单行代码进行基准测试,这会给我带来问题 - 它是使用新c#驱动程序的简单插入:

 await Collection.InsertOneAsync(entity);

我的实体类很简单(EntityBase只是一个ObjectID Id属性):

[DataContract]
public class SamplePacket : EntityBase
{

    [DataMember]
    public ObjectId SampleId { get; set; }

    [DataMember]
    public int NumberOfScans { get; set; }

    [DataMember]
    public double MinimumScanTime { get; set; }

    [DataMember]
    public double MaximumScanTime { get; set; }

    [DataMember]
    public byte[] IndexStream { get; set; }

    [DataMember]
    public byte[] ContentStream { get; set; }

    [DataMember]
    public int PacketNumber { get; set; }

}

ContentStream字节数组可以在0.1到5MB之间。

笔记本电脑和服务器的配置与我可以完全相同。我有三个mongod实例(2个分片和1个配置)和一个mongos实例都在一台机器上运行。 c#程序与这些实例在同一台机器上运行,并与mongos实例通信。这些实例都作为具有默认配置的服务安装,例如:

mongod --install --serviceName "Mongo DB Shard 1" --serviceDisplayName "Mongo DB Shard 1" --port 10001 --dbpath g:\data\db --logpath g:\data\logs\log.txt

如果在我的实体类中,ContentStream是1MB的随机字节数组,则笔记本电脑上插入的持续平均时间约为28ms。在更强大的服务器上,它大约是500ms!这是从头开始的,即使数据库最初不存在 - 这对于大型集合来说也不是问题。

在此配置中使用mongoperf:

{nThreads:1, fileSizeMB:3, r:true, w:true, mmf:false}

显示服务器的磁盘性能远远大于笔记本电脑。服务器报告〜" 8729 ops / sec,33 MB / sec"并且笔记本电脑报告〜" 1866 ops / sec,7 MB / sec"。 CrystalDiskMark在服务器上显示出更好的性能。

在阅读有关NUMA的警告消息后,我确保它在服务器上被禁用,无效。

安装修补程序KB2731284是为了最好的知识 - 修补程序的安装似乎进展顺利但我仍然在启动mongo shell时收到警告消息。

写入单个非分片的mongod实例时,存在相同的性能差异。

如果我使用--nojournal作为选项写入单个Mongod实例,则平均写入速度从~500ms降至约35ms(仍然比带记录的笔记本电脑慢!)

我在日志中看不到任何奇怪的东西。服务器上的内存使用量大约为128GB可用的128GB - 没有其它重要的东西可以运行。

我无能为力的唯一区别是,在服务器上,磁盘是通过PERC H700作为SCSI设备连接的设备。我不确定这些磁盘的配置是什么 - 服务器在另一个大陆上!

奇怪的SCSI配置是否会造成这种情况,或者是否还有其他一些我需要注意的问题?

0 个答案:

没有答案