- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正在运行 Postgres 9.1.3,最近我们的其中一台服务器开始遇到严重的性能问题。
我们的查询有一段时间运行良好,但从 8 月 1 日起,速度急剧下降。看起来大多数有问题的查询都是 Select 查询(带有 count(*) 的查询特别糟糕),但一般来说,数据库运行得非常慢。
我们跑了 this在服务器上查询,这些是我们对默认配置文件所做的更改(注意:服务器在这些更改之前运行良好,因此,它们可能无关紧要):
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
通常情况下,当出现此类问题时,人们首先建议的是吸尘,我们已经尝试过。我们对大部分数据库进行了真空分析,但没有帮助。
我们在一些查询中使用了 Explain
并注意到 Postgres 正在求助于顺序扫描,即使表有索引也是如此。
我们关闭顺序扫描以强制查询计划程序使用索引,但这也无济于事。
然后我们尝试了 this查询以查看我们是否有大量未使用的磁盘空间,Postgres 正在经历这些空间以找到它正在寻找的内容。不幸的是,虽然我们的一些表确实有点大,但似乎还不足以降低整体系统性能。
我们认为减速可能与 I/O 相关,但我们无法确定具体细节。 Postgres 只是愚蠢吗?如果是,那是哪一部分?是虚拟机有问题,还是物理硬件本身有问题?
你们对我们可以尝试或检查的事情有任何其他建议吗?
编辑:
很抱歉没有及时更新。我陷入了其他事情。
在这台特定的机器上,通过对虚拟机的设置进行一个小的修改,我们的性能得到了极大的提高。
有一个处理 IO 缓存的设置。它最初设置为 ON。我们认为不断缓存东西会减慢速度,我们是对的。我们把它关掉了,事情有了很大的改善。
有趣的是,我们的大多数其他服务器已经关闭了此设置。
还有其他问题,我相信我们会采纳您的很多建议,非常感谢您的帮助。
最佳答案
你最大的问题是这一行:
autovacuum | off
打开它不会立即解决问题,但它应该可以防止问题进一步恶化。几乎没有关闭此功能的好主意。主要的异常(exception)是大批量加载,然后是显式 VACUUM FREEZE ANALYZE,之后应重新打开 autovacuum。关闭 autovacuum 后,您会看到性能下降,就像您遇到的那样。一旦数据库变得如此糟糕,它需要比 autovacuum 提供的恢复更积极的维护。
checkpoint_segments | 6
增加它有助于数据修改,但对提高 SELECT
语句的速度没有太大作用。
fsync | offfull_page_writes | off
这些设置告诉 PostgreSQL 以牺牲持久性为代价来加速写入。如果您的硬件或操作系统(或虚拟机)崩溃或突然被杀死,您的数据库将被破坏,您最好的选择是从您最后一次已知的良好备份中恢复。 (当然,由于硬件随时都可能发生故障,如果您担心丢失数据,则可以采取良好的备份策略。)
maintenance_work_mem | 1GB
这对于 8GB VM 来说太高了。在对该连接进行大量维护之前,您始终可以在单个连接上提升它。
wal_writer_delay | 10ms
即使是经验丰富的专家也很难将其调整为比默认设置更好的性能。它几乎总是最好单独放置。
此时你最好的选择是使用 pg_dumpall 将你的数据库集群转储到其他介质,从一个新的 initdb 开始,然后恢复。作为数据库 super 用户,运行 VACUUM FREEZE ANALYZE
(通常不推荐使用 FREEZE
,除非在像这样的批量加载之后),并在打开 autovacuum 的情况下运行。
我强烈建议您获得 Greg Smith 的“PostgreSQL 9.0 High Performance”一书的副本,并仔细阅读。 (完全公开,我是这本书的技术审阅者之一,但没有从销售中获利。)他建议的第一件事就是在安装 PostgreSQL 之前获取 RAM 和磁盘速度的基准数据——那您知道自己在处理什么的方式。
关于performance - Postgres 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11940515/
我想知道这里是否有人有安装 Postgres-XL 的经验,新的开源多线程版本的 PostgreSQL。我计划将一组 1-2 TB 的数据库从常规 Postgres 9.3 迁移到 XL,并且想知道这
我想创建一个 postgres 备份脚本,但我不想使用 postgres 用户,因为我所在的 unix 系统几乎没有限制。我想要做的是在 crontab 上以 unix 系统(网络)的普通用户身份运行
我正在尝试编写一个 node-postgres 查询,它采用一个整数作为参数在间隔中使用: const query = { text: `SELECT foo
如何在不使用 gui 的情况下停止特定的 Postgres.app 集群。 我想使用 bash/Terminal.app 而不是 gui 我还应该指出,Postgres 应用程序有一个这样的菜单 如果
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
我正在使用 docker 运行 Postgres 图像。它曾经在 Windows10 和 Ubuntu 18.04 上运行没有任何问题。 在 Ubuntu 系统上重新克隆项目后,它在运行 docker
我正在使用 python(比如表 A)将批处理 csv 文件加载到 postgres。我正在使用 pandas 将数据上传到更快的 block 中。 for chunk in pd.read_csv(
所以是的,标题说明了一切,我需要以某种方式将 DB 从源服务器获取到新服务器,但更重要的是旧服务器正在崩溃 :P 有什么方法可以将它全部移动到新服务器并导入它? 旧服务器只是拒绝再运行 Postgre
这主要是出于好奇而提出的问题。我正在浏览 Postgres systemd 单元文件,以了解 systemd 可以做什么。 Postgres 有两个 systemd 单元文件。一个用于代替 syste
从我在 pg_hba.conf 中读到的内容,我推断,为了确保提示我输入 postgres 用户的密码,我应该从当前的“对等”编辑 pg_hba.conf 的前两个条目的方法'到'密码'或'md5',
我已连接到架构 apm。 尝试执行函数并出现以下错误: ERROR: user mapping not found for "postgres" 数据库连接信息说: apm on postgres@
我在 ubuntu 12.04 服务器上,我正在尝试安装 postgresql。截至目前,我已成功安装它但无法配置它。我需要创建一个角色才能继续前进,我在终端中运行了这个命令: root@hostna
我无法以“postgres”用户身份登录到“postgres”数据库。操作系统:REHL 服务器版本 6.3PostgreSQL 版本:8.4有一个数据库“jiradb”用作 JIRA 6.0.8 的
我正在尝试将现有数据库导入 postgres docker 容器。 这就是我的处理方式: docker run --name pg-docker -e POSTGRES_PASSWORD=*****
我们的 Web 应用程序在 postgres 9.3 和 Grails 2.5.3 上运行。当我们重新启动 postgres (/etc/init.d/postgresql restart) 并访问网
我想构建 postgres docker 容器来测试一些问题。我有: postgres 文件的归档文件夹(/var/lib/postgres/data/) 将文件夹放入 docker postgres
我有一个名为“stuff”的表,其中有一个名为“tags”的 json 列,用于存储标签列表,还有一个名为“id”的列,它是表中每一行的主键。我正在使用 postgres 数据库。例如,一行看起来像这
我对 sqlalchemy-psql 中的锁定机制是如何工作的感到非常困惑。我正在运行一个带有 sqlalchemy 和 postgres 的 python-flask 应用程序。由于我有多个线程处理
我(必须)使用 Postgres 8.4 数据库。在这个数据库中,我创建了一个函数: CREATE OR REPLACE FUNCTION counter (mindate timestamptz,m
我已经使用 PostgreSQL 几天了,它运行良好。我一直在通过默认的 postgres 数据库用户和另一个具有权限的用户使用它。 今天中午(在一切正常之后)它停止工作,我再也无法回到数据库中。我会
我是一名优秀的程序员,十分优秀!