Postgres 性能问题

2024-05-24

我们正在运行 Postgres 9.1.3,最近我们的一台服务器开始遇到重大性能问题。

我们的查询在一段时间内运行良好,但截至 8 月 1 日,速度显着减慢。看起来大多数有问题的查询都是 Select 查询(带有 count(*) 的查询尤其糟糕),但总的来说,数据库运行速度非常慢。

We ran this http://wiki.postgresql.org/wiki/Server_Configuration在服务器上查询,这些是我们对默认配置文件所做的更改(注意:服务器之前在这些更改下运行良好,因此,它们可能并不重要):

       name            |                                                current_setting
---------------------------+---------------------------------------------------------------------------------------------------------------
version                   | PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by  gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51), 64-bit
autovacuum                | off
bgwriter_delay            | 20ms
checkpoint_segments       | 6
checkpoint_warning        | 0
client_encoding           | UTF8
default_statistics_target | 1000
effective_cache_size      | 4778MB
effective_io_concurrency  | 2
fsync                     | off
full_page_writes          | off
lc_collate                | en_US.UTF-8
lc_ctype                  | en_US.UTF-8
listen_addresses          | *
maintenance_work_mem      | 1GB
max_connections           | 100
max_stack_depth           | 2MB
port                      | 5432
random_page_cost          | 2
server_encoding           | UTF8
shared_buffers            | 1792MB
synchronous_commit        | off
temp_buffers              | 16MB
TimeZone                  | US/Eastern
wal_buffers               | 16MB
wal_level                 | minimal
wal_writer_delay          | 10ms
work_mem                  | 16MB
(28 rows)

Time: 210.231 ms

通常,当出现此类问题时,人们建议的第一件事就是吸尘,我们已经尝试过。我们对大部分数据库进行了真空分析,但没有帮助。

We used Explain在我们的一些查询中,我们注意到 Postgres 正在诉诸顺序扫描,即使表有索引。

我们关闭顺序扫描以强制查询规划器使用索引,但这也没有帮助。

然后我们尝试了this http://wiki.postgresql.org/wiki/Show_database_bloat查询以查看 Postgres 是否有大量未使用的磁盘空间,以便找到它要查找的内容。不幸的是,虽然我们的一些表确实有点大,但它似乎不足以降低整体系统性能。

我们认为速度下降可能与 I/O 有关,但我们无法弄清楚具体细节。 Postgres 是否只是愚蠢?如果是,那是哪一部分?虚拟机有问题,还是物理硬件本身有问题?

对于我们可以尝试或检查的事情,你们还有其他建议吗?

EDIT:

我很抱歉没有早点更新这个。我陷入了其他事情之中。

在这台特定的机器上,通过对虚拟机的设置进行一点小小的修改,我们的性能得到了极大的提高。

有一个处理 IO 缓存的设置。它最初设置为ON。我们认为不断缓存东西会减慢速度,我们是对的。我们把它关掉了,事情有了很大的改善。

有趣的是,我们的大多数其他服务器已经关闭了此设置。

还有其他问题,我相信我们会采纳您的很多建议,所以,非常感谢您的帮助。


你最大的问题是这一行:



autovacuum                | off
  

打开它并不能立即解决问题,但应该可以防止问题进一步恶化。几乎在任何情况下关闭此功能都是一个好主意。主要的例外是大批量加载,然后是显式 VACUUM FREEZE ANALYZE,之后应重新打开 autovacuum。关闭 autovacuum 后,您会发现性能下降,就像您所看到的那样。一旦数据库变得如此糟糕,它需要比 autovacuum 所能提供的更积极的维护来恢复。



checkpoint_segments       | 6
  

增加这个将有助于数据修改,但对提高速度没有太大帮助SELECT声明。



fsync                     | off
full_page_writes          | off
  

这些设置告诉 PostgreSQL 以牺牲持久性为代价来加快写入速度。如果您的硬件或操作系统(或虚拟机)崩溃或突然终止,您的数据库将被损坏,您最好的选择是从上次已知的良好备份进行恢复。 (当然,由于硬件随时可能发生故障,因此如果您担心丢失数据,则需要制定良好的备份策略。)



maintenance_work_mem      | 1GB
  

这对于 8GB 虚拟机来说太高了。在对该连接进行一些繁重的维护之前,您始终可以在单个连接上增强它。



wal_writer_delay          | 10ms
  

即使是经验丰富的专家也很难将其调整为比默认值更好的性能。几乎总是最好不要管它。

此时最好的选择是使用 pg_dumpall 将数据库集群转储到其他介质,从新的 initdb 开始,然后恢复。作为数据库超级用户,运行VACUUM FREEZE ANALYZE (the FREEZE通常不建议除非在像这样的批量加载之后),并在打开 autovacuum 的情况下运行。

我强烈建议您阅读 Greg Smith 的《PostgreSQL 9.0 High Performance》一书,并仔细阅读。 (坦白说,我是这本书的技术审稿人之一,但没有从销售中获得任何收入。)他建议的第一件事就是在安装 PostgreSQL 之前获取 RAM 和磁盘速度的基准数据——即让你知道自己正在处理什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Postgres 性能问题 的相关文章

随机推荐

  • HTML/CSS - 使用图像作为输入类型=文件

    如何使用此图像 http h899310 devhost se proxy newProxy uplfile png http h899310 devhost se proxy newProxy uplfile png 而不是常规的
  • 如何从 Java 中的 Native Android Activity 打开 React Native 应用程序的特定组件?

    Alert 这个问题基本上是关于一种方法 所以不会有任何可用的笔或代码可以共享 I was doing a POC where integrating an RN app into an Android App I did successf
  • Gmail 搜索怎么这么快?

    搜索这么多字符的最有效方法是什么 你怎么认为 假设网站是用 PHP 和 MySQL 构建的 我应该学习什么才能尽可能有效地构建它 有什么我应该学习的算法吗 文本索引算法 https stackoverflow com questions 4
  • 与随机数生成算法相关的种子是什么?为什么经常使用计算机时间来创建该种子?

    我读到了seeds用于初始化随机数生成器 但似乎种子的随机性对于从生成器获得良好的随机性并不重要 所以我想了解什么是seed实际上 为什么这么称呼呢 最后为什么time在计算机系统中是用来生成这样的种子的 伪随机数生成器生成数字序列 它不是
  • Scala+Slick 3:将一个查询的结果插入到另一张表中

    这个问题是关于 slick 3 0 或 3 1 的 我对此很灵活 我有一个中间查询 我用它来处理map for等等以获得我想要的结果 最后我有一个 val foo DBIOAction Seq MySchema Bar NoStream E
  • 相对于时间求平均值

    我有以下带有日期时间和相应值的数据集 时间间隔为每10分钟一次 我需要以 15 分钟的间隔生成新行 例如 15 40 的值为 599 15 50 的值为 594 因此需要在两者之间生成一个新行 即 15 45 的平均值为 599 和 594
  • Polygot 包含 nasm/yasm 和 C 的文件

    我有一堆幻数 我想将它们包含在由 nasm 或 yasm 编译的 C 程序和汇编文件中 在纯 C 语言中 该文件看起来像是一系列定义 例如 define BLESS 55378008 define ANSWER 42 在 nasm 或 ya
  • 在运行时在 FloatingActionButton 上设置layout_anchor

    我正在尝试为固定到我的 AppBarLayout 的 android support design widget FloatingActionButton 制作动画 我可以在布局 xml 中对其进行很好的设置 并且它显示得很好 但是 我正在
  • 如何将小时和分钟数据输入到 ChartJS 中

    我正在尝试使用 Chart js 制作折线图 我的数据的形式为 var result x 18 00 y 230 x 19 00 y 232 x 20 00 y 236 x 22 00 y 228 其中 x 代表时间 包括小时和分钟 我这样
  • 以编程方式为从 XML 创建的现有菜单创建子菜单

    我已经在 xml 中创建了父菜单 现在我不知道如何使用代码在这些父菜单下创建子菜单 这意味着 父菜单在 menu xml 中进行编码 子菜单将在数据可用时基于动态代码加载 当我尝试使用 menu addSubMenu 时 它正在创建一个新的
  • ASP.NET Web 窗体 DropDownList 有一个无效的 SelectedValue,因为它不存在于项目列表中

    首先有个问题 DropDownList 有一个无效的 SelectedValue 因为它不存在于项目列表中 https stackoverflow com questions 1869150 dropdownlist has a selec
  • 如何在 JPA 中使用枚举

    我有一个电影租赁系统的现有数据库 每部电影都有一个评级属性 在 SQL 中 他们使用约束来限制该属性的允许值 CONSTRAINT film rating check CHECK rating text text OR rating tex
  • 仅使用 SQL 进行 Base 36 到 Base 10 的转换

    出现了一种情况 我需要在 SQL 语句的上下文中执行以 36 为基数到以 10 为基数的转换 Oracle 9 或 Oracle 10 中似乎没有内置任何内容来解决此类问题 我的 Google Fu 和 AskTom 建议创建一个 pl s
  • Cython 函数中的字符串

    我想这样做将字符串传递给 Cython 代码 test py s Bonjour myfunc s test pyx def myfunc char mystr cdef int i for i in range len mystr err
  • ReDim 保留“下标超出范围”

    我正在尝试将数据从 2 个双精度数组移动到 2 个不同的双精度数组 我不确定大小是多少 因为我正在从第一个数组中随机抽取样本并将其放入第二个数组中 当我添加 ReDim Preserve 行时 出现下标超出范围错误 Function Cre
  • 如何在 Jinja 中过滤字典?

    我有一个包字典 包名称是key和一些细节的字典是value php7 1 readline latest 7 1 9 1 ubuntu14 04 1 deb sury org 1 origins ppa launchpad net vers
  • WPF DataGrid 的 Items 和 ItemsSource 属性之间有什么区别?

    从我从 Intellisense 收集到的信息来看 区别在于返回类型 并且 ItemsSource 有一个 setter 而 Items 只有一个 getter 但实际上 我不明白这两个属性需要彼此分开 而不仅仅是作为一个属性 有人可以向我
  • 构建流星应用程序后流星无法运行

    好的 我使用命令构建了一个流星应用程序 meteor build bundle debug server https my app url hosted on meteor Meteor 确实使用 cordova android pack
  • 如何找到安全区域的高度和宽度?

    我正在尝试以编程方式为某些标签 按钮和文本字段设置相对于安全区域的高度和宽度的约束 例如 我希望将标签到安全区域顶部的距离设置为安全区域高度的 10 如何检索安全区域的高度和宽度 这是一个合理的方法吗 我的想法是 无论 iOS 设备如何 我
  • Postgres 性能问题

    我们正在运行 Postgres 9 1 3 最近我们的一台服务器开始遇到重大性能问题 我们的查询在一段时间内运行良好 但截至 8 月 1 日 速度显着减慢 看起来大多数有问题的查询都是 Select 查询 带有 count 的查询尤其糟糕