如何在Docker和Akka HTTP中最大化吞吐量?

我正在build立一个特定的性能测量夹具。 我有一个负载生成器,繁荣( https://github.com/rakyll/boom )。 有了这个我可以产生一个相当不错的负载量。

在这里输入图像说明 我也有一个包含nginx作为负载平衡器的Docker镜像,以及两个基于Akka-HTTP的REST服务器。 除了点击命中之外,它们什么也不做(它们总是返回200)。

单机运行这些服务器(Docker之外)我已经能够达到1000点/秒。 不知道这是否好。 在这个Dockerconfiguration下,这个数字下降到每秒220次。 我有点期待,以及… 2000点击/秒左右。 更高会更好。 如果我能find一种方法来达到3-4K点击/秒的安排,我会很高兴。

我经常得到这样的错误信息:

[9549] Get http://192.168.99.100:9090/dispatcher?reply_to=foo: dial tcp 192.168.99.100:9090: socket: too many open files 

尝试使用–ulimit nofile = 2048运行我的Docker,但这并没有帮助。 我的阿卡的application.conf只是:

 akka { loglevel = "ERROR" stdout-loglevel = "ERROR" http.host-connection-pool.max-open-requests = 512 } 

服务器代码:

 object Main extends App { implicit val system = ActorSystem() implicit val mat = ActorMaterializer() println(":: Starting Simulator on port "+args(0)) Http().bindAndHandle(route, java.net.InetAddress.getLoopbackAddress.getHostAddress, args(0).toInt) var hits = 0 var isTiming = false var numSec = 1 lazy val route = get { path("dispatcher") { if(isTiming) hits += 1 complete(StatusCodes.OK) } ~ path("startTiming" / IntNumber) { sec => isTiming = true hits = 0 numSec = sec val timeUnit = FiniteDuration(sec, SECONDS) system.scheduler.scheduleOnce(timeUnit){ isTiming = false } complete(StatusCodes.OK) } ~ path("tps") { val tps = hits/numSec * 2 complete(s"""${args(0)}: TPS-$tps\n""") } } } 

操作原理:启动stream量stream动,然后调用/ startTiming / 10端点(在两台服务器之一上进行10秒捕获)。 10秒后,调用/ tps几次,时间节点将返回约。 点击次数/秒(x2)。

任何想法我怎么能得到更多的performance呢?