我有一个非常以写为中心的应用程序,它使用postgres hstore。我的典型工作流程为SELECT
,后跟一些UPDATE
或INSERT
s(主要是前者)。这通常发生在每秒500个“任务”上。
所以我的单个postgres实例无法应对。我看到postgres服务器是cpu绑定的,postgres进程始终是UPDATE
。磁盘I / O看起来很好,我有足够的内存空间(48个中有44GB)。我已经尝试按照postgres's wiki page和pg_tune进行调整,但我只需要更多的性能。
我的表格遵循以下设计:
Column | Type | Modifiers | Storage | Stats target | Description
------------+--------------------------+---------------------------------------------------------------------+----------+--------------+-------------
id | integer | not null default nextval('table_id_seq'::regclass) | plain | |
created_at | timestamp with time zone | not null | plain | |
updated_at | timestamp with time zone | not null | plain | |
context | hstore | default hstore((ARRAY[]::character varying[])::text[]) | extended | |
data | hstore | default hstore((ARRAY[]::character varying[])::text[]) | extended | |
几乎我所有UPDATE
的类型都是:
UPDATE <table> updated_at=<date> WHERE id=<id>
在挖掘之后,我发现了两个声称有助于写作性能的项目:
你会推荐我的(相当简单的)工作流程吗?
(是的,我尝试了mongo,但是,我想念SQL的查询原理图)
答案 0 :(得分:4)
首先,我认为你需要更加具体。性能调优是以事实为中心的,没有很多细节(解释计划等),硬件上的信息等,我们无法告诉你该怎么做。此外,像Postgres-XC这样的东西增加了很多复杂性,尽管它确实有助于提高写入性能。我认为这会对你的情况有所帮助,但你真的想要优化你拥有的东西(并且可能雇用某人为你优化它)。
然而,你的帖子中有一堆警示标志(这是我认为聘请专业人士可能是一个好主意的另一个原因)。不知道更多我不能告诉你Postgres-XC是否是正确的解决方案。我可以告诉你的是,你将有一个陡峭的学习曲线来实现它。
所以我想通过警告标志,因为它们代表了可能的调整点。
i see that the postgres server is cpu bound and the postgres processes are UPDATEing all the time.
这很可能是由信号量和共享内存争用过多引起的。您可能会发现,如果减少最大连接数,您将每秒处理更多。连接池可能会有所帮助。
所有有趣的数据都在扩展存储上。这意味着存储和检索时需要额外的随机磁盘I / O.除非你在表上进行大量的顺序扫描,否则你应该让PostgreSQL决定要播放什么。
我称你的大多数陈述都是UPDATE <table> updated_at=<date> WHERE id=<id>
,因为当你没有更新数据时,很可能没有理由记录更新的行。还有其他东西可能在这里发生。我的猜测是你有很多查询在扩展存储中更新东西。这可能不是一个很大的性能,因为你不受I / O限制,但它确实会产生CPU和磁盘I / O的开销。
总的来说,Postgres-XC是一个很棒的项目,我会推荐它。然而,它为数据库增加了很多复杂性,如果你可以使你的单个实例工作,你可能会发现从长远来看运行要便宜很多(简单就是金色)。