Django/Postgres在重复处理相同查询后性能恶化

问题描述:

我在Apache上运行Django。我有几个客户端计算机应该调用urllib2.urlopen()并发送一些我的服务器将处理的数据,并立即发回应答。但是,当我测试这个时,我发现了一个非常棘手的问题。我有一个客户端重复发送相同的数据进行处理。第一次,大约需要20秒,第二次,大约需要40秒,第三次我得到504(网关超时)错误。如果我尝试发送数据,会随机弹出更多的504错误。我很确定这是Postgres的一个问题,因为处理信息的函数会调用很多数据库,但是,我不知道为什么Postgres的性能会下降很多。我试过了几个数据库优化技巧,包括这一个:(http://stackoverflow.com/questions/1125504/django-persistent-database-connection),无济于事。Django/Postgres在重复处理相同查询后性能恶化

在此先感谢。

编辑:请求不会同时发生。它们会紧接着返回,每个查询都涉及很多SELECT和JOIN,并且还有一些INSERT和UPDATE。 apache错误日志显示它只是一个简单的超时,处理客户端发布数据的函数需要超过90秒。

+0

请求是否同时发生?另外,你打了什么样的查询,多少次? – orokusaki 2011-03-27 06:52:05

你检查了Apache error_logs吗?您是否设置了django DEBUG = TrueADMINS = ('[email protected]',),以便您可以获得有关该问题实际原因的详细错误报告?如果是这样,那么在这里粘贴一些信息怎么样。

为什么你确定它是postgres?你做过诊断来得出这个结论吗?如果是这样,请告诉我们。

你在用mod_wsgi运行apache吗?你有多少进程和线程分配给你的django应用程序?

此外,处理第一笔交易需要20秒钟的时间。也许你可以向我们展示导致超时的视图代码。我们可能会在那里帮助。

我真诚地怀疑这会导致问题的后果。这可能与应用程序代码或服务器配置有关。

如果它真的是Postgres,那么你应该打开Postgres配置中的慢语句的日志记录来找出哪个语句确实花了这么多时间。

这可以通过设置配置属性log_min_duration来完成。

细节都在手册中: http://www.postgresql.org/docs/current/static/runtime-config-logging.html#GUC-LOG-MIN-DURATION-STATEMENT

你说的功能,使“多数据库调用”,所以我会用一个非常低的数字开头,甚至0记录所有发言时间,然后你可能能够识别出较慢的。

它也可能是一个锁定发布。也许第一次调用不会正确结束其事务,并且在等待资源时后续调用会超时。

您可以通过在第一次调用之后检查系统视图pg_locks来验证此情况。