PostgreSQL解析非常短的查询异常缓慢

时间:2012-03-09 11:17:19

标签: parsing postgresql logging performance

我正在使用Zend Framework(PHP)和postgresql作为会话存储后端。有时我会收到大量这样的日志:

Mar  8 11:07:00 myhost postgres[79149]: [30640132-1] 0 LOG:  00000: duration: 1401.742 ms  parse pdo_stmt_00000005: SELECT "sessions".* FROM "php"."sessions" WHERE ((("sessions"."id" = '3d5tmqutaeuivtf8a1udfa5i04')))
Mar  8 11:07:00 myhost postgres[79150]: [30640151-1] 0 LOG:  00000: duration: 1400.083 ms  parse pdo_stmt_00000007: SELECT "sessions".* FROM "php"."sessions" WHERE ((("sessions"."id" = 'b2vh1r29vnqg1e3600ther40c3')))
Mar  8 11:07:00 myhost postgres[79152]: [30640135-1] 0 LOG:  00000: duration: 1401.261 ms  parse pdo_stmt_00000005: SELECT "sessions".* FROM "php"."sessions" WHERE ((("sessions"."id" = '3d5tmqutaeuivtf8a1udfa5i04')))
Mar  8 11:07:00 myhost postgres[79147]: [30640166-1] 0 LOG:  00000: duration: 1381.648 ms  parse pdo_stmt_00000009: SELECT "sessions".* FROM "php"."sessions" WHERE ((("sessions"."id" = '6uj0955g64mmd9i8ra1q5nbtd5')))

表php.sessions随时有大约500-1000行。

这看起来很奇怪,因为这个语句的执行没有记录得很慢,但解析几乎是“无穷无尽”。

有任何线索吗?有谁知道任何postgres查询解析器速度问题?

一些技术背景:

我在CentOS 6.0上使用PostgreSQL 8.4.9,它是2x 10Core Intel机器,内存为128 GB。在这个时间,Cpu仅使用了20% - 25%。磁盘读/写速度非常快。 log_min_statement = 500

2 个答案:

答案 0 :(得分:2)

这种情况似乎是:许多长期闲置交易,即< IDLE>在交易中。我们设法摆脱了大部分。结果非常出色。

可悲的主要原因是应用程序逻辑存在缺陷。我的意思是部分交易看起来像:

  • 开始
  • 查询
  • 查询
  • 等待
  • ...(很多等待)
  • 等待
  • 提交

由于行版本控制子系统必须保留大量旧版本的行,因此系统的响应速度越来越低(每个简单查询都必须查找适当的行版本)。

答案 1 :(得分:0)

在以下情况下,我在测试框中遇到类似情况:

  • 在服务器上运行CPU繁重的进程;
  • 系统开始将RAM换成磁盘,用于RAM密集型进程。

PostgreSQL依赖于2层数据缓存:

  1. 共享池,通过shared_buffers;
  2. 指定
  3. 通过effective_cache_size指定的操作系统缓存,您能告诉我们您的价值吗?
  4. 为了了解系统的实际情况,您应该监控:

    • CPU使用率;
    • RAM使用情况;
    • IO和交换量。

    通过监视器我的意思不仅仅是查看当前值,而是使用sariostatvmstat之类的工具,结合使用,比如,RRDtool可以更好地进行数据分析。然后查看生成的报告,了解您在简单查询中发现不必要的延迟的时间段。

    我感觉你有IO问题,但是如果不看系统和报告就无法说清楚。

    我建议:

    1. 设置监控并查看生成的报告;
    2. 在类似的框中创建一个备用数据库,以便使用不同的设置。 (我假设您有适当的数据库和WAL备份。)我会研究:内存,自动真空,检查点和WAL设置。
    3. 考虑升级到PostgreSQL 9.1,你有两个主要版本。