0

我正在使用 MapReduce 框架在 Google App Engine 上做一些工作(在本例中为 MD5 暴力破解)。

我遇到了一个问题,即代码在 GAE 中运行非常缓慢,即使只是使用开发服务器也是如此

此代码https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/mapreduce/HashMapper.java每秒只能处理大约 4,000 个哈希(这是单个调用map(),里面根本没有使用google app engine api)。

我将代码带到外面并独立运行 - https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/StandaloneTest.java,该版本将超过 100 万每秒。运行速度较慢的是中央循环,这很奇怪,因为这些代码都与谷歌应用引擎无关。

我已经尝试在 Google App 引擎代码上运行分析器,但我没有发现任何有用的东西 - 似乎是对 checkRestricted() 的大量调用以及类似的事情。我尝试删除安全管理器

即使是这个简单的代码:

        int i;
    for (i=0; i< 1000000; i++) {
        i += 2;
        i += (int) Math.sin(i * (i + (int) System.currentTimeMillis()));
    }
    long enda = System.currentTimeMillis();
    System.out.println("took " + (enda - starta) + " i:" + i);

如果我把它放在一个普通程序中,运行时间为 117 毫秒,而在开发人员模式下的 servlet 中,在同一处理器上运行时间超过 400 毫秒。

(有趣的是,映射器每秒在生产的 Google App Engine 上完成大约 60,000 个哈希。所以速度要快得多,但与独立程序相比仍然非常慢)

4

3 回答 3

1

默认前端实例有 128MB 内存和 600MHz CPU 限制。这可以解释性能差异。

于 2012-04-28T06:39:56.810 回答
0

MapReduce 迭代每个 DataStore 实体,与纯 hadoop 映射器相比,这很慢。考虑迭代 blob,或将散列分组。请记住,单个映射进程可以处理 10 分钟的工作,然后您可以确定要处理的每个数据块的最佳大小。

于 2012-05-04T16:09:23.160 回答
0

根据我对 CPU 密集型任务的测量,应用引擎的速度比考虑到实例规格的预期慢大约十倍。例如,在我的 2.5 GHz 机器上通常需要 3 秒的计算通常在 2.4 GHz 后端实例上需要 30 秒。

对于本地开发模式,应用引擎的开箱即用性能更差。但是,通过设置 vm 参数 -Dappengine.disableRestrictedCheck="true" 可以在一定程度上缓解这种情况,特别是在使用自定义类加载器时。

于 2015-07-15T08:52:02.683 回答