![PostgreSQL 高性能设置](https://linux22.com/image/543750/PostgreSQL%20%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%BE%E7%BD%AE.png)
我正在设置具有以下规格的服务器:
* 4 个处理器(每个 AMD Opterons 有 12 个核心)
* 32 GB 内存
* 8 个 HDD(15K SAS 双端口)
* CentOS 5.5
* JBoss
* PostgreSQL
以后我可能会将应用程序与数据库分开,但目前它们将位于同一台机器上。我了解到 PostgreSQL 性能受益于:
* RAID 10
* 单独的 OS 分区
* 单独的 xlog 分区
* 单独的 pgdata 分区
由于我的单个 RAID 10 卷似乎总共有 559808 MB 可用,因此当前的分区计划如下:
* 337856 MB 用于 OS
* 102400 MB 用于 pgdata
* 51200 MB 用于 xlog
* 68352 MB 用于交换
以下是一些问题:
* 我的分区计划是什么样的?
* 安装 CentOS 时,当我进入磁盘设置步骤时,我需要定义挂载点 - 我应该为 pgdata 分区输入什么?(例如 ref此示例设置挂载点 /pgdata1)
* 我应该输入什么作为 xlog 分区的挂载点?
* 对于文件系统类型,避免损坏比完美的性能更重要,因此计划是使用“noatime”,但保留“data = ordered”作为分区挂载选项 - 您认为怎样?
* 还有其他考虑吗?
注意:在未来几年内,pgdata 分区中所有数据库的总大小可能不会超过 20 GB。
答案1
好吧,让我们面对现实。正在使用的数据库 + 应用服务器实际上不应该交换。现在,我理解“交换出未使用的东西,例如内核的部分等”,但 64gb 交换空间太荒谬了。计算机不可能以合理的方式以不错的速度利用它。耗时太长。减少它。很重要。非常重要。比如 8gb 左右。也许是 12 或 16。但根本无法远程利用您当前分配的 64gb。
希望您的服务器在计算方面有很多工作要做,因为虽然不差,但它并不是高性能数据库服务器。坏消息。真的是坏消息。一个 raid 10 用于所有共享内容 - 不是一个好主意。但 6 个磁盘不是高性能 15k 或不是。我这里有一个较小的数据库服务器,在 RAID 10 中有 6 个磁盘仅用于数据。无论您做什么,从事务角度来看,除非您执行 OLAP,否则您将再次受到磁盘性能的限制。磁盘子系统无法推动一个 12 核处理器,其中 4 个是绝对不可能的。在大多数情况下,单个 4 核会使磁盘过载。真的,最好在计算方面做点什么。
建议:
- 为日志添加另一个 SSD。这非常快,响应时间也非常快。数据库需要尽快将更改写入磁盘,在某些情况下,这是“注销并刷新”的。
确保你买的东西是你需要的。我知道 Java 可能很耗资源,但从这些方面来看?你真的需要 48 个核心吗?Centos 能很好地处理这个问题吗?Linux 确实存在核心太多的问题。现在,我知道这些时代已经基本过去了,但 48 个核心可能相当吃力。我真的很喜欢功能强大的服务器,但当我通常使用数据库时,它们的大小是 4 位数以上(1000+gb),磁盘子系统至少有 10 个,通常有超过 1000 个磁盘,才能为这个怪物提供所需的 IO 预算。OR 服务器用于虚拟化。
可能需要添加更多 RAM。32GB 听起来很令人印象深刻,但对于 48 个核心来说,这个数字对我来说有点偏低。我更喜欢每个核心至少使用 1-2 GB。
- 如果您选择 AMD,请记得在处理器之间拆分模块;)
答案2
- ++ TomTom 写了什么。
- 据我所知,对数据/xlog/OS 进行单独分区的原因是为了将它们放在不同的主轴组上——我不明白如何将它们全部放在同一个 RAID 组上来实现这一点。
- 尽管 PostgreSQL 确实可以很好地扩展到多个核心,但 48 个核心似乎有点过头了。
- 还有核心速度的问题。据我所知:核心数量越多,单个核心的速度越慢——核心数量越少但速度越快,可能对你更有利。
那里有一本书,PostgreSQL 9.0 高性能它很好地涵盖了高性能 PostgreSQL 的来龙去脉。
答案3
将单个大型 RAID10 卷拆分为多个分区毫无用处。操作系统、WAL 和数据库驱动器的磁盘使用模式非常不同,因此将它们放在单独的磁盘使 PostgreSQL 更快。例如,WAL 都是顺序写入,因此拥有专用驱动器可以解决许多问题。在同一个大驱动器卷上设置单独的分区并不能以同样的方式提高性能。
但最终这并不重要,因为您的数据集相对于服务器上的 RAM 数量来说非常小。您实际上根本不需要高性能磁盘设置来实现这一点,只需要快速的 CPU 和 RAM。
你没有提到的一件事是你使用的 RAID 控制器是什么,以及你是否有电池来为缓存提供备份。这比分区琐事重要得多。请参阅可靠写入点击此处查看更多背景信息的链接。
答案4
标准的性能答案是“测试一下”。因此,如果你可以在负载下尝试几种不同的配置,看看哪一个是最好的为您的数据负载那将是“正确”的配置。
使用 20GB 的数据库,您可以将(几乎)所有数据库放入文件系统缓存和/或 Postgresql 缓冲区缓存中。服务器预热后,您甚至可能没有那么多物理 IO。
也许一个好的开始是为操作系统创建一个 2 磁盘 RAID 1 镜像,并使用 RAID 10 阵列中的其他 6 个磁盘作为 pgdata + swap。除非您有数据要备份,否则我认为没有必要将 xlogs 和 pgdata 分开。如果您确实需要,此设置至少允许您将日志移动到镜像驱动器。
安装选项也是如此。noatime 几乎总是一个很好的主意,但是其他的我都会保留,直到你需要它为止。
在 CentOS / RHEL 中需要注意的一件事是 LVM。这可能值得再问一个问题,但我从不使用 LVM,而是创建普通的 ext3 分区。(我真的希望你指的是磁盘的硬件 RAID,而不是 LVM RAID)