2013-01-22 61 views
7

我们使用django为mysql创建一个json webservice前端。我们在EC2实例上运行apache和django,并在RDS实例上运行MySQL。我们已经开始使用Apache Bench进行性能基准测试,并且获得了一些非常糟糕的性能数据。我们还注意到,在运行测试时,我们的apache/django实例在非常低的负载下达到100%CPU使用率,并且MySQL实例永远不会超过2%CPU使用率。有没有办法加快django中的身份验证功能?

我们正在努力使这个意义上说,孤立的问题,所以我们做了几个AB测试:

  1. 一种从Apache的静态HTML页面的请求 - 〜2000个请求/秒。
  2. 一个在django中执行一个小型python函数的请求,没有db交互 - 约1000个请求/秒。
  3. 执行我们调用验证Django的web服务的功能之一,然后做一个非常简单的查询来从一个表中记录的请求 - 11个请求/秒
  4. 同3,但评论的电话进行验证 - - 95个请求/秒。

为什么验证太慢?它是否将数据写入数据库,找到pi的十亿位数字,是什么?

我们希望保持呼叫在这些功能中进行身份验证,因为我们不希望任何人都可以猜测这些URL,等等。有没有人注意到身份验证速度很慢,任何人都可以提出建议一种补救方法?

非常感谢!

+0

尝试几件事:下载django-debug-toolbar并读取输出。看看它在做什么样的查询。试试django-profile并阅读函数执行时间。最后,获取新的...甚至免费版本将显示你有用的细分每个视图func。兴奋地听到一些结果! –

回答

7

我并不是身份验证和安全方面的专家,但以下是为什么会发生这种情况的一些想法,以及可能如何提高性能。

由于密码存储在数据库中,为了保证其存储安全,不会存储明文密码,而是会存储它们的散列值。通过这种方式,您仍然可以通过将计算出的输入密码与存储在数据库中的密码进行比较来验证用户是否已登录。这增加了安全性,因此如果恶意方会获得数据库的副本,解密明文密码的唯一方法是使用彩虹表或进行暴力攻击。

这是事情变得有趣的地方。根据摩尔定律,计算机正在以指数方式变得更快,因此计算散列函数在时间上变得便宜得多,尤其是像md5或sha1这样的快速散列函数。这带来了一个问题,因为现在可用的所有计算能力与快速哈希函数相结合,黑客可以蛮力哈希密码相对容易。为了解决这个问题,可以做两件事。一个它多次循环散列函数(散列的输出被反馈到散列)。然而,这不是非常有效,因为它仅仅通过常数增加散列函数的复杂度。这就是为什么第二种方法是优选的,这是为了使实际的散列函数更复杂且计算更昂贵。具有更复杂的功能,需要更多时间来计算散列值。即使计算需要一秒钟,对于最终用户来说也不是什么大问题,但对于暴力攻击来说这是一件大事,因为必须计算数百万次散列。这就是为什么从Django 1.4开始,它使用了一个名为PBKDF2的相当昂贵的计算功能。

回到你的答案。正是由于这个功能,当您启用身份验证时,您的基准数量会急剧下降,并且您的CPU数量会增加。

以下是一些可以提高性能的方法。

  • 从Django 1.4开始,您可以更改默认身份验证功能(docs)。如果您不需要太多安全性,则可以将默认功能更改为SHA1或MD5。这应该会提高性能,但请记住,安全性会更弱。我个人的观点是安全是重要的,值得额外的时间,但如果它没有保证你的应用程序,这是你可能要考虑的。
  • 使用会话。昂贵的散列函数仅在初始登录时计算。一旦用户登录,将为该会话创建会话,并使用会话标识将cookie发送给用户。然后在随后的请求中,用户上传cookie,如果会话尚未过期,则用户将自动进行身份验证(因为会话数据已签名,所以不要担心安全问题...)。重点在于与计算昂贵的散列函数相比,验证会话的计算成本更低。我猜测你在ab测试中没有发送会话cookie。尝试做一些测试,并添加发送会话cookie并查看它的执行情况。如果发送cookie不是真正的选项,因为您正在创建JSON API,那么您可以修改会话后端以通过会话GET参数而不是cookie接受会话数据。然而,不确定这样做的安全后果是什么。
  • 切换到nginx。我不是部署专家,但根据我的经验,与Apache相比,nginx对Django更快更友好。我认为您可能特别感兴趣的一个优点是nginx具有多个工作进程的能力,以及使用proxy_pass将请求传递给Django进程的能力。如果您将拥有多个工作进程,则可以通过proxy_pass将每个工作人员指向单独的Django进程,这将有效地向Django添加多进程。另一种方法是如果你使用gevent WSGI服务器,你可以在Django进程中创建一个池,这也可能会提高性能。不知道这些中的任何一个是否会显着增加你的性能,因为你的CPU负载已经达到100%,但它可能是一些值得研究的东西。
+0

优秀的答案,谢谢。 – HansG600