Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MongoDB的奇怪插入时间_Performance_Mongodb_Mongodb .net Driver - Fatal编程技术网

Performance MongoDB的奇怪插入时间

Performance MongoDB的奇怪插入时间,performance,mongodb,mongodb-.net-driver,Performance,Mongodb,Mongodb .net Driver,我需要保存大量的传感器测量数据,我正在MongoDB上做一些基准测试 数据: 这是我正在使用的“模式”: public class BetterConsolidatedTag { public ObjectId Id { get; set; } /// <summary> /// The base time to which the offset values relate. /// </summary> public DateT

我需要保存大量的传感器测量数据,我正在MongoDB上做一些基准测试

数据: 这是我正在使用的“模式”:

public class BetterConsolidatedTag
{
    public ObjectId Id { get; set; }

    /// <summary>
    /// The base time to which the offset values relate.
    /// </summary>
    public DateTime BaseTime { get; set; }

    /// <summary>
    /// The name of the data series
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Values of the series in this time frame. The values are saved as offsets in milliseconds from the BaseTime.
    /// </summary>
    [BsonElement]
    private SortedDictionary<int, object> OffsetValues { get; set; }
}
公共类BetterConsolidatedTag
{
公共对象Id{get;set;}
/// 
///偏移值与之相关的基准时间。
/// 
公共日期时间基准时间{get;set;}
/// 
///数据系列的名称
/// 
公共字符串名称{get;set;}
/// 
///此时间帧中序列的值。这些值以毫秒为单位保存为基准时间的偏移量。
/// 
[b单一元素]
私有SortedDictionary偏移值{get;set;}
}
其想法是,我不保存每个测量值,而是在一个小时内整合特定传感器的所有测量值。因此,每个文档表示从
BaseTime
开始的一小时内特定传感器的所有测量值。 定义了两个索引:BaseTime_1_Name_1和Name_1_BaseTime_1

数据库 MongoDB使用以下硬件在Windows Server 2012 R2标准上运行:

  • 处理器:Intel(R)Xeon(R)CPU X5675@3.07GHz,3059 Mhz,6核,12个逻辑处理器
  • 内存:96GB
  • 磁盘:带RAID 1的300GB本地磁盘(IBM ServeRAID M5015)
  • 网络:英特尔82575EB千兆以太网控制器
基准 为了简单起见,我的模拟以恒定速率生成数据——我生成代表所有不同传感器一小时的数据,并将其保存到数据库中。我记录保存这一小时数据所需的时间(如上所述,每次包含相同数量的样本)。 数据生成在我的桌面上(Windows7Enterprise,i7,8GbRAM,SSD),它使用官方的MongoDB C#驱动程序通过网络将数据发送到MongoDB服务器。在测试过程中,我没有对桌面做任何特殊的操作——主要是上网浏览,并不时在Excel中绘制测量值。在此期间,除了我之外,没有人连接到远程服务器,在基准测试期间,除了我的基准测试之外,没有人连接到MongoDB

结果 这是一个图形,描述了插入时间(毫秒)与数据库中样本总数的函数关系(数据库的总大小约为200GB,保存在101个文件中):

通过一些缩放: 我很难理解这些结果。我预计插入时间会随着时间的推移略有增长——有两个索引,随着文档数量的增加,维护这些索引的时间会更长。此外,我还预计,一旦数据不再适合物理内存,并且分页开始更频繁地发生,插入时间应该会更高,但图形中的情况看起来不会有一个时间点变得更糟。 我真的不明白为什么这张图看起来像是由三个不同的图组成的- -一个增长非常缓慢,几乎包含所有数据点(这是我预期的所有结果) -一种增长更快、保存点数更少的方法(可能是在分页发生的时候?但在物理内存被填满的时候,图形中可能会出现“跳跃”) -一个疯狂的增长,并持有约40个数据点。这些数据点似乎以大约每15分钟的恒定速率出现。我想这可能是MongoDB创建新文件的时候了,但是数据保存在101个文件中,而这些奇怪的测量值只有大约40个

这些结果有意义吗?如果没有,可能是什么问题?我应该在服务器上查找神秘的后台作业吗?硬件问题

编辑:高点对应于文件创建是没有意义的,因为随着数据越来越大,创建文件不应该花费更多时间。也许MongoDB在后台进行了某种压缩?大多数情况下,小型压缩(第二个“图”,有时是完全压缩(第三个也是最高的“图”)。随着数据变大,压缩所需的时间会变长,这是有道理的。或者可能是垃圾收集,我想也可以用这种行为来表示


MulGDB是用C++编写的,所以我猜GC是不可能的。所以现在背景压缩是我最好的猜测。默认情况下,

默认的MunGDB一次执行FSyc,所以一分钟后你会有更慢的插入——这是数据实际上被保存到磁盘的时间点,剩下的时间是S。仅在内存中保存。将其设置为每秒(或每次写入时,如果可能)同步数据图形看起来会有所不同。

文件在MongoDB中是预分配的。当第一个数据写入预分配的文件时,下一个数据是预分配的。而且没有后台压缩之类的事情。但是,在Windows服务器上运行MongoDB有点类似于让奥运会级别的短跑运动员穿高跟鞋:文件系统ems比ext4和XFS至少慢25%,操作系统试图节省内存。但我同意它慢一点。它不应该均匀地慢一点吗?这并不是说我在性能上有一个普遍的问题。我的问题是我不理解insert中突然出现峰值的现象,峰值只是越来越高r、 这取决于突发的大小和速度、可用的IOPs、是否需要进行文件访问(这是一个相当复杂的主题)你的日志大小等等。从我所看到的,我想说插入时间更长的百分比是我期望的高斯分布。我在一个紧密的循环中生成模拟数据-360000个样本代表一小时的数据,然后我按传感器名称合并,然后我将所有文档保存在一起惯性导航与制导