磁盘I/O

当MongoDB通过内存中的数据结构执行所有读取和写入操作时,数据将保留在磁盘上,并且对内存中尚未存在的数据的查询会触发对磁盘的读取。 结果,存储子系统的性能是任何系统的关键方面。 当性能是系统的主要目标时,用户应小心使用高性能存储,并避免使用网络存储。以下注意事项将帮助您使用最佳的存储配置,包括操作系统和文件系统设置。

对于WiredTiger,预读大小应设置为0 使用WiredTiger存储引擎时,请使用blockdev --setra <值>命令将预读块大小设置为0。 使用MMAPv1时,预读值通常为32(16 kB)。 如果预读大小大于请求的数据大小,则将从磁盘读取更大的块-这很浪费,因为MongoDB中的大多数磁盘I / O是随机的。 这有两个不良后果,会对性能产生负面影响: 1.读取的大小会不必要地消耗RAM。 2.读取数据将花费不必要的时间。

使用XFS文件系统; 避免EXT3 EXT3已经过时了,对于大多数数据库工作负载而言并不是最佳选择。 对于WiredTiger存储引擎,强烈建议使用XFS,以避免将EXT4与WiredTiger一起使用时出现的性能问题。

禁用访问时间设置 大多数文件系统将在上次访问文件时保留元数据。 尽管这对于某些应用程序可能有用,但是在数据库中,这意味着文件系统每次数据库访问页面时都会发出写操作,这会对系统的性能和吞吐量产生负面影响。

不要使用大页面 不要使用“大页面”虚拟内存页面,MongoDB在普通虚拟内存页面上的性能会更好。

使用RAID10 大多数MongoDB部署应使用RAID-10。 RAID-5和RAID-6有局限性,可能无法提供足够的性能。 RAID-0提供良好的读写性能,但容错能力不足。 MongoDB的副本集允许部署为数据提供更强的可用性,并应考虑RAID和其他因素来满足所需的SLA可用性。 通过为日志文件和数据文件使用单独的存储设备,可以提高磁盘子系统的整体吞吐量。 由于日志文件的磁盘I / O往往是顺序的,因此SSD可能无法提供实质性的改进,而标准旋转磁盘可能更具成本效益。

将多个设备用于不同的数据库–WiredTiger 设置directoryForIndexes,以便将索引存储在集合和directoryPerDB的不同目录中,以便为每个数据库使用不同的目录。 然后可以将各种目录映射到不同的存储设备,从而提高整体吞吐量。

请注意,由于文件将位于不同的设备和卷上,因此使用不同的存储设备将影响您创建数据的快照式备份的能力。

使用MongoDB区域实现多温度存储和数据本地化。 MongoDB区域可精确控制数据的物理存储位置,从而适应各种部署方案-例如,按地理位置,按硬件配置或按应用程序。 管理员可以通过修改分片键范围来不断完善数据放置规则,MongoDB会自动将数据迁移到其新区域。

Last updated