Django - 使用低效代码或糟糕的Apache SetUp杀死我的服务器?

时间:2011-06-06 16:08:38

标签: mysql django apache

我正在对我的生产服务器进行基准测试(它处于测试阶段),结果很糟糕。在没有任何动态内容的页面上,并发为1的1000个请求返回73个请求/秒。

当我开始将MYSQL查询添加到等式中时,事情很快就会失控。我的主页上的相同1000个请求产生以下结果:

CPU飙升至50% 将峰值加载到3.7(虽然并非总是如此)

complete request:1000
failed requests:0
write errors:0
requests/sec: 2.44
transfer rate: 113.26[Kbytes/sec]

90% of requests are served within 142ms.  
95% of requests are served within 3531ms (it just keeps getting worse after that). 

在我运行基准测试时查看顶部

  mysqld runs as a process is consuming roughly 7% of memory and 2.5% cpu
  Apache seems to spawn 7 concurrent processes at times
  At other points, Apache does not show up in Top 

我正在Micro AWS实例(ubuntu)上运行preforked Apache,我将升级到更高的实例,但我担心代码或我的Apache设置存在潜在问题。

我正在使用Mod_WSGI部署Django,我将KeepAliveTimeout设置为3,以防万一慢速进程搞砸了我。

我的主页代码似乎很简单,虽然它需要连接。

    def index(request):
         posts=Post.objects.filter(photo__isnull=False).order_by('date').distinct()[0:7]  
         ohouses=Open_House.objects.filter(post__photo__isnull=False).order_by('day').distinct()[0:4]

         return render_to_response("index.html", {'posts':posts,'ohouses':ohouses},context_instance=RequestContext(request))    

我已经为MYSQL留下了默认配置。

这一切都可以归因于运行微实例吗?我的实例可能有点腐败吗?还有其他似是而非的解释吗?

2 个答案:

答案 0 :(得分:2)

ton 进入快速响应时间。 Django非常适合它的优化,但单靠一个框架永远不会让你达到你想要的目标。

如果您要使用Apache,请使用MPM分支,然后禁用所有模块,这些模块并不是绝对需要的。 Apache可以快速运行,但它不是那里最快的马。你会用像Nginx或(畏缩)切诺基这样的东西做得更好。切诺基是一个很好的网络服务器,但可用性指数就像零。

任何静态资源都应该由您的网络服务器直接提供,或者更好地通过CDN提供。

假设您已优化自己的代码以避免低效使用查询,Django内置的自动查询缓存将有助于减少数据库所需的总查询量。之后,你需要使用像memcached这样的东西。

然后,就是服务器本身。根据您网站的大小,您可能不需要太多的RAM和CPU,但总是有太多而不是太多。在您的服务器上放置一些人为负载(自动化测试,抓住您的站点等)并查看您的系统资源如何保持可能是有益的。如果你接近上限(我会说这样的简单测试超过50%),你需要在你的实例池中添加更多。

在线搜索有关如何优化MySQL的文章。开箱即用,它往往会使用比实际需要更多的资源;那里有很大的改进空间。并且,如果它还没有在自己的服务器上,请考虑将其强烈卸载到自己的服务器上。如果您预计会有大量流量,那么响应Web请求并从数据库中获取数据的同一服务器将成为一个瓶颈。

答案 1 :(得分:1)

  

这一切都可以归因于运行微实例吗?

Micro实例在短时间内突然爆发2个CPU,之后严重上限几分钟。因为这个原因,我不相信在Micro EC2实例上做过的任何基准测试。