我正在使用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()的单次调用内的时间,并且内部没有使用谷歌应用引擎apis)。
我把代码带到了外面并独立运行 - 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 ms内运行,在开发者模式下在servlet内部运行超过400ms,在同一处理器上运行。
(有趣的是,映射器在生产Google App Engine上每秒可以获得大约60,000个哈希值。所以速度要快得多,但与独立程序相比仍然非常慢)
答案 0 :(得分:1)
默认frontend instance有128MB内存和600MHz CPU限制。这可以解释性能差异。
答案 1 :(得分:0)
MapReduce迭代每个DataStore实体,与纯粹的hadoop映射器相比,这个实体很慢。考虑迭代blob,或将哈希分组。请记住,单个地图流程可以处理10分钟的工作,然后您可以确定要处理的每个数据块的最佳大小。
答案 2 :(得分:0)
根据我对CPU绑定任务的测量结果,根据实例的规格,app引擎的速度比预期慢十倍。例如,我的2.5 GHz机器上的计算通常需要3秒才能在2.4 GHz后端实例上花费30秒。
关于本地开发模式,应用引擎的开箱即用性能更差。但是,通过设置vm参数-Dappengine.disableRestrictedCheck =&#34; true&#34;可以在一定程度上缓解这种情况,特别是在使用自定义类加载器时。