2012-04-28 141 views
0

我正在使用MapReduce框架在Google App Engine上做一些实验(在这种情况下,是一个MD5暴力破解工具)。Google App Engine中的代码运行速度极其缓慢

我在这里的代码运行得非常慢内GAE的问题,甚至只是使用开发服务器

此代码https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/mapreduce/HashMapper.java将每秒只能处理大约4000哈希(这是的时间内一个调用地图(),并没有谷歌应用程序引擎apis在里面使用)。

我把代码之外并运行它独立 - https://github.com/jordan-thoms/Hash/blob/f982956f41313cd4fe3b5105aee21ea11bd3af16/src/nz/net/thoms/hash/StandaloneTest.java,并且该版本将做超过100万每秒。这是中央循环运行速度较慢,这很奇怪,因为没有任何代码与谷歌应用程序引擎有任何关系。

我试着运行在谷歌应用程序引擎代码分析器,但我还没有发现任何有用的东西 - 好像是一吨()调用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毫秒,如果我把它放在一个正常的程序,并在超过400毫秒的开发模式一个servlet内,在同一处理器。

(有趣的是,映射得到约60000哈希每秒完成对生产谷歌应用程序引擎,所以速度快了很多,但仍然比一个独立的程序很慢)

+1

我不知道,但在检查其他任何事情之前,GAE使用什么JIT(和相关选项),以及您的独立代码使用什么?我问的不是因为我可以对答案做任何有用的事情,而是因为如果你知道这可能会帮助你:-)另外,生产GAE和你的独立之间15倍差距的部分(可能不是全部)可能就是你的机器比它们给每个应用程序的有效CPU速度更快。至于开发服务器,Google的原始速度可能没有优先级! – 2012-04-28 02:13:48

+0

谢谢 - 我使用visualvm来查看每个进程,并且我看不到GAE服务器的任何自定义jit选项,它们都使用Hotspot 20.6-b01。还有什么地方我应该看看? – Jords 2012-04-28 02:26:12

+0

我的意思是生产GAE选项 - 你会认为它们使用了很好的优化,但是我知道你使用的更好。我不知道他们是否在哪里记录他们使用什么,但如果你没有做任何特别的事情,那么我不会马上预计他们会慢多倍。我不会试图解开开发性能,就像我说我怀疑它是一个优先事项,所以如果他们挤满了充满仪器的开发服务器代码,那么您可能无法做到这一点。 – 2012-04-28 02:32:09

回答

1

默认frontend instance有128MB的内存和600MHz的CPU限制。这可以解释性能差异。

+0

我将实例类型更改为最快的实例类型,速度从每秒c.60,000提高到每秒每秒c.250,000。尽管如此,我的桌面上只有一个线程可以获得大约130万。我目前正在使用hadoop在ec2上运行它,看看性能如何比较会很有趣。 – Jords 2012-04-28 09:57:02

0

MapReduce的叠代是相比于纯的hadoop映射器缓慢每个数据存储区的实体。考虑迭代blob,或将你的哈希分组。请记住,一个映射进程可以处理10分钟的作品,然后您可以确定要处理的每个数据块的最佳大小。

+0

我实际上是这样做的 - 问题是map函数内的代码在谷歌应用程序引擎上运行速度非常慢,而在开发服务器内部甚至更慢。我实际上已经转向在亚马逊上使用hadoop集群,并且它工作得很好,好多了。 – Jords 2012-05-04 23:42:06

0

根据我的测量与CPU密集型任务,App Engine是要慢十倍比我们预期给出的实例的规格。例如,我的2.5 GHz计算机通常需要3秒的计算时间通常在2.4 GHz后端实例上需要30秒。

关于地方发展模式,外的现成应用程序引擎的表现更差。但是,通过设置vm参数-Dappengine.disableRestrictedCheck =“true”可以在一定程度上缓解这种情况,特别是在使用自定义类加载器时。