Estou trabalhando com hardware de ponta, mas estou atingindo gargalos de CPU em todas as situações ao tentar mover grandes quantidades de dados.
Especificamente, estou movendo grandes arquivos de imagem de máquina virtual (VHD) de 2 TB entre dois hosts Ubuntu.
Minha última tentativa levou 200 minutos para transferir 2 TB. Resultando em uma taxa de transferência de cerca de 170 MB/s.
Estou tentando técnicas como netcat e scp com cifra básica arcfour.
O hardware em cada extremidade é 6 x SSDs de nível empresarial em RAID 10, em um controlador RAID de hardware. Memória de 256 GB e CPUs Xeon V4. A rede é 20Gbe (2 x 10Gbe LACP).
Em todos os casos, a rede e o disco i/o têm bastante capacidade restante, o gargalo está atrelando 1 núcleo de CPU a 100% constantemente.
Realizei benchmarks básicos usando vários métodos, como segue:
Transferência de arquivos de teste de 30 GB
scp: reais 5m1.970s
nc: reais 2m41.933s
nc & pigz: 1m24.139s reais
No entanto, como eu criei um arquivo vazio para teste, não acredito que o pigz estivesse tendo que trabalhar muito. Quando tentei pigz em um arquivo VHD de produção, pigz atingiu 1200% de carga da CPU, acredito que isso começou a se tornar o gargalo. Portanto, meu tempo mais rápido foi definido por nc por conta própria.
nc atinge 100% da CPU em cada extremidade, estou assumindo apenas processando o i/o do disco para a rede.
Eu pensei em dividir o arquivo em pedaços e executar vários nc para usar mais núcleos, no entanto, alguém pode ter uma sugestão melhor.
Algumas coisas para tentar:
sendfile
(por exemplo, apache)A Base de Conhecimento ESnet Fasterdata é um ótimo recurso para otimizar a movimentação de dados em redes rápidas.
Seus endpoints estão fisicamente próximos uns dos outros? Talvez considere um meio de rede diferente, projetado para mover grandes quantidades de dados. O processamento da CPU pode ser transferido para uma placa adaptadora e sua ethernet não ficará saturada por minutos de cada vez.
Abaixo está uma configuração Infiniband (low-end) que custa cerca de US $ 500 em peças do Ebay (switch Mellanox IS5022, 2 cartões QDR CX353A (talvez FDR, não me lembro) e (novos) cabos). Eu corri
dd
de um hypervisor com mais de 20 VMs rodando nele, então há uma quantidade razoável de atraso de E/S nele. A transferência SSD (uma montagem iSCSI) ainda é digna de nota.Para uma matriz SATA (RAID 10):
E para uma matriz SSD
Já faz um tempo que postei isso e está recebendo algumas visualizações, no final usei bbcp: https://github.com/eeertekin/bbcp para saturar a rede, funciona extremamente bem.