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秒。
你检查了Apache error_logs吗?您是否设置了django DEBUG = True
或ADMINS = ('[email protected]',)
,以便您可以获得有关该问题实际原因的详细错误报告?如果是这样,那么在这里粘贴一些信息怎么样。
为什么你确定它是postgres?你做过诊断来得出这个结论吗?如果是这样,请告诉我们。
你在用mod_wsgi运行apache吗?你有多少进程和线程分配给你的django应用程序?
此外,处理第一笔交易需要20秒钟的时间。也许你可以向我们展示导致超时的视图代码。我们可能会在那里帮助。
我真诚地怀疑这会导致问题的后果。这可能与应用程序代码或服务器配置有关。
如果它真的是Postgres,那么你应该打开Postgres配置中的慢语句的日志记录来找出哪个语句确实花了这么多时间。
这可以通过设置配置属性log_min_duration
来完成。
你说的功能,使“多数据库调用”,所以我会用一个非常低的数字开头,甚至0记录所有发言时间,然后你可能能够识别出较慢的。
它也可能是一个锁定发布。也许第一次调用不会正确结束其事务,并且在等待资源时后续调用会超时。
您可以通过在第一次调用之后检查系统视图pg_locks
来验证此情况。
请求是否同时发生?另外,你打了什么样的查询,多少次? – orokusaki 2011-03-27 06:52:05