多处理应用程序的最佳PostgreSQL隔离级别

时间:2014-02-20 01:31:25

标签: django postgresql multiprocessing

我有一个应用程序可以旋转多个进程来从多个PostgreSQL表中读取大量数据来进行数字运算,然后将结果存储在单独的表中。

当我用一个进程测试它时,速度非常快,并且使用了几乎100%的CPU,但是当我尝试在8核机器上使用8个进程时,所有进程都注册了大约1%的CPU并且整个任务似乎采取更长的时间。

当我检查pg_stat_activity时,我看到几个连接列为“< IDLE> in transaction”。根据一些建议here,我查看了pg_locks,我在数十个只读表上看到了数百个“AccessShareLock”锁。基于docs,我认为这是默认值,但我认为这会导致流程互相踩踏,否定了多处理的好处。

是否有更高效的隔离级别可供使用,或者更好的方法来调优PostgreSQL以允许对多个进程进行更快的只读访问,因此每个都不需要锁定表?具体来说,我正在使用Django作为我的ORM。

1 个答案:

答案 0 :(得分:1)

不确定是什么限制了多核,但它与隔离级别无关。即使你有并发写操作。 Per documentation:

  

使用MVCC并发控制模型的主要优点   而不是锁定是在获取用于查询的MVCC锁中   (读取)数据与为写入数据而获取的锁不冲突,   所以阅读从不阻止写作和写作从不阻止阅读。   PostgreSQL即使在提供最严格的保证时也能保持这种保证   通过使用创新的交易隔离水平   可序列化快照隔离(SSI)级别。

大胆强调我的。

当然,阅读也绝不会阻碍阅读。

也许您需要在服务器上重新配置resource allocation?默认配置定期保守。另一方面,在多用户环境中,某些参数不应设置得太高。我想起了work_mem。检查Performance Optimization in the Postgres Wiki的列表。

最后:

  

Django是我的ORM。

ORM通常会尝试保持与平台无关,并且无法充分发挥特定RDBMS的潜力。它们是原始的拐杖,并且在性能优化方面表现不佳。