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

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

如果你正在寻找一个关于一般文件系统/数据库性能的问题, 这篇文章有一些很好的信息。

不过,我想尽可能多的插入性能的build议,反对阅读性能。 感谢所有伟大的答案!

购买Greg Smith的“postgresql高性能”副本。 这是一本很棒的书,有两个或两个以上的章节是关于磁盘硬件和文件系统的。 你会学到很多。

总之:没有简短的答案。

但是我会试着去总结一下:

  • 除非你知道你在做什么,否则不要使用ext2。
  • 由于fsync调用,ext3要小心检查点尖峰,请参阅113和82页和79页
  • 使用ext4或xfs
  • 还有其他的select

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

首先,你首先需要一个可靠的文件系统,而且要快一秒。 这排除了一些选项…

性能testing表明,XFS经常会提供最好的性能。 一旦你达到磁盘非常接近完整的情况,就会有一些稳定性问题,但只要你监控不到的情况,它会给你稍微更好的性能。

理论上你不需要为pg_xlog目录设置日志文件系统,但是速度的差别通常很小,不值得。 对于数据目录,你应该总是有一个元数据日志文件系统。

数据库pipe理系统通过数据库日志实现自己的日志logging,因此在一个日志文件系统上安装这样一个DBMS通过两种机制来降低性能:

  1. 冗余日志会增加磁盘活动的数量

  2. 物理磁盘布局可能是碎片化的(尽pipe一些日志文件系统确实有机制来清理它)。

  3. 大量的磁盘活动可能会填满日志,导致虚假的“磁盘已满”状况。

几年前,我在一个HP / UX盒子上的Baan安装中看到了一个实例,它是在LFS文件系统上完成的。 系统有性能问题和数据损坏问题,直到有人确定文件系统是用LFS格式化的。

容纳数据库文件的卷通常会有less量的大文件。 DBMS服务器通常会有一个设置,用于configuration单个I / O中读取块的数量。 较小的数字将适用于大容量事务处理系统,因为它们会尽量减less冗余数据的caching。 较大的数字将适用于诸如数据仓库之类的系统,这些系统进行了大量的后续读取。 如果可能的话,将您的文件系统分配块大小调整为与DBMS所设置的多块读取大小相同。

一些数据库pipe理系统可以处理原始磁盘分区。 这样可以获得不同程度的性能增益,对于拥有大量内存的现代系统来说,这样做通常要less一些。 在用较less空间来caching文件系统元数据的较旧系统上,磁盘I / O的节省相当显着。 原始分区使系统难以pipe理,但提供了最佳的性能。

与RAID-10卷相比,RAID-5卷会产生更多的写入开销,因此拥有大量写入stream量的繁忙数据库在RAID-10上性能会更好(通常要好得多)。 日志应该放在物理上独立的磁盘卷上的数据。 如果数据库很大,而且大部分是只读的(例如数据仓库),那么如果这不会不当地减慢加载过程,则可能会将其放在RAID-5卷上。

在控制器上回写caching可以给你一个性能上的胜利,但是会造成一些数据可能被损坏的(不太可能但可能的)失败模式。 对此的最大的性能胜利是高度随机访问负载。 如果要执行此操作,请考虑将日志放在单独的控制器上,并禁用日志卷上的写回caching。 日志将具有更好的数据完整性,单一故障无法取出日志和数据卷。 这使您可以从备份中恢复,并从日志中前滚。

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

执行摘要:我使用了pgbench。 Linux I / O调度器对性能和文件系统的重要性不大。 所以,如果你很匆忙,只要select默认即可。 我select了JFS。

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

几个月前我做了一些testing:

我有一个小的testing程序,创build了50个线程,其中每个线程将1000个(或者10000个)行插入同一个表中。

  • 在EXT3和4磁盘RAID5上的数据库花了50秒。
  • 使用虚拟盘上的表(使用表空间)它仍然花费了50秒。 它不是更快的原因是,所有的东西都logging在pg_xlog目录中,这个目录仍然在同一个RAID 5上。
  • 我把pg_xlog移到了4个磁盘的RAID0(条带),同样的程序在40秒内运行。
  • 出于testing的目的,我将pg_xlog移动到了ramdisk上,并将EXT3 4磁盘RAID上的所有内容都放在了一起。 该程序在不到5秒后完成。

但在软件ramdisk上使用pg___xlog不是一种select:如果丢失了pg_xlog目录的内容,postgres将不会启动。 (但是有电池备份的硬件ramdisk可能是有趣的。)

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

在壕沟里呆了几年之后,我的回答是ZFS和SmartOS。

这里是关于基准的一篇论文: https : //www.joyent.com/public-cloud/benchmarks/postgresql

我已经记得,一个经过调整的FreeBSD会给你更多的性能,而不是其他的操作系统。 虽然我相信这个信息已经过时,可能是一个神话。 但是你可以尝试一下,看看这个内核设置指南: http : //developer.postgresql.org/pgdocs/postgres/kernel-resources.html