corrigir uso paralelo de xargs

8

Estou usando xargs para chamar um script python para processar cerca de 30 milhões de arquivos pequenos. Espero usar xargs para paralelizar o processo. O comando que estou usando é:

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

Basicamente, Convert.py lerá em um pequeno arquivo json (4kb), fará algum processamento e gravará em outro arquivo de 4kb. Estou executando em um servidor com 40 núcleos de CPU. E nenhum outro processo intenso da CPU está sendo executado neste servidor.

Ao monitorar o htop (btw, existe alguma outra boa maneira de monitorar o desempenho da CPU?), acho que -P 40 não é tão rápido quanto o esperado. Às vezes todos os núcleos congelam e diminuem quase a zero por 3-4 segundos, depois se recuperam para 60-70%. Então tento diminuir o número de processos paralelos para -P 20-30 , mas ainda não é muito rápido. O comportamento ideal deve ser a aceleração linear. Alguma sugestão para o uso paralelo de xargs?

    
por Yan Zhu 19.04.2015 / 08:59

3 respostas

3

Eu estaria disposto a apostar que o seu problema é python . Você não disse que tipo de processamento está sendo feito em cada arquivo, mas supondo que você esteja apenas processando os dados na memória, o tempo de execução será dominado pelo início de 30 milhões de máquinas virtuais python (intérpretes).

Se você puder reestruturar seu programa python para obter uma lista de arquivos, em vez de apenas um, obterá uma grande melhoria no desempenho. Você ainda pode usar xargs para melhorar ainda mais o desempenho. Por exemplo, 40 processos, cada um processando 1000 arquivos:

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

Isso não quer dizer que python seja uma linguagem ruim / lenta; simplesmente não é otimizado para o tempo de inicialização. Você verá isso com qualquer linguagem baseada em máquina virtual ou interpretada. Java, por exemplo, seria ainda pior. Se seu programa foi escrito em C, ainda haveria um custo de iniciar um processo separado do sistema operacional para manipular cada arquivo, mas seria muito menos.

De lá, você pode mexer com -P para ver se consegue aumentar um pouco mais a velocidade, talvez aumentando o número de processos para aproveitar os processadores inativos enquanto os dados estão sendo lidos / gravados.

    
por 24.04.2015 / 20:00
1

Primeiramente, considere as restrições:

Qual é a restrição em cada trabalho? Se for E / S, provavelmente você pode sair com vários trabalhos por núcleo de CPU até atingir o limite de E / S, mas se for um uso intensivo da CPU, será pior do que inútil executar mais tarefas. ao mesmo tempo que você tem núcleos de CPU.

Meu entendimento dessas coisas é que o GNU Parallel daria a você melhor controle sobre a fila de trabalhos etc.

Veja GNU parallel vs & (Quero dizer fundo) vs xargs -P para uma explicação mais detalhada de como os dois diferem.

    
por 24.04.2015 / 15:03
0

Como os outros disseram, verifique se você está limitado por E / S. Além disso, a página man do xargs sugere usar -n com -P , você não menciona o número de Convert.py processos que você vê executando em paralelo.

Como uma sugestão, se você está ligado a E / S, você pode tentar usar um dispositivo de bloco SSD, ou tentar fazer o processamento em um tmpfs (claro, neste caso você deve verificar se há memória suficiente, evitando swap devido à pressão tmpfs (eu acho), e a sobrecarga de copiar os dados para ele em primeiro lugar).

    
por 24.04.2015 / 17:19