我们使用Postgres作为Django项目的DB后端。除了不时挂起Postgres jus外,一切都很好。负载平均峰值达到80个点,并且有许多posgtres过程。到目前为止,我认为问题是我们的桌子与用户在线。对于每个请求都有更新,我们正在更新“最后一次看到”列。在每一分钟,都有删除用户的cronjob,不活动1分钟。在今天的例子中,当Postgres挂起时,我看到了很多更新和删除这个表的内容。我觉得这是某种种族状况?
这个有在线用户的表并不大。高峰时间有800条记录。这是模式。
Column | Type | Modifiers
------------+--------------------------+-----------------------------------------------------------------
id | integer | not null default nextval('spoleczniak_online_id_seq'::regclass)
postac_id | integer | not null
data | timestamp with time zone | not null
zalogowany | timestamp with time zone | not null
Indexes:
"spoleczniak_online_pkey" PRIMARY KEY, btree (id)
"spoleczniak_online_postac_id_key" UNIQUE CONSTRAINT, btree (postac_id)
"spoleczniak_online_data" btree (data)
Foreign-key constraints:
"spoleczniak_online_postac_id_fkey" FOREIGN KEY (postac_id) REFERENCES postac_postacie(id) DEFERRABLE INITIALLY DEFERRED通常,Postgres生成的负载平均点数少于1.5个。我们正在i7上运行它,16 GB内存,硬件RAID-10 (3x2磁盘)用于OS/data + RAID-1 (2磁盘)用于WAL。硬件RAID有512 MB的缓存。
我已经尝试了9.0和9.1测试版(我甚至在9.1中没有为该表设置WAL日志)。
我真的在考虑迁移到MySQL,但不知道任何转换工具。:P
PS。我不知道是服务器故障还是堆栈溢出..。但是,正如您所看到的,我决定将其放在服务器错误上。:P
编辑:
日志中的一些信息:
Jul 31 20:37:16 postgres postgres[1420]: [3-1] LOG: 00000: process 1420 acquired ExclusiveLock on tuple (29,7) of relation 33107 of database 20005 after 2071.481 ms
Jul 31 20:37:16 postgres postgres[1420]: [3-2] LOCATION: ProcSleep, proc.c:1076
Jul 31 20:37:16 postgres postgres[1420]: [3-3] STATEMENT: UPDATE "spoleczniak_online" SET "postac_id" = 101651, "data" = '2011-07-31 20:39:18.000699', "zalogowany" = '2011-07-31 20:31:04.843741' WHERE "spoleczniak_online"."id" = 559650
Jul 31 20:37:16 postgres postgres[1493]: [3-1] LOG: 00000: process 1493 acquired ExclusiveLock on tuple (29,7) of relation 33107 of database 20005 after 1393.154 ms
Jul 31 20:37:16 postgres postgres[1493]: [3-2] LOCATION: ProcSleep, proc.c:1076
Jul 31 20:37:16 postgres postgres[1493]: [3-3] STATEMENT: UPDATE "spoleczniak_online" SET "postac_id" = 101651, "data" = '2011-07-31 20:39:15.646537', "zalogowany" = '2011-07-31 20:31:04.843741' WHERE "spoleczniak_online"."id" = 559650 好吧,这是锁定问题..。但我怎么才能避免呢?
发布于 2011-07-31 18:23:28
这似乎是锁定问题:一些大型查询锁太多,因此在释放锁之前,其他正在运行的查询无法完成。打开慢速查询日志,添加更多监视。我强烈建议使用一些监视系统(zabbix、zenoss等)来了解postgresql数据库的状态。
作为一个快速的“监视”,查看挂起期间的pg_stat_activity和pg_locks视图。这里有一个很好的查询,我经常从这里开始:
SELECT
datname,
NOW() - query_start AS duration,
procpid,
current_query
FROM
pg_stat_activity
WHERE
current_query <> '<IDLE>'
AND
NOW() - query_start > '1 second'
ORDER BY duration DESC;它经常给出足够的信息,但有时我必须跑得更多,以了解发生了什么。
请用此(或类似)查询的输出更新您的问题。
发布于 2011-08-14 22:36:25
我推荐PostgreSQL 9.0高性能第11章,“数据库活动和统计”一书。另一个解决这个问题的好地方是postgresql性能邮件列表。
https://serverfault.com/questions/296066
复制相似问题