Estou correndo cat
para combinar separadamente file_X
com um grande número de arquivos, por exemplo, file_1
para file_100000000000
.
Devido ao grande número, distribuí o trabalho para um nó com 64 CPUs para rodar paralelamente em cada CPU. Cada trabalho é executado em uma subpasta e, portanto, há 64 subpastas.
Para minha surpresa, a velocidade geral é muito mais lenta do que o esperado.
Como o shell script que usei apenas direcionou cada job para o mesmo single file_X
localizado no diretório pai das 64 subpastas, gostaria de saber se várias CPUs leem simultaneamente o mesmo arquivo único, diminuiria a velocidade de leitura de cada CPU?
Sim e não.
A leitura real do arquivo deve acontecer na mesma velocidade, independentemente de quantos processadores estão fazendo isso.
No entanto, dependendo do sistema operacional e de sua configuração, pode haver bloqueio de arquivo que está acontecendo. Embora vários processos possam ter um bloqueio de leitura simultaneamente, obter um bloqueio e liberar esse bloqueio deve acontecer em um bloco de exclusão mútua compartilhado. Se o seu sistema está fazendo esses tipos de bloqueios, os processadores devem se alinhar para obter acesso ao arquivo e, em seguida, devem se alinhar posteriormente para declarar sua falta de interesse no arquivo.
Dependendo do sistema de arquivos que armazena o arquivo_X e os vários arquivos que estão sendo combinados com ele e as opções com as quais esse sistema de arquivos foi montado, o tempo de acesso do arquivo_X pode ser atualizado cada vez que cat o lê. Se este for o caso, é provável que haja um bloqueio de gravação no inode file_X antes de cada atualização, que será então liberada.
Outra possível razão para a velocidade reduzida é o fato de que todos os 64 desses trabalhos estão gravando arquivos em paralelo, que estão necessariamente em pontos diferentes do disco. A menos que você esteja usando uma unidade de estado sólido (SSD), isso pode exigir uma quantidade substancial de movimento das cabeças de gravação no disco. Esses arquivos estão em 64 diretórios diferentes, então existem 64 locais para atualizar além dos arquivos que estão sendo criados.
Fazer toda essa atividade em um script de shell significa que cada cópia de arquivo é executada em fork. Fork é visto como uma chamada de sistema bastante cara, mas em um sistema com bibliotecas compartilhadas, não é nada comparado ao custo da família exec de chamadas de sistema, pois isso requer uma pesquisa por todas as bibliotecas compartilhadas e o carregamento de todas elas. bibliotecas. Este é outro lugar que poderia ter um bloqueio de leitura colocado em um arquivo, dependendo exatamente em qual unix ele está e possivelmente qual é sua configuração.