Como Akka benefícios de ForkJoinPool?

gabrielgiussi:

Akka docs estados que despachante padrão é um fork-join-executor"excelente desempenho dá na maioria dos casos", porque.
Eu estou querendo saber por que é?

De ForkJoinPool

A ForkJoinPool difere de outros tipos de ExecutorService principalmente em virtude da contratação de trabalho de roubo: os tópicos na tentativa piscina para encontrar e executar tarefas enviadas para a piscina e / ou criados por outras tarefas ativos (eventualmente, bloqueando à espera de trabalho, se eles não existem) . Isso permite que (1) o processamento eficiente quando a maioria das tarefas de desova outras subtarefas (como fazem a maioria dos ForkJoinTasks) , bem como (2), quando muitas pequenas tarefas são submetidos à piscina de clientes externos . Especialmente quando a criação asyncMode a verdade em construtores, ForkJoinPools também pode ser (3) apropriado para uso com tarefas de estilo evento que nunca são unidas.

No início, eu acho que Akka não é um exemplo de caso (1), porque eu não consigo entender como Akka poderia ser bifurcação tarefas, quero dizer, o que seria a tarefa que poderia ser bifurcada em muitas tarefas?
Vejo cada mensagem como uma tarefa independente, é por isso que eu acho que Akka é semelhante ao caso (2), onde as mensagens são muitas pequenas tarefas que estão sendo apresentadas (via! E?) Para o ForkJoinPool.

A próxima pergunta, embora não estritamente relacionadas com akka, será, por um caso de uso onde garfo e junte-se (principais capacidades do ForkJoinPoolque permite que rouba trabalho) não estão sendo usados ainda pode ser beneficiado por ForkJoinPool?
De Escalabilidade de Fork Junte Piscina

Observou-se que o número de trocas de contexto era anormal, acima de 70000 por segundo.
Esse deve ser o problema, mas o que está causando isso? Viktor surgiu com o palpite qualificado que deve ser a fila de tarefas do executor pool de threads, uma vez que é compartilhado e os bloqueios no LinkedBlockingQueue poderia potencialmente gerar o contexto muda quando há contenção .

No entanto, se é verdade que Akka não usa ForkJoinTasks, todas as tarefas enviadas por clientes externos serão enfileirados na fila compartilhada, de modo a contenção deve ser o mesmo que no ThreadPoolExecutor.

Então, minhas perguntas são:

  1. Utilizações akka ForkJoinTasks(caso (1)) ou está relacionada com estojo (2)?
  2. Por que ForkJoinPoolé benéfico para o caso (2), se tudo o que tarefas apresentadas por clientes externos será empurrado para uma fila compartilhada e sem roubar o trabalho vai acontecer?
  3. Qual seria um exemplo de "com as tarefas de estilo evento que nunca são unidas" (caso 3)?

Atualizar

resposta correta é a de johanandren, no entanto gostaria de acrescentar alguns destaques.

  • O Akka Não use garfo e junte capacidades desde AFAIK com o modelo Ator, ou pelo menos como nós implementá-lo, não é realmente um caso de uso para que (de comentário das johanandren).
    Assim, a minha compreensão de que Akka não é uma instância de caso (1) foi correta.
  • Na minha resposta original que eu disse que todas as tarefas enviadas por clientes externos serão enfileirados na fila compartilhada .
    Este foi correta, mas apenas para uma versão anterior (JDK7) da FJP. Em jdk8 a única fila de envio foi substituído por muitos "filas de submissão". Esta resposta explica isso muito bem:

    Agora, antes que (IIRC) JDK 7u12, ForkJoinPool teve uma única fila de envio global. Quando segmentos de trabalho ficou sem tarefas locais, bem como as tarefas para roubar, eles chegaram lá e tentou ver se o trabalho externo está disponível. Neste projeto, não há nenhuma vantagem contra um regular, digamos, ThreadPoolExecutor apoiado por ArrayBlockingQueue. [...]
    Agora, a apresentação externa entra em uma das filas de submissão. Em seguida, os trabalhadores que não têm trabalho para mastigar, pode primeiro olhar para a fila de envio associado a um trabalhador particular, e, em seguida, passeio ao redor olhando para as filas de submissão dos outros. Pode-se chamar isso de "trabalho roubando" também.

Então, isso permitiu roubo de trabalho em cenários onde garfo juntar não foram utilizados. Como diz Doug Lea

Substancialmente melhor rendimento quando muitos clientes enviar lotes de tarefas. (Eu medido até 60X speedups em micro-benchmarks). A idéia é tratar submitters externas de uma maneira semelhante como trabalhadores - usando filas randomizado e roubar. (Isso exigiu um grande refactoring interna para filas de trabalho desassociar e trabalhadores.) Isso também melhora muito o rendimento quando todas as tarefas são assíncrono e submetido à piscina em vez de bifurcada, que se torna uma forma razoável de quadros estrutura ator, assim como muitos serviços simples que você poderia usar ThreadPoolExecutor para.

  • Há uma outra singularidade que vale a pena mencioná-lo sobre FJP retirado este comentário

    4% não é realmente muito para FJP. Ainda há um trade-off que você faz com FJP que você precisa estar ciente de: FJP mantém tópicos girando por um tempo para ser capaz de lidar com o trabalho just-in-time chegar mais rápido. Isso garante boa latência em muitos casos. Especialmente se sua piscina é overprovisioned, no entanto, o trade-off é um pouco de latência contra mais o consumo de energia em situações de quase-ociosas.

johanandren:

A FJP em Akka é executado com asyncMode = trueassim para a primeira pergunta que é - Tendo clientes externos apresentação curta / pequenas cargas de trabalho assíncronos. Cada carga de trabalho apresentado é ou despachar um ator para um processo ou algumas mensagens de sua caixa de entrada, mas também é usado para executar Scala Futureoperações.

Quando um não ForkJoinTaskestá programado para ser executado no FJP, é adaptada a um FJP e enfileirado assim como ForkJoinTasks. Há não é uma apresentação única onde as tarefas são enfileiradas (havia em uma versão inicial, JDK7 talvez), há muitos, ao que afirma evitar, e um thread inactivo pode escolher (roubar) tarefas de outras filas do que a sua própria, se é esvaziar.

Note que por padrão que estão sendo executados em uma versão bifurcada do Java 8 FJP, como vimos diminuição significativa na taxa de transferência com o Java 9 FJP quando que veio (ele contém um pouco de mudanças). Aqui é a edição # 21910 discutindo que se você estiver interessado. Além disso, se você quiser brincar com avaliação comparativa piscinas diferentes que você pode encontrar alguns *Poolbenchmarks aqui: https://github.com/akka/akka/tree/master/akka-bench-jmh/src/main/scala/akka/ ator

Acho que você gosta

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