数据存储和内存缓存操作(GAE)的高度可变性能

时间:2013-07-12 02:16:47

标签: python google-app-engine memcached google-cloud-datastore

我正在尝试优化GAE的性能,但是一旦部署,我会得到非常不稳定的结果。很难看出每个优化是否真的有效,因为数据存储区和内存缓存操作的时间变化很大(相同操作的时间范围从毫秒到秒)。

对于这些测试,我是唯一一个通过刷新主页只对应用程序发出一个请求的测试。没有其他人/流量发生(除了我自己的浏览器从页面请求图像/ css / js文件)。

编辑:为了确保丢弃不是由于来自浏览器的并发请求(images / css / js),我通过仅使用urllib2.urlopen请求页面来重做测试()。问题依然存在。

我的问题是:

  • 1)由于机器/资源是共享的,这是否可以预期?
  • 2)发生此类行为的最常见情况是什么?
  • 3)我可以从哪里去?

这是一个非常慢的数据存储区get(memcache刚刚刷新): Ultra slow datastore get Full size

这是一个非常慢的memcache get(由于之前的请求,事情被缓存): Slow memcache get Full size

这是一个缓慢但更快的memcache get(与前一个相同的repro步骤,不同的调用很慢): enter image description here Full size

1 个答案:

答案 0 :(得分:0)

回答你的问题,

1)是的,由于共享网络,您可以预期远程呼叫会出现差异;

2)您将看到差异的最常见位置是数据存储区请求 - 请求越大/越远,您将看到的差异越大;

3)这里有一些选项:

看起来您正在尝试从数据存储区/内存缓存中获取大量数据。您可能需要重新考虑查询和缓存,以便检索较小的数据块。您的应用是否需要针对单个请求的所有数据?

如果应用程序确实需要在每个请求上处理所有数据,则另一个选项是使用后台任务(cron,任务队列等)对其进行预处理,并将结果放入内存缓存中。提供页面的请求应该只是从内存缓存中选择正确的部分并组装页面。

@ proppy建议使用NDB是一个很好的建议。将串行查询重写为并行查询需要一些工作,但异步调用的节省可能是巨大的。如果你可以从并行任务中受益(使用map),那就更好了。