首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres,不时地挂起

Postgres,不时地挂起
EN

Server Fault用户
提问于 2011-07-31 17:58:49
回答 2查看 8.5K关注 0票数 2

我们使用Postgres作为Django项目的DB后端。除了不时挂起Postgres jus外,一切都很好。负载平均峰值达到80个点,并且有许多posgtres过程。到目前为止,我认为问题是我们的桌子与用户在线。对于每个请求都有更新,我们正在更新“最后一次看到”列。在每一分钟,都有删除用户的cronjob,不活动1分钟。在今天的例子中,当Postgres挂起时,我看到了很多更新和删除这个表的内容。我觉得这是某种种族状况?

这个有在线用户的表并不大。高峰时间有800条记录。这是模式。

代码语言:javascript
复制
   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

编辑:

日志中的一些信息:

代码语言:javascript
复制
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 

好吧,这是锁定问题..。但我怎么才能避免呢?

EN

回答 2

Server Fault用户

发布于 2011-07-31 18:23:28

这似乎是锁定问题:一些大型查询锁太多,因此在释放锁之前,其他正在运行的查询无法完成。打开慢速查询日志,添加更多监视。我强烈建议使用一些监视系统(zabbix、zenoss等)来了解postgresql数据库的状态。

作为一个快速的“监视”,查看挂起期间的pg_stat_activity和pg_locks视图。这里有一个很好的查询,我经常从这里开始:

代码语言:javascript
复制
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;

它经常给出足够的信息,但有时我必须跑得更多,以了解发生了什么。

请用此(或类似)查询的输出更新您的问题。

票数 4
EN

Server Fault用户

发布于 2011-08-14 22:36:25

我推荐PostgreSQL 9.0高性能第11章,“数据库活动和统计”一书。另一个解决这个问题的好地方是postgresql性能邮件列表。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/296066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档