¿Cómo puedo maximizar el performance en Docker y Akka HTTP?

Estoy construyendo una plantilla específica para medir el performance. Tengo un generador de carga, boom ( https://github.com/rakyll/boom ). Con esto puedo generar una cantidad bastante decente de carga.

enter image description here También tengo una image Docker que contiene nginx como equilibrador de carga y dos serveres REST basados ​​en Akka-HTTP. No hacen nada más que contar aciertos (siempre devuelven 200).

Al ejecutar uno de estos serveres de forma independiente (fuera de Docker) pude get 1000 hits / segundo. No estoy seguro si eso es bueno o no. En esta configuration de Docker esa cifra cae a alnetworkingedor de 220 hits / second. Esperaba un poco, bueno … 2000 aciertos / segundo más o less. Más alto sería incluso mejor. Me alegraría si pudiera encontrar una forma de get 3-4 K hits / seg con este arreglo.

A menudo recibo un post de error como este:

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

Intenté ejecutar mi Docker con –ulimit nofile = 2048, pero eso no ayudó. Mi application.conf para Akka es simplemente:

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

El código del server:

 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""") } } } 

Teoría de la operación: comience el flujo de tráfico y luego llame al / endTiming / 10 endpoint (para una captura de 10 segundos en uno de los 2 serveres). Después de 10 segundos, llame / tps un par de veces y el nodo de time regresará aprox. éxitos / segundo (x2).

¿Alguna idea de cómo puedo get un mayor performance de esto?