返回顶部
首页 > 资讯 > 数据库 >如何解决MongoDB磁盘IO问题
  • 465
分享到

如何解决MongoDB磁盘IO问题

2024-04-02 19:04:59 465人浏览 独家记忆
摘要

小编给大家分享一下如何解决mongoDB磁盘io问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!IO概念在数据库优化和存储规划

小编给大家分享一下如何解决mongoDB磁盘io问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

IO概念

数据库优化和存储规划过程中,总会提到IO的一些重要概念,在这里就详细记录一下,对这个概念的熟悉程度也决定了对数据库与存储优化的理解程度,以下这些概念并非权威文档,权威程度肯定就不能说了。

读/写IO,最为常见说法,读IO,就是发指令,从磁盘读取某段扇区的内容。指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读,还是写。磁盘收到这条指令,就会按照指令的要求,读或者写数据。控制器发出的这种指令+数据,就是一次IO,读或者写。

大/小块IO,指控制器的指令中给出的连续读取扇区数目的多少,如果数目很大,比如128,64等等,就应该算是大块IO,如果很小,比如1, 4,8等等,就应该算是小块IO,大块和小块之间,没有明确的界限。

连续/随机IO,连续和随机,是指本次IO给出的初始扇区地址,和上一次IO的结束扇区地址,是不是完全连续的,或者相隔不多的,如果是,则本次IO应该算是一个连续IO,如果相差太大,则算一次随机IO。连续IO,因为本次初始扇区和上次结束扇区相隔很近,则磁头几乎不用换道或换道时间极短;如果相差太大,则磁头需要很长的换道时间,如果随机IO很多,导致磁头不停换道,效率大大降底。

顺序/并发IO,这个的意思是,磁盘控制器每一次对磁盘组发出的指令套(指完成一个事物所需要的指令或者数据),是一条还是多条。如果是一条,则控制器缓存中的IO队列,只能一个一个的来,此时是顺序IO;如果控制器可以同时对磁盘组中的多块磁盘,同时发出指令套,则每次就可以执行多个IO,此时就是并发IO模式。并发IO模式提高了效率和速度。

IO并发几率。单盘,IO并发几率为0,因为一块磁盘同时只可以进行一次IO。对于raid0,2块盘情况下,条带深度比较大的时候(条带太小不能并发IO,下面会讲到),并发2个IO的几率为1/2。其他情况请自行运算。

IOPS。一个IO所用的时间=寻道时间+数据传输时间。 IOPS=IO并发系数/(寻道时间+数据传输时间),由于寻道时间相对传输时间,大几个数量级,所以影响IOPS的关键因素,就是降底寻道时间,而在连续IO的情况下,寻道时间很短,仅在换磁道时候需要寻道。在这个前提下,传输时间越少,IOPS就越高。

每秒IO吞吐量。显然,每秒IO吞吐量=IOPS乘以平均IO SIZE。 Io size越大,IOPS越高,每秒IO吞吐量就越高。设磁头每秒读写数据速度为V,V为定值。则IOPS=IO并发系数/(寻道时间+IO SIZE/V),代入,得每秒IO吞吐量=IO并发系数乘IO SIZE乘V/(V乘寻道时间+IO SIZE)。我们可以看出影响每秒IO吞吐量的最大因素,就是IO SIZE和寻道时间,IO SIZE越大,寻道时间越小,吞吐量越高。相比能显著影响IOPS的因素,只有一个,就是寻道时间。

MongoDB磁盘IO问题的3种解决方法

1.使用组合式的大文档

我们知道MonGoDB是一个文档数据库,其每一条记录都是一个JSON格式的文档。比如像下面的例子,每一天会生成一条这样的统计数据:

  { metric: content_count, client: 5, value: 51, date: ISODate(2012-04-01 13:00) }

  { metric: content_count, client: 5, value: 49, date: ISODate(2012-04-02 13:00) }

而如果采用组合式大文档的话,就可以这样将一个月的数据全部存到一条记录里:

  { metric: content_count, client: 5, month: 2012-04, 1: 51, 2: 49, ... }

通过上面两种方式存储,预先一共存储大约7GB的数据(机器只有1.7GB的内存),测试读取一年信息,这二者的读性能差别很明显:

  第一种: 1.6秒

  第二种: 0.3秒

  那么问题在哪里呢?

实际上原因是组合式的存储在读取数据的时候,可以读取更少的文档数量。而读取文档如果不能完全在内存中的话,其代价主要是被花在磁盘seek上,第一种存储方式在获取一年数据时,需要读取的文档数更多,所以磁盘seek的数量也越多。所以更慢。

实际上MongoDB的知名使用者foursquare就大量采用这种方式来提升读性能。

2.采用特殊的索引结构

我们知道,MongoDB和传统数据库一样,都是采用B树作为索引数据结构。对于树形的索引来说,保存热数据使用到的索引在存储上越集中,索引浪费掉的内存也越小。所以我们对比下面两种索引结构:

  db.metrics.ensureIndex({ metric: 1, client: 1, date: 1}) 与 db.metrics.ensureIndex({ date: 1, metric: 1, client: 1 })

采用这两种不同的结构,在插入性能上的差别也很明显。

当采用第一种结构时,数据量在2千万以下时,能够基本保持10k/s 的插入速度,而当数据量再增大,其插入速度就会慢慢降低到2.5k/s,当数据量再增大时,其性能可能会更低。

而采用第二种结构时,插入速度能够基本稳定在10k/s。

其原因是第二种结构将date字段放在了索引的第一位,这样在构建索引时,新数据更新索引时,不是在中间去更新的,只是在索引的尾巴处进行修改。那些插入时间过早的索引在后续的插入操作中几乎不需要进行修改。而第一种情况下,由于date字段不在最前面,所以其索引更新经常是发生在树结构的中间,导致索引结构会经常进行大规模的变化。

3.预留空间

与第1点相同,这一点同样是考虑到传统机械硬盘的主要操作时间是花在磁盘seek操作上。

比如还是拿第1点中的例子来说,我们在插入数据的时候,预先将这一年的数据需要的空间都一次性插入。这能保证我们这一年12个月的数据是在一条记录中,是顺序存储在磁盘上的,那么在读取的时候,我们可能只需要一次对磁盘的顺序读操作就能够读到一年的数据,相比前面的12次读取来说,磁盘seek也只有一次。

  db.metrics.insert([

  { metric: content_count, client: 3, date: 2012-01, 0: 0, 1: 0, 2: 0, ... }

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  { .................................., date:

  ])

结果:

  如果不采用预留空间的方式,读取一年的记录需要62ms

  如果采用预留空间的方式,读取一年的记录只需要6.6ms

以上是“如何解决MongoDB磁盘IO问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: 如何解决MongoDB磁盘IO问题

本文链接: https://lsjlt.com/news/57127.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何解决MongoDB磁盘IO问题
    小编给大家分享一下如何解决MongoDB磁盘IO问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!IO概念在数据库优化和存储规划...
    99+
    2024-04-02
  • 如何解决Linux磁盘配额配置问题
    这篇文章主要介绍了如何解决Linux磁盘配额配置问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。查看quota软件包是否安装#rpm -q quota修改配置文件“fsta...
    99+
    2023-06-17
  • 如何使用Performance Schema诊断磁盘IO很高的问题
    这篇文章主要介绍如何使用Performance Schema诊断磁盘IO很高的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! --运行基准测试,-w...
    99+
    2024-04-02
  • windows中请将磁盘插入u盘问题如何解决
    这篇“windows中请将磁盘插入u盘问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“windows中请将磁盘插入...
    99+
    2023-07-02
  • RedHat虚拟机打不开磁盘问题如何解决?
    RedHat虚拟机打不开磁盘问题,锁定文件失败,打不开磁盘“D:\Documents\Virtual Machines\Red Hat 116\Red Hat 116.vmdk”或它所依赖的某个快照磁盘...
    99+
    2022-05-18
    RedHat 磁盘
  • oracle中如何解决asm磁盘添加失败问题
    这篇文章将为大家详细讲解有关oracle中如何解决asm磁盘添加失败问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 生产环境存储划盘并做...
    99+
    2024-04-02
  • windows无法访问磁盘如何解决
    如果Windows无法访问磁盘,可能是由于以下原因:1. 磁盘驱动器故障:检查磁盘驱动器是否正常工作,可以尝试更换数据线或连接到另一...
    99+
    2023-09-01
    windows
  • win10无法访问磁盘如何解决
    如果在Windows 10中无法访问磁盘,可以尝试以下解决方法:1. 检查磁盘连接:确保磁盘正确连接到计算机,并且连接稳定。可以尝试...
    99+
    2023-09-14
    win10
  • ubuntu磁盘不能访问如何解决
    本篇内容主要讲解“ubuntu磁盘不能访问如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ubuntu磁盘不能访问如何解决”吧!报错形式:不能访问 107 GB 卷Error m...
    99+
    2023-07-04
  • 如何解决overlay2存储驱动的磁盘配额问题
    这篇文章主要为大家展示了“如何解决overlay2存储驱动的磁盘配额问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决overlay2存储驱动的磁盘配额问题”这篇文章吧。为啥要用over...
    99+
    2023-06-04
  • win7无法访问该磁盘如何解决
    出现Win7无法访问磁盘的问题可能是由于以下几种原因造成的:1. 权限问题:您可能没有足够的权限访问该磁盘。您可以尝试以管理员身份登...
    99+
    2023-08-28
    win7
  • 如何解决计算机中磁盘被写保护的问题
    这篇文章主要介绍了如何解决计算机中磁盘被写保护的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。方法一 修改注册表1 在开始菜单栏的搜索框输入“regedit”,打开注册表...
    99+
    2023-06-13
  • 如何进行磁盘IO性能监控
    今天就跟大家聊聊有关如何进行磁盘IO性能监控,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。windows命令行下如何查看磁盘空间大小文章分类:操作系统 查看所有 wmic DiskD...
    99+
    2023-06-06
  • win10磁盘100%如何解决
    当Windows 10的磁盘使用率达到100%时,可能会导致系统运行缓慢,因此需要采取一些措施来解决这个问题。以下是一些可能有用的解...
    99+
    2023-08-21
    win10
  • win7本地磁盘拒绝访问如何解决
    要解决Win 7本地磁盘拒绝访问的问题,可以尝试以下几种方法:1. 检查权限:右键点击受影响的文件或文件夹,选择“属性”,然后进入“...
    99+
    2023-09-14
    win7
  • 如何解决磁盘写满导致MySQL复制失败的问题
    小编给大家分享一下如何解决磁盘写满导致MySQL复制失败的问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!案例场景     &nb...
    99+
    2023-06-14
  • 图文详解XP升Win8磁盘问题解决方法
    安win8可能遇到磁盘分区问题   Win8正式版已经发布多时了,很多用户都希望能将原有的系统(Windows XP、windows7)升级到最新的win8正版,升级的具体方法包括通过Win8启动盘(制作U...
    99+
    2022-06-04
    解决方法 磁盘 详解
  • 如何解决MongoDB游标超时问题
    这篇文章给大家分享的是有关如何解决MongoDB游标超时问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。当我们使用Python从MongoDB里面读取数据时,可能会这样写代码:...
    99+
    2024-04-02
  • 如何解决Oracle12c单实例环境无法创建asm磁盘组问题
    这篇文章给大家分享的是有关如何解决Oracle12c单实例环境无法创建asm磁盘组问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 Oracle12c单实例数据库通过asm进...
    99+
    2024-04-02
  • win10共享磁盘没有权限访问如何解决
    要解决Windows 10共享磁盘没有权限访问的问题,可以尝试以下方法:1. 确保共享磁盘的权限设置正确:右键点击要共享的磁盘,选择...
    99+
    2023-10-08
    win10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作