谷歌应用引擎有多快?

5

我最近两个月在尝试使用GAE。

我通过上传CSV文件将记录保存到bigtable中。

我的测试文件大小为300 KB。

以下是我的发现:

本地系统

  • 上传时间不到1秒
  • 3秒内处理2500条记录

在Google沙盒中

  • 上传需要5-7秒。

  • 处理文件会超时。

  • 只能保存60-180条记录。

我的问题是

  1. 为什么需要这么长的时间?
  2. 有没有办法缩短这个时间?
  3. Google将此处理计入CPU使用。他们不公开硬件信息,那么他们使用的CPU是PIII或更高版本的等效CPU吗?

根据@Drew Sears的答案进行编辑。

我目前正在做的事情

  1. 将文件上传到GAE
  2. 通过流获取上传的数据字节,计算行数,将其保存到bigtable中。
  3. 有一个唯一字段id,代表我的记录。
  4. 现在,我创建队列

int x = linesCount/ 50;

for(int i<0;i=x;i++)
{
        x = i * 50;
        Queue queue = QueueFactory.getQueue("test-queue");
        queue.add(TaskOptions.Builder.url("/TestQueue")
                .param("id", id.toString())
                .param("startIdx",String.valueOf(x))
                .param("totRec",String.valueOf(50))
        );
    }

int y = linesCount % 50;
if( y > 0 )
{
    x = (linesCount / 50) * 50;
    Queue queue = QueueFactory.getQueue("test-queue");
    queue.add(TaskOptions.Builder.url("/TestQueue")
            .param("id", id.toString())
            .param("startIdx",String.valueOf(x))
            .param("totRec",String.valueOf(y))
    );                      
}

任务处理servlet从存储中读取文件,并使用totRec和startIdx处理文件,然后关闭它。


你在Google Sandbox上的第一次请求所经历的时间是多久?那么后续请求呢? - naikus
你所经历的延迟并非由于缺乏 CPU 动力,而是由于 GAE 数据存储的实现(以及你的网络连接)所导致。GAE 与同一服务器上的其他应用程序共享资源,但它们有足够的 CPU 周期可供使用... 是数据存储正在滞后。 - user353283
第一次请求只保存了60条记录。下一次请求提高了速度,保存了120-150条记录。现在最大可以保存184条记录。 - Manjoor
好的,所以我们可以在一个请求(30秒)中保存大约300条记录。 - Manjoor
1
GAE 可以很好地扩展,但特别是对数据存储的批量访问(多次读写)非常缓慢,并且会计算大量使用的 CPU 时间。 - jarnbjo
在你所包含的代码中,你正在排队任务 - 是什么超时了,排队任务还是任务本身? - Nick Johnson
1个回答

4

这真的不是测试App Engine可扩展性的好方法。

  1. 如果你在发布300KB时需要7秒钟,瓶颈几乎肯定是你的上行带宽,而不是谷歌的下行带宽,或者与App Engine有关的任何事情。我经常获得更快的上传速度。
  2. 如果您想要更快地完成请求,请尽量减少RPC调用。每个数据存储器get、put或query都是到外部服务器的往返。如果你正在循环处理成百上千行,并在每次循环迭代中执行put操作,则会产生大量不必要的开销。使用一个数据存储器put保存所有实体,您将获得更快的结果。Guido的AppStats框架是一个寻找RPC优化机会的好工具。

1
+1 提到为每一行单独执行put()的危险。 - Peter Recore
我可以尽量减少RPC请求,但如何减少数据存储请求?我需要保存3k个记录,需要3k个数据库put(或在我的情况下进行makePersistant()调用)。是否有批量保存方法? - Manjoor
同样的事情。每个数据存储请求都是一个RPC调用。是的,数据存储允许您在一个调用中存储多个实体。在Python中,这只是使用实体列表的db.put();我不知道Java中的语法会是什么样子。 - Drew Sears
对于现在阅读此内容的任何人,我建议在单个文件上传后使用任务API在后台编写3k条目。 - Richard Watson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接