在PostgreSQL上插入性能最佳的文件系统是什么?


20

我很好奇,是否有人在文件系统和数据库性能之间进行了任何实验或比较。在Linux上,我想知道什么是postgres数据库的最佳文件系统。另外,什么设置(inode等)最适合呢?根据数据库中的数据,这可能会大不相同吗?

如果您正在寻找与一般文件系统/数据库性能有关的问题,则此帖子有一些不错的信息。

但是,我想获得有关插入性能而不是读取性能的尽可能多的建议。感谢您提供的所有出色答案!


7
最好的文件系统将是更多的内存?;)
Oskar Duveborn

2
奥斯卡+1。我们只是从服务器配置(RAM约占数据库总大小的33%)转到新计算机,其中总RAM大于数据库的大小。现在我们可以将整个数据库缓存在内存中。我们最慢的SQL查询现在快了2个数量级。
KevinRae

Answers:


14

购买Greg Smith的“ postgresql high performance”副本。这是一本很棒的书,有两个或两个以上的章节是关于磁盘硬件和文件系统的。您将学到很多东西。

简而言之:没有简短的答案。

但我会尝试总结一下:

  • 在知道自己在做什么之前,请勿使用ext2。
  • 使用ext3时,请注意由于fsync调用而导致的检查点峰值,请参阅第113和82和79页
  • 使用ext4或xfs
  • 还有其他选择

但是,当您真正问自己要使用什么FS时,您应该阅读本书!


4
同意,这是Greg很好介绍的主题。如果您想在借阅或购买本书之前进行评估,请访问packtpub.com/sites/default/files/…中的示例章节。
sciurus

1
有趣的是,当我遇到这个问题时,这本书并不存在。现在,我非常感谢格雷格在那本书中所做的努力。
伊莱贾

为了纪念这项伟大的工作,我买了另一本:-)
Janning

6

首先,您首先需要一个可靠的文件系统,然后又要一个快速的文件系统。哪些排除某些选项...

性能测试表明,XFS通常会提供最佳性能。一旦您遇到磁盘非常接近完全使用的情况,它就会有一些稳定性问题,但是只要您监视未发生的情况,它就会为您带来更好的性能。

从理论上讲,pg_xlog目录不需要日志文件系统,但是速度差异通常很小,因此不值得。对于数据目录,您实际上应该始终具有元数据日记文件系统。


4
您可能想/ not /使用XFS存储数据库,即因为它会(在需要时)将无法恢复的块清零。
艾利·佩恩

4

数据库管理系统通过数据库日志实现自己的日志记录,因此在日志文件系统上安装这样的DBMS会通过以下两种机制降低性能:

  1. 冗余日志记录增加了磁盘活动量

  2. 物理磁盘布局可能是零散的(尽管某些日志文件系统确实具有清除此问题的机制)。

  3. 许多磁盘活动可能会填满日志,从而导致虚假的“磁盘已满”情况。

几年前,我见过一个实例,该实例是在HP / UX盒上的Baan安装上的LFS文件系统上完成的。该系统具有持续的性能和数据损坏问题,直到有人弄清楚文件系统已使用LFS格式化后,该问题才得以诊断。

存放数据库文件的卷通常会有少量的大文件。DBMS服务器通常具有一个配置,该设置配置在一个I / O中读取多少个块。较小的数量将适用于大容量交易处理系统,因为它们将最大限度地减少冗余数据的缓存。对于执行大量连续读取的数据仓库等系统,较大的数量将是合适的。如果可能,请将文件系统分配块的大小调整为与DBMS设置为多块读取的大小相同。

一些数据库管理系统可以处理原始磁盘分区。这会带来不同程度的性能提升,通常在具有大量内存的现代系统中会有所降低。在具有较少空间来缓存文件系统元数据的较旧系统上,节省的磁盘I / O相当可观。原始分区使系统更难管理,但可提供最佳性能。

RAID-5卷比RAID-10卷产生更多的写开销,因此具有大量写流量的繁忙数据库将在RAID-10上表现更好(通常更好)。日志应在物理上与数据分开放置磁盘卷。如果您的数据库很大且大多是只读的(例如,数据仓库),则可能会导致将其放置在RAID-5卷上的情况,但这不会过分减慢加载过程。

控制器上的回写式缓存可以为您带来性能上的胜利,但需要创建一些(可能不太可能但可能)破坏数据的故障模式。这样做最大的性能优势在于高度随机访问负载。如果要执行此操作,请考虑将日志放在单独的控制器上,并在日志卷上禁用写回缓存。这样,日志将具有更好的数据完整性,并且单个故障无法同时删除日志和数据卷。这使您可以从备份还原并从日志前滚。


日志数据会降低性能;日志化元数据在最坏的情况下应该具有最小的影响,并且很可能几乎没有影响。不建议记录日记元数据。
niXar

我认为您误解了这篇文章。任何文件系统都具有文件系统元数据,任何磁盘流量都将涉及读取或写入该文件系统。现代计算机通常具有足够的RAM,可以轻松地缓存此文件系统元数据,而较旧的计算机则没有。这意味着磁盘访问会产生大量额外的I / O开销(Oracle经常引用的数字表明,原始分区的性能下降了30%),从而读取或更新文件系统的元数据。在具有更多RAM的现代系统上,文件系统元数据更有可能被缓存,因此开销较低。
ConcernedOfTunbridgeWells,2009年

这包含一些很好的一般建议,但我不赞成这样做,因为它还包含与Postgresql和现代日志文件系统无关或不正确的信息。
sciurus

3

我做了这么详细的报告,但只有法文。如果您阅读法文或对自动翻译工具感到满意,则可以重用此方法并自己运行。

摘要:我使用了pgbench。Linux I / O调度程序对性能的重要性很小,而文件系统的重要性则很小。因此,如果您赶时间,只需选择默认值即可。我选择了JFS。


2

文件系统只是问题的一部分。通过更改IO调度程序,可以显着提高性能。幸运的是,这很容易测试,因为您可以随时更改IO调度程序。我建议在典型的负载下尝试几天,然后看看哪个能提供最佳性能。


在更改I / O调度程序时,我的基准测试显示几乎没有变化,这可能是因为每个DBMS已经拥有自己的调度程序。
bortzmeyer

使用截止期限调度程序,MySQL在高负载下可以更好地应对。
David Pashley 2009年

2

几个月前我做了一些测试:

我有一个小的测试程序,该程序创建了50个线程,其中每个线程在同一张表中插入1000行(或者如果是10000行)。

  • 由于数据库位于EXT3和4磁盘RAID5上,因此花费了50秒。
  • 将表放在ramdisk上(使用表空间)后,仍然需要50秒。速度不快的原因是,所有内容都记录在仍位于同一RAID 5的pg_xlog目录中。
  • 我将pg_xlog移到了一个4磁盘RAID0(条带)上,同一程序在40秒内运行。
  • 为了进行测试,我将pg_xlog移到了ramdisk上,并将其他所有东西都放在了EXT3 4磁盘RAID上。不到5秒后程序完成。

但是,将pg___xlog放在软件ramdisk上不是一种选择:如果丢失pg_xlog目录的内容,postgres将不会启动。(但是,可能会感兴趣的是带有电池备份的硬件虚拟磁盘。)

恕我直言:使用最适合数据库文件的文件系统。将pg_xlog(带有符号链接,请参阅文档)移动到最快的设备上。


1
pgbench做类似的事情,大多数安装中都包含。
艾利·佩恩

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.