我的需求是通过Java Webservice执行R脚本。webservice需要50的并发性。
我们使用RServe从Java代码中执行R脚本。为此,在linux服务器中,我们创建了50个RServe实例,从不同的端口开始。在java应用程序内部,创建了一个具有50个RConnection对象的连接池,每个对象都链接到创建的一个RServe实例。对于每次执行,我们从池中获取一个RConnection,执行R脚本,获取响应值,然后将RConnection返回到池中。
当我们在单个用户访问的情况下执行webservice时,R的执行在1秒内完成。但是,如果我尝试以50的并发性运行相同的try服务,那么在RServe中执行R脚本大约需要30秒。由于实际的R执行只需要1秒,如果以单用户执行,我认为我在RServe中做了一些错误的事情。任何提示都会有所帮助。
发布于 2016-11-24 09:43:30
虽然我认为最好是在Linux上使用一个Rserve实例,让它只派生子进程进行并行处理,但这可能根本不会加快处理速度。从你的问题中,不清楚应用程序是否被密集使用,并且许多并发请求正在被持续处理。如果是这样的话,我假设您的R代码是CPU密集型的,不同的进程只需要共享CPU时间,从而增加了完成所需的时钟时间。
我正是测试了这类场景,并在top中发现了以下结果
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
33839 ***** 20 0 269792 57104 3496 R 10.3 1.5 0:15.33 Rserve
33847 ***** 20 0 269776 57100 3496 R 10.3 1.5 0:09.86 Rserve
33849 ***** 20 0 269792 57104 3496 R 10.3 1.5 0:08.20 Rserve
33855 ***** 20 0 269528 56840 3496 R 10.3 1.5 0:04.92 Rserve
29725 ***** 20 0 268872 56836 4020 R 10.0 1.5 1360:13 Rserve
33841 ***** 20 0 269784 57100 3496 R 10.0 1.5 0:14.42 Rserve
33843 ***** 20 0 269796 57104 3496 R 10.0 1.5 0:12.50 Rserve
33844 ***** 20 0 269792 57104 3496 R 10.0 1.5 0:11.72 Rserve
33852 ***** 20 0 269512 56836 3496 R 10.0 1.5 0:06.38 Rserve
33856 ***** 20 0 269520 56836 3496 R 10.0 1.5 0:04.05 Rserve
33842 ***** 20 0 269776 57100 3496 R 9.3 1.5 0:13.20 Rserve
33851 ***** 20 0 269784 57100 3496 R 9.3 1.5 0:06.69 Rserve
33857 ***** 20 0 269512 56836 3496 R 9.3 1.5 0:03.15 Rserve
33834 ***** 20 0 269792 57112 3496 R 9.0 1.5 0:18.56 Rserve
33835 ***** 20 0 269784 57100 3496 R 9.0 1.5 0:17.33 Rserve
33837 ***** 20 0 269776 57100 3496 R 9.0 1.5 0:16.46 Rserve
33846 ***** 20 0 269784 57100 3496 R 9.0 1.5 0:10.17 Rserve
33848 ***** 20 0 269796 57104 3496 R 9.0 1.5 0:08.61 Rserve
33853 ***** 20 0 269532 56840 3496 R 9.0 1.5 0:05.34 Rserve
33858 ***** 20 0 269532 56840 3496 R 9.0 1.5 0:02.27 Rserve
33838 ***** 20 0 269796 57104 3496 R 8.6 1.5 0:15.74 Rserve
CPU百分比总和为200%,对应于两个可用的CPU核心。
正如您所看到的,这两个进程具有相同的优先级(PR=20),并且%CPU的份额几乎相等,大约为10%,因此,与只有一个Rserve实例的情况相比,所有这些进程分配的CPU时间都只有十分之一,因此完成所需的时间要长出10倍。
这不是20倍的时间,因为单个Rserve进程将只使用一个CPU核心,而让另一个核心“休眠”。
如果你想加快计算速度,你只需要更多的CPU。此外,如果您不希望第51个(或第101个或第100个)并发用户被拒绝访问,最好实现一个消息队列。您可以为队列创建多个工作进程,这可以在不同机器上的多个CPU上分配工作负载。
https://stackoverflow.com/questions/32340033
复制相似问题