¿Cómo se beneficia de Akka ForkJoinPool?

gabrielgiussi:

Akka docs estados que despachador predeterminado es un fork-join-executor"excelente rendimiento da en la mayoría de los casos", ya que.
Me pregunto por qué es?

De ForkJoinPool

Un ForkJoinPool se diferencia de otros tipos de ExecutorService principalmente por virtud de emplear el trabajo de robo: todas las discusiones en el intento de la piscina para encontrar y ejecutar tareas presentados a la piscina y / o creados por otras tareas activas (el tiempo de bloqueo de espera para el trabajo si no los hay) . Esto permite que (1) el procesamiento eficiente cuando la mayoría de las tareas de regeneración otras subtareas (como lo hacen la mayoría de ForkJoinTasks) , así como (2) cuando muchas tareas pequeñas se someten a la piscina de los clientes externos . Especialmente cuando se configura asyncMode en true en constructores, ForkJoinPools también pueden ser (3) adecuado para su uso con las tareas de estilo acontecimiento que nunca se unen.

En un primer momento, supongo que Akka no es un ejemplo de caso (1) porque no puedo averiguarlo cómo Akka podría bifurcan tareas, quiero decir, ¿cuál sería la tarea que podría ser bifurcado en muchas tareas?
Veo cada mensaje como una tarea independiente, que es por eso que creo Akka es similar al caso (2), donde los mensajes son muchas pequeñas tareas que se haya remitido (a través de! Y?) Al ForkJoinPool.

La siguiente pregunta, aunque no es estrictamente relacionada con akka, será, por las que un caso de uso en el tenedor y se unen (principales capacidades de los ForkJoinPoolque permite el trabajo de robo) no se utilizan todavía puede ser beneficiado por ForkJoinPool?
De Escalabilidad del Tenedor de Ingreso piscina

Nos dimos cuenta de que el número de cambios de contexto era anormal, por encima de 70.000 por segundo.
Ese debe ser el problema, pero lo que está causando? Viktor se le ocurrió la conjetura cualificado que debe ser la cola de tareas del ejecutor grupo de subprocesos, ya que es compartida y las cerraduras en el LinkedBlockingQueue podría generar potencialmente el contexto cambia cuando hay contención .

Sin embargo, si bien es cierto que Akka no utiliza ForkJoinTasks, todas las tareas presentadas por los clientes externos se pondrán en cola en la cola compartida, por lo que la contención debe ser el mismo que en ThreadPoolExecutor.

Por lo tanto, mis preguntas son:

  1. Akka usos ForkJoinTasks(caso (1)) o está relacionado con el caso (2)?
  2. ¿Por qué ForkJoinPooles beneficioso en el caso (2) si todo lo que las tareas presentadas por los clientes externos serán empujados a una cola compartida y ningún trabajo de robo va a pasar?
  3. ¿Cuál sería un ejemplo de "tareas de estilo acontecimiento que nunca se unen" (caso 3)?

Actualizar

La respuesta correcta es la de johanandren, sin embargo, quiero añadir algunos aspectos destacados.

  • Akka no utiliza tenedor y se unen a las capacidades ya que yo sepa con el modelo de actor, o al menos cómo lo implementamos, no es realmente un caso de uso para eso (de comentario de johanandren).
    Así que mi entendimiento de que Akka no es una instancia de la caja (1) era correcta.
  • En mi respuesta original dije que todas las tareas presentadas por los clientes externos se pondrán en cola en la cola compartida .
    Esto era correcto, pero sólo de una versión anterior (JDK7) del FJP. En jdk8 la cola de envío solo fue reemplazado por muchos "colas de presentación". Esta respuesta explica esto así:

    Ahora, antes de (IIRC) JDK 7u12, ForkJoinPool tenía una sola cola de envío mundial. Cuando los subprocesos de trabajo quedaron sin tareas locales, así las tareas de robar, llegaron y trataron de ver si el trabajo externo está disponible. En este diseño, no hay ninguna ventaja frente a un habitual, por ejemplo, ThreadPoolExecutor respaldado por ArrayBlockingQueue. [...]
    Ahora, la presentación externa entra en una de las colas de presentación. Entonces, los trabajadores que no tienen un trabajo de Munch, en primer lugar pueden mirar en la cola de envío asociado a un trabajador en particular, y luego pasear por mirar en las colas de la sumisión de los demás. Uno puede llamar a que "el trabajo robar" también.

Por lo tanto, esto permitió robar el trabajo en escenarios donde tenedor unión no fueron utilizados. Como dice Doug Lea

Sustancialmente mejor rendimiento cuando una gran cantidad de clientes envían un montón de tareas. (He medido hasta 60X aceleraciones de micro-puntos de referencia). La idea es tratar a los remitentes externos de una manera similar a los trabajadores - el uso de colas aleatorizado y el robo. (Esto requiere una gran refactorización interna a las colas de trabajo se disocian y trabajadores.) Esto también mejora notablemente el rendimiento cuando todas las tareas son asíncrono y sometido a la piscina y no bifurcado, que se convierte en una forma razonable de los marcos de la estructura del actor, así como muchos servicios de civil que de otro modo podrían utilizar para ThreadPoolExecutor.

  • Hay otra singularidad que vale la pena mencionar que sobre FJP tomado de este comentario

    4% no es de hecho mucho para FJP. Todavía hay un trade-off que se hace con FJP los que es necesario tener en cuenta: FJP mantiene hilos que hacen girar por un tiempo para ser capaz de manejar el trabajo justo a tiempo de llegar más rápido. Esto asegura una buena latencia en muchos casos. Especialmente si su piscina está overprovisioned, sin embargo, la compensación es un poco de latencia contra más el consumo de energía en situaciones casi inactivos.

johanandren:

El FJP en Akka se ejecuta con asyncMode = truelo que para la primera pregunta que es - tener clientes externos presentación corta / pequeñas cargas de trabajo asincrónicos. Cada carga de trabajo presentado está enviando ya sea un actor con un procedimiento o un par de mensajes de su bandeja de entrada, pero también se utiliza para ejecutar Scala Futureoperaciones.

Cuando un país que no ForkJoinTaskestá programado para ejecutarse en el FJP, se adapta a una FJP y en cola como ForkJoinTasks. No hay ni una sola presentación, donde se ponen en cola tareas (que había en una primera versión, JDK7 tal vez), hay muchos, a la afirmación evitar, y un hilo vacío pueden recoger (roban) las tareas de otras colas que su propia si es vacío.

Tenga en cuenta que por defecto que se están ejecutando actualmente en una versión bifurcada de la Java 8 FJP, como vimos disminución significativa en el rendimiento con el de Java 9 FJP cuando eso vino (que contiene un poco de cambios). Esta es la edición # 21910 discutiendo que si usted está interesado. Además, si desea jugar con diferentes piscinas de evaluación comparativa se pueden encontrar unos *Poolpuntos de referencia aquí: https://github.com/akka/akka/tree/master/akka-bench-jmh/src/main/scala/akka/ actor

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=136779&siteId=1
Recomendado
Clasificación