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

时间:2016-03-04 22:01:05

标签: docker akka akka-http

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

enter image description here 我还有一个包含nginx作为负载均衡器的Docker镜像,以及两个基于Akka-HTTP的REST服务器。除了计数命中(它们总是返回200)之外,它们什么都不做。

独立运行其中一个服务器(在Docker之外)我已经能够获得1000次点击/秒。不确定这是否好。在这个Docker配置中,该数字下降到大约220次点击/秒。我有点期待,嗯... 2000次点击/秒或左右。更高甚至会更好。如果我能通过这种安排找到达到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,但这没有用。我的Akka的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""")
      }
    }
}

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

知道如何才能从中获得更多性能吗?

0 个答案:

没有答案