我正在尝试修复 PostgreSQL CPU 使用率过高的问题。我们使用的是 PostgreSQL 8.0.9,当我们的 JEE Web 应用程序(在 JBoss 中)在某些负载增加条件下使用时,top 显示 PostgreSQL 的进程缓慢增加。出现问题时,大约有 12-15 个 PostgreSQL 进程,所有进程信息最右侧都显示 SELECT,每个进程的 CPU 使用率约为 6-7%,然后应用程序的速度会大大降低。JBoss
版本:JBoss(MX MicroKernel)4.0.3
操作系统:CentOS Linux 5.5
内核和 CPU:x86_64 上的 Linux 2.6.18-194.26.1.el5
处理器信息:2 x Intel(R) Xeon(R) CPU E5420 @ 2.50GHz,8 核
目前,我们的想法是投入更多硬件。如果我们这样做,最好的选择是下面的选项 A 还是选项 B?
选项 A:4 个 AMD Opteron™ 6100 系列处理器,每个处理器有 12 个核心
选项 B:4 个 Intel® Xeon® 7500 系列处理器,每个处理器有 8 个核心
是否可以假设 CentOS Linux 5.5 和 PostgreSQL 8.0.9 会随着添加这么多处理器和核心而按比例扩展(例如 4 个处理器,每个处理器有 12 个核心)?在投入更多硬件方面,我还应该考虑其他什么吗?
答案1
这个问题无法回答,我们不知道发生了什么。你说的是 12-15 个连接,这几乎是零。但是,当执行非常复杂的查询,或使用错误的数据库架构、缺少索引等时,CPU 使用率随时可能上升。
版本 8.0.9 存在严重问题,8.0 已于 2010 年 10 月停止使用,最新修复版本为 8.0.26(8.0.9 之后 4 年内修复了错误)。您至少应该更新到此版本,以修复 8.0 中的许多错误。
开始记录查询,使用 EXPLAIN 查看查询计划,查看 VACUUM,并且可能还需要 REINDEX。您的硬件目前看起来不错,您首先必须找到问题的根源。
考虑雇用一名 PostgreSQL dba 几天。
答案2
如果显示 CPU 使用率较高,则可能是由于查询速度慢。我建议启用慢查询日志记录功能postmaster.conf
并检查耗时超过应有时间的查询。
还有一种可能是您受到 I/O 限制,因为磁盘速度慢很容易导致查询开始备份。我建议安装htop
并检查您的 CPU 等待时间中有多少百分比归因于 iowait。
除此之外,我强烈建议升级到最新版本。自 8.0 以来,性能有了很大的改进,当前稳定版本(撰写本文时为 9.0.x)在EXPLAIN VERBOSE ANALYZE
查询时提供了更多信息。
一般来说(在其他所有条件相同的情况下),随着核心的增加,PostgreSQL 的扩展性非常好(每个额外的核心可以使性能提高大约 96%(理论上每个额外的核心可以提高 100% 的性能))。
然而我最初的直觉是你的磁盘无法跟上。
答案3
我认为你会从这本书中受益PostgreSQL 9.0 高性能。它以 PDF 格式(即时下载)和纸质格式提供。
我们刚刚按照本书的建议重建了我们的数据库。我们的新数据库比旧数据库好多了,而且我们不需要花很多钱。书中有专门针对您每个问题的章节。书中有答案,但更好的是,书中还有方法(如何测量硬件以了解其速度有多快?)
我不是 Postgresql 专家,但我会告诉你我所了解的有关硬件和 Postgresql 的知识。你的情况可能会有所不同。
一般来说,对于我使用过的数据库来说,比 CPU 的数量和速度更重要的是:
- 足够的 RAM。数据库消耗内存就像酒鬼喝劣质酒一样。
- I/O 带宽。数据库喜欢 I/O。
使用 RAID 可以获得 I/O 带宽。RAID10 非常适合处理大量 Postgresql 数据。驱动器越多,性能越好。如果可以,请将 xlog 放在单独的设备上。那个可以是 RAID1。使用带有电池备份缓存的硬件 RAID 卡将为您提供最佳性能。
答案4
我最近在一个小型数据库(7 个表,30 MB)上遇到了类似的问题,查询有很多连接。这台机器是一台具有 2GB RAM 的虚拟机,似乎总是使用不到 160MB。它运行得非常快,直到我们添加了大约 1M 的新数据。然后服务器(8.4.5)开始在 5 秒到 30 分钟内达到 100% 的 CPU 占用率,而同样的查询都是亚秒级的。
我们设法通过服务器升级解决了这个问题。对 8.4.9 和 8.4.12 的测试没有发现不良行为(但 8.4.8 有)。