2015-10-14 79 views
0

我使用Mongo 2.6.9和2个分片的集群,每个分片有3个副本,其中一个隐藏。 这是在RedHat上运行的5台机器部署,其中4台机器包含1个碎片的单个副本,第5个机器包含两个碎片的隐藏副本。 有一个负载每秒运行大约250个插入和每秒50个更新。这些是简单的插入和更新很小的文档。 此外,还有一小部分插入到GridFS的小文件(大约1个文件/秒)。平均文件大小小于1 MB。对MongoDB的简单插入和更新在加载时运行非常缓慢

为涉及的集合定义了14个索引。当我将添加将从数据库读取的应用程序时,这些将是必需的。

根据我在整个运行过程中看到的大量简单插入和更新或者甚至GetLastError请求,这些请求需要几百ms甚至有时几秒(默认日志记录级别仅显示花费多于100毫秒)。例如,这简单的更新使用一个索引进行查询,并且不更新任何索引:

2015-10-12T06:12:17.258 + 0000 [conn166086]更新chatlogging.SESSIONS查询:{_id: “743_12101506113018605820fe43610c0a81eb9_IM”} (microsoft)w:430 2131ms

2015-10-12更新:{$ set:{EndTime:new Date(1444630335126))}}已扫描:1 nscannedObjects:1 nMatched:1 n修改:1 keyUpdates:0 numYields: 12T06:12:17.259 + 0000 [conn166086] command chatlogging。$ cmd command:update {update:“SESSIONS”,updates:[{q:{_id:“743_12101506113018605820fe43610c0a81eb9_IM”},u:{$ set:{EndTime:new Date (1444630335126)}},multi:false,upsert:false}],writeConcern:{w:1},ordered:true,metadata:{shardName:“S1R”,shardVersion:[Timestamp 17000 | 3,ObjectId('560所有插入和更新都使用w:1,j:1进行。所有插入和更新都使用w:1,j:1进行。

机器有充足的CPU和内存。磁盘I/O非常重要,但在出现这种情况时不会接近100%。

我真的需要弄清楚是什么导致了这个意外缓慢的数据库响应速度。我很可能需要改变数据库的设置方式。 Mongo以默认配置(包括日志记录级别)运行。

更新 -
我一直在继续寻找到这个问题,并在这里是我希望将允许以查明问题的根源,或者至少我指向正确的方向的其他详细信息:

目前单个分片的总数据库大小超过200GB。这些指标差不多是50GB。下面是相关部分从db.stats()和MEM部分从db.ServerStatus()从碎片中的一个的主副本:

"collections" : 7, 
    "objects" : 73497326, 
    "avgObjSize" : 1859.9700916465995, 
    "dataSize" : 136702828176, 
    "storageSize" : 151309253648, 
    "numExtents" : 150, 
    "indexes" : 14, 
    "indexSize" : 46951096976, 
    "fileSize" : 223163187200, 
    "nsSizeMB" : 16, 

“MEM”:{ “比特”:64, “居民”:5155, “虚”:526027, “支持”:真实, “映射”:262129, “mappedWithJournal”:524258 },

服务器具有8GB的RAM,出mongod进程使用大约5GB。所以大部分数据和可能更重要的索引都不会保存在内存中。这可以成为我们的根源吗?当我以前写道系统具有足够的可用内存时,我指的是mongod进程没有尽可能多地使用这一事实,并且大多数RAM用于高速缓存的内存,如果需要可以释放:

free -m output

这里是mongostat从相同的mongod输出:

mongostat output

我看到在这几个缺点,但这些数字看起来太低,给我指出一个真正的问题。我错了吗?

另外我不知道在“锁定的数据库”中看到的数字是否被认为是合理的,还是那些表明我们有锁争用?

期间,当这些统计数据都采取了查找基于索引的文件,不更新索引,很多简单的更新操作,类似以下的同一时间,夺走了几十毫秒的:

2015-10 -19T09:44:09.220 + 0000 [conn210844] update chatlogging.SESSIONS查询:{_id:“838_19101509420840010420fe43620c0a81eb9_IM”}更新:{$ set:{EndTime:new Date(1445247849092)}} nscanned:1 nscannedObjects:1 nMatched:1 n修改:1 keyUpdates:0 numYields:0锁(微型)w:214 126ms

许多其他类型的插入或更新操作也需要数百ms。所以这个问题看起来是系统范围的,并且与特定类型的查询无关。使用mtools我无法找到扫描大量文档的操作。

我希望在这里能找到帮助找到问题的根本原因。我可以提供任何额外的信息或统计数据。

谢谢你在前进,
列昂尼德

回答

0

1)首先你需要增加日志记录级别 2)使用mtools的找出查询很慢 3)调谐的查询找出你的瓶颈

+0

谢谢,我会尝试安装mtools,看看我是否可以从那里了解更多。但是关于如何计算缓慢的查询,我已经知道这些来自mongo日志的内容。它显示了超过100ms的查询。在那里,我看到非常简单的查询,就像我附加的更新示例,它只需要很多时间。目前我无法弄清楚是什么导致它如此缓慢。 – noplk1

+0

您能否请您分享哪些索引存在于您的集合中,因为如果每次插入更新多个索引,那么您的查询会变得更慢。 – user155806