我有一个应用程序可以旋转多个进程来从多个PostgreSQL表中读取大量数据来进行数字运算,然后将结果存储在单独的表中。
当我用一个进程测试它时,速度非常快,并且使用了几乎100%的CPU,但是当我尝试在8核机器上使用8个进程时,所有进程都注册了大约1%的CPU并且整个任务似乎采取更长的时间。
当我检查pg_stat_activity
时,我看到几个连接列为“< IDLE> in transaction”。根据一些建议here,我查看了pg_locks
,我在数十个只读表上看到了数百个“AccessShareLock”锁。基于docs,我认为这是默认值,但我认为这会导致流程互相踩踏,否定了多处理的好处。
是否有更高效的隔离级别可供使用,或者更好的方法来调优PostgreSQL以允许对多个进程进行更快的只读访问,因此每个都不需要锁定表?具体来说,我正在使用Django作为我的ORM。
答案 0 :(得分:1)
不确定是什么限制了多核,但它与隔离级别无关。即使你有并发写操作。 Per documentation:
使用MVCC并发控制模型的主要优点 而不是锁定是在获取用于查询的MVCC锁中 (读取)数据与为写入数据而获取的锁不冲突, 所以阅读从不阻止写作和写作从不阻止阅读。 PostgreSQL即使在提供最严格的保证时也能保持这种保证 通过使用创新的交易隔离水平 可序列化快照隔离(SSI)级别。
大胆强调我的。
当然,阅读也绝不会阻碍阅读。
也许您需要在服务器上重新配置resource allocation?默认配置定期保守。另一方面,在多用户环境中,某些参数不应设置得太高。我想起了work_mem
。检查Performance Optimization in the Postgres Wiki的列表。
最后:
Django是我的ORM。
ORM通常会尝试保持与平台无关,并且无法充分发挥特定RDBMS的潜力。它们是原始的拐杖,并且在性能优化方面表现不佳。