- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
大约在 2011 年 3 月,我测试了 GAE(Java 版本)作为大规模并行计算的潜在平台。这个日期很重要,因为 GAE 一直在发展。我发现该应用程序在大约 43.2 倍的计算吞吐量下受到有效限制。 有没有人成功地将 GAE 用于大规模并行计算或获得了更高的计算增益?为了这个问题的目的,我将任意定义大规模并行计算意味着大于 1000 倍的计算吞吐量。
我使用了一个桌面客户端,它实例化了多个线程来访问 URL。我正在使用 GAE 任务队列。该应用程序需要非常少的输入并产生非常少的输出,无论是 Datastore 还是 HTML,因为它旨在评估计算吞吐量。
由于通常建议将 GAE 任务保持在 1 秒以下(尽管尚不清楚此建议是否适用于任务队列任务),因此我尝试了各种排列。我的一些结果包含在这里。如您所见,即使是 0.8 秒的任务,与低于 1 秒的建议一致,吞吐量也达到了 43.2 倍的峰值。
Elapsed Tasks SecondsOf Total Gain
Seconds Requested WorkPerTask Work
FLT (FEW LARGE TASKS)
15 72 1 72 4.9
103 72 20 1440 14.0
1524 72 400 28800 18.9
MST (MANY SMALL TASKS)
53 1000 0.8 800 15.1
63 2000 0.8 1600 25.4
127 4000 0.8 3200 25.2
313 4000 0.8 3200 10.2
258 8000 0.8 6400 24.8
177 8000 0.8 6400 36.2 (Have 5% of tasks do nothing.)
49 2000 0.8 1600 32.7 (Have 1% of tasks do nothing.)
37 2000 0.8 1600 43.2 (Have 5% of tasks do nothing.)
42 2000 0.8 1600 38.1 (Have 10% of tasks do nothing.)
249 2000 0.8 1600 6.4 (Have 50% of tasks do nothing.)
MLT (MANY LARGE TASKS)
6373 1000 200 200000 31.4
380 200 60 12000 31.6
请注意,任务队列任务的时间超过 600 秒是不可取的,因此我达到的最高时间是 400 秒,只是为了留出安全边际。有些任务什么都不做的情况是为了降低每个任务必须完成的平均工作量,以影响整个谷歌“会计”。因此,例如 2000 个任务,每个任务有 0.8 秒的工作时间,但另外 222 个任务没有工作,这意味着 10% 没有工作。
编辑:@PeterRecore,我正在测量吞吐量增益,它是 totalWorkInSeconds 除以 elapsedTimeInSeconds,这是在客户端测量的。客户端发出请求并测量耗时,直到所有 GAE 任务完成,每个任务都发送一个非常小的响应来指示。我试图找出当前形式的 GAE 是否可用于创建实现高吞吐量增益值的应用程序。在 2011 年 3 月,这似乎不太可能。今天怎么样?它将如何完成或您实际上是如何完成的?达到了什么样的吞吐量增益水平?正如我所说,Datastore 的使用是最少的,并且包括每个任务在完成任务时编写一个简单的小对象。每个任务循环到一个与 secondsOfWorkPerTask 成正比的整数。 GAE 旋转实例是问题的一部分。谷歌通过告诉人们他们更喜欢亚秒级任务来加剧这个问题。如果我有大型任务,问题就会得到缓解,因为这样实例化所用的周期数所占的百分比就较小。
最佳答案
App Engine 并不是为用作大型计算作业的后端而设计的——它是为可扩展站点(和 API,就此而言)的快速高效服务而设计的。它所做的并没有围绕您要实现的目标进行优化。
关于java - Google App Engine 可以用于大规模并行计算吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8105564/
有没有办法同时运行 2 个不同的代码块。我一直在研究 R 中的并行包,它们似乎都基于在循环中运行相同的函数。我正在寻找一种同时运行不同函数的方法(循环的 1 次迭代)。例如,我想在某个数据对象上创建一
无论如何增加 Parallel.For 启动后的循环次数?示例如下: var start = 0; var end = 5; Parallel.For(start, end, i => { C
我是 Golang 的新手,正在尝试了解并发和并行。我阅读了下面提到的关于并发和并行的文章。我执行了相同的程序。但没有得到相同的(混合字母和字符)输出。首先获取所有字母,然后获取字符。似乎并发不工作,
我正在寻找同时迭代 R 中两个或多个字符向量/列表的方法,例如。有没有办法做这样的事情: foo <- c('a','c','d') bar <- c('aa','cc','dd') for(i in
我对 Raku 很陌生,我对函数式方法有疑问,尤其是 reduce。 我最初有这样的方法: sub standardab{ my $mittel = mittel(@_); my $foo =
我最近花了很多时间来学习实时音频处理的细节,我发现的大多数库/工具都是c / c++代码或脚本/图形语言的形式,并在其中编译了c / c++代码。引擎盖。 使用基于回调的API,与GUI或App中的其
我正在使用 JMeter 进行图像负载测试。我有一个图像名称数组并遍历该数组,我通过 HTTP 请求获取所有图像。 -> loop_over_image - for loop controller
我整个晚上都在困惑这个问题...... makeflags = ['--prefix=/usr','--libdir=/usr/lib'] rootdir='/tmp/project' ps = se
我正在尝试提高计算图像平均值的方法的性能。 为此,我使用了两个 For 语句来迭代所有图像,因此我尝试使用一个 Parallel For 来改进它,但结果并不相同。 我做错了吗?或者是什么导致了差异?
假设您有一个并行 for 循环实现,例如ConcRT parallel_for,将所有工作放在一个 for 循环体内总是最好的吗? 举个例子: for(size_t i = 0; i < size()
我想并行运行一部分代码。目前我正在使用 Parallel.For 如何让10、20或40个线程同时运行 我当前的代码是: Parallel.For(1, total, (ii) =>
我使用 PAY API 进行了 PayPal 自适应并行支付,其中无论用户(买家)购买什么,都假设用户购买了总计 100 美元的商品。在我的自适应并行支付中,有 2 个接收方:Receiver1 和
我正在考虑让玩家加入游戏的高效算法。由于会有大量玩家,因此算法应该是异步的(即可扩展到集群中任意数量的机器)。有细节:想象有一个无向图(每个节点都是一个玩家)。玩家之间的每条边意味着玩家可以参加同一场
我有一个全局变量 volatile i = 0; 和两个线程。每个都执行以下操作: i++; System.out.print(i); 我收到以下组合。 12、21 和 22。 我理解为什么我没有得到
我有以下称为 pgain 的方法,它调用我试图并行化的方法 dist: /***************************************************************
我有一个 ruby 脚本读取一个巨大的表(约 2000 万行),进行一些处理并将其提供给 Solr 用于索引目的。这一直是我们流程中的一大瓶颈。我打算在这里加快速度,我想实现某种并行性。我对 Ru
我正在研究 Golang 并遇到一个问题,我已经研究了几天,我似乎无法理解 go routines 的概念以及它们的使用方式。 基本上我是在尝试生成数百万条随机记录。我有生成随机数据的函数,并将创建一
我希望 for 循环使用 go 例程并行。我尝试使用 channel ,但没有用。我的主要问题是,我想在继续之前等待所有迭代完成。这就是为什么在它不起作用之前简单地编写 go 的原因。我尝试使用 ch
我正在使用 import Control.Concurrent.ParallelIO.Global main = parallel_ (map processI [1..(sdNumber runPa
我正在尝试通过 makePSOCKcluster 连接到另一台计算机: library(parallel) cl ... doTryCatch -> recvData -> makeSOCKm
我是一名优秀的程序员,十分优秀!