我正在使用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
答案 0 :(得分:2)
这种情况似乎是:许多长期闲置交易,即< IDLE>在交易中。我们设法摆脱了大部分。结果非常出色。
可悲的主要原因是应用程序逻辑存在缺陷。我的意思是部分交易看起来像:
由于行版本控制子系统必须保留大量旧版本的行,因此系统的响应速度越来越低(每个简单查询都必须查找适当的行版本)。
答案 1 :(得分:0)
在以下情况下,我在测试框中遇到类似情况:
PostgreSQL依赖于2层数据缓存:
shared_buffers
; effective_cache_size
指定的操作系统缓存,您能告诉我们您的价值吗?为了了解系统的实际情况,您应该监控:
通过监视器我的意思不仅仅是查看当前值,而是使用sar
,iostat
,vmstat
之类的工具,结合使用,比如,RRDtool可以更好地进行数据分析。然后查看生成的报告,了解您在简单查询中发现不必要的延迟的时间段。
我感觉你有IO问题,但是如果不看系统和报告就无法说清楚。
我建议: