MongoDB中的插入率不稳定

问题描述 投票:6回答:1

我有一个每秒可以生成20 000条记录的过程(记录大小~30Kb)。我试图尽可能快地将它们插入到MongoDB的单个实例中。但我每秒得到约1500次插入,不稳定的速率范围从1000次插入到每秒2000次插入。问题是原因是什么以及如何解决? :)这是来自mongostat 2.5小时的数据:

建立

我正在云中运行8核,16Gb RAM,150Gb硬盘,Ubuntu 18.04,MongoDB 4.0 official docker image。在同一个实例上运行2个工作程序,每个工作程序每秒生成10 000条记录,并且每个块将insert_many转换为MongoDB 100条记录。每个记录分为2个集合casesdocsdocs使用zlib压缩。 cases记录的平均大小约为1Kb。随机记录为例:

{'info': {'judge': 'Орлова Олеся Викторовна', 'decision': 'Отменено с возвращением на новое рассмотрение', 'entry_date': datetime.datetime(2017, 1, 1, 0, 0), 'number': '12-48/2017 (12-413/2016;)', 'decision_date': datetime.datetime(2017, 2, 9, 0, 0)}, 'acts': [{'doc': ObjectId('5c3c76543d495a000c97243b'), 'type': 'Решение'}], '_id': ObjectId('5c3c76543d495a000c97243a'), 'sides': [{'name': 'Кузнецов П. В.', 'articles': 'КоАП: ст. 5.27.1 ч.4'}], 'history': [{'timestamp': datetime.datetime(2017, 1, 1, 15, 6), 'type': 'Материалы переданы в производство судье'}, {'timestamp': datetime.datetime(2017, 2, 9, 16, 0), 'type': 'Судебное заседание', 'decision': 'Отменено с возвращением на новое рассмотрение'}, {'timestamp': datetime.datetime(2017, 2, 17, 15, 6), 'type': 'Дело сдано в отдел судебного делопроизводства'}, {'timestamp': datetime.datetime(2017, 2, 17, 15, 7), 'type': 'Вручение копии решения (определения) в соотв. с чч. 2, 2.1, 2.2 ст. 30.8 КоАП РФ'}, {'timestamp': datetime.datetime(2017, 3, 13, 16, 6), 'type': 'Вступило в законную силу'}, {'timestamp': datetime.datetime(2017, 3, 14, 16, 6), 'type': 'Дело оформлено'}, {'timestamp': datetime.datetime(2017, 3, 29, 14, 33), 'type': 'Дело передано в архив'}], 'source': {'date': datetime.datetime(2017, 1, 1, 0, 0), 'engine': 'v1', 'instance': 'appeal', 'host': 'bratsky.irk.sudrf.ru', 'process': 'adm_nar', 'crawled': datetime.datetime(2018, 12, 22, 8, 15, 7), 'url': 'https://bratsky--irk.sudrf.ru/modules.php?name=sud_delo&srv_num=1&name_op=case&case_id=53033119&case_uid=A84C1A34-846D-4912-8242-C7657985873B&delo_id=1502001'}, 'id': '53033119_A84C1A34-846D-4912-8242-C7657985873B_1_'}

docs记录平均约为30Kb:

{'_id': ObjectId('5c3c76543d495a000c97243b'), 'data': 'PEhUTUw+PEhFQUQ+DQo8TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9V2luZG93cy0xMjUxIj4NCjxTVFlMRSB0eXBlPXRleHQvY3NzPjwvU1RZTEU+DQo8L0hFQUQ+DQo8Qk9EWT48U1BBTiBzdHlsZT0iVEVYVC1BTElHTjoganVzdGlmeSI+DQo8UCBzdHlsZT0iVEVYVC1JTkRFTlQ6IDAuNWluOyBURVhULUFMSUdOOiBjZW50ZXIiPtCgINCVINCoINCVINCdINCYINCVPC9QPg0KPFAgc3R5bGU9IlRFWFQtSU5ERU5UOiAwLjVpbjsgVEVYVC1BTElHTjoganVzdGlmeSI+0LMuINCR0YDQsNGC0YHQuiAwOSDRhNC10LLRgNCw0LvRjyAyMDE3INCz0L7QtNCwPC9QPg0KPFAgc3R5bGU9IlRFWFQtSU5ERU5UOiAwLjVpbjsgVEVYVC1BTElHTjoganVzdGlmeSI+0KHRg9C00YzRjyDQkdGA0LDRgtGB0LrQvtCz0L4g0LPQvtGA0L7QtNGB0LrQvtCz0L4g0YHRg9C00LAg0JjRgNC60YPRgtGB0LrQvtC5INC+0LHQu9Cw0YHRgtC4INCe0YDQu9C+0LLQsCDQni7Qki4sINGA0LDRgdGB0LzQvtGC0YDQtdCyINCw0LTQvNC40L3QuNGB0YLRgNCw0YLQuNCy0L3QvtC1INC00LXQu9C+IOKEliAxMi00OC8yMDE3INC/0L4g0LbQsNC70L7QsdC1INC40L3QtNC40LLQuNC00YPQsNC70YzQvdC+0LPQviDQv9GA0LXQtNC/0YDQuNC90LjQvNCw0YLQtdC70Y8g0JrRg9C30L3QtdGG0L7QstCwIDxTUE.....TlQ6IDAuNWluOyBURVhULUFMSUdOOiBqdXN0aWZ5Ij7QoNC10YjQtdC90LjQtSDQvNC+0LbQtdGCINCx0YvRgtGMINC+0LHQttCw0LvQvtCy0LDQvdC+INCyINCY0YDQutGD0YLRgdC60LjQuSDQvtCx0LvQsNGB0YLQvdC+0Lkg0YHRg9C0INCyINGC0LXRh9C10L3QuNC1IDEwINGB0YPRgtC+0Log0YEg0LzQvtC80LXQvdGC0LAg0L/QvtC70YPRh9C10L3QuNGPINC10LPQviDQutC+0L/QuNC4LjwvUD4NCjxQIHN0eWxlPSJURVhULUlOREVOVDogMC41aW47IFRFWFQtQUxJR046IGp1c3RpZnkiPtCh0YPQtNGM0Y8g0J4u0JIuINCe0YDQu9C+0LLQsDwvUD48L1NQQU4+PC9CT0RZPjwvSFRNTD4=', 'extension': '.html'}

分析

为了弄清楚发生了什么,我使用docker statsmongostat。重点指标突出显示:

我在数据插入过程中收集2.5小时的指标,并从上面的图片中绘制CPU %insertdirty

可以看出,当脏污率达到20%时,插入率会下降,当脏度低于20%时,插入率会上升到~2000:qazxsw poi

CPU处于活动状态时脏了。人们可以看到,当大约300%时,cpu开始下降(由于dirtydocker stats单独运行,情节有点不合适),当mongostat为200%时,cpu增长回到20%并且插入速度减慢:dirty

  1. 我的分析是否正确?这是我第一次使用MongoDB,所以我可能错了
  2. 如果分析正确,为什么MongoDB并不总是使用300%+ CPU(实例有8个内核)来保持低和插入率高?是否有可能强制它这样做,这是解决我的问题的正确方法吗?

更新

也许HDD IO是一个问题?

我没有记录IO利用率,但是

  1. 我记得在插入过程中查看cloud.mongodb.com/freemonitoring,有一个名为“磁盘利用率”的图,最大值为50%
  2. 目前我的问题是插入率不稳定。我最好每秒最多2000次插入。这意味着当前的HDD可以处理它,对吗?我不明白为什么要定期将速率下降到1000。

关于分片

目前我正试图在单台机器上达到最大性能

只需将HDD更改为SSD即可。

之前:dirty

之后:before

每秒约1500次插入,脏污稳定在~5%。插入和CPU使用现在稳定。这是我期望看到的行为。 SSD解决了这个问题标题“MongoDB中的不稳定插入率”的问题

mongodb nosql crud
1个回答
0
投票

使用更好的磁盘肯定会提高性能。您可以监控其他指标。

  • 脏字节的百分比表示数据在wiredTiger缓存中被修改但尚未持久保存到磁盘。如果磁盘IOPS达到预设限制,则应监视磁盘IOPS。使用命令after来监视MongoDB FTDC数据或从中获取它。
  • 当CPU出现高峰时,请监控是否在iowait上花费了CPU时间。如果iowait%很高,则会阻止I / O,即更快的磁盘或更多的IOPS将有所帮助。
  • iostat输出监视qrw(排队读取和写入请求)和arw(活动读取和写入请求)。如果这些数字像样本输出一样低,特别是qrw,mongo能够支持您的请求而无需排队请求。
  • 通过将注射工作转移到其他实例来避免资源竞争。
  • 您可以使用不同的磁盘分区进一步优化mongo数据路径和日志位置。
  • 观察者通常忽略客户(摄取工人)的表现。 CPU峰值可能来自您的工作人员,因此吞吐量较低。使用mongostat命令或等效命令监视客户端性能。

希望以上帮助。

© www.soinside.com 2019 - 2024. All rights reserved.