Eu tenho alguns arquivos JSON, 20 GB cada, com os quais desejo compactar gzip
:
gzip file1.json
Isso ocupa um núcleo completo da CPU, tudo bem.
Ele processa cerca de 25 MB / s (com check-in atop
), meu disco rígido pode ler 125 MB / se eu tenho 3 núcleos de processador gratuitos, portanto, espero acelerar quando comprimir vários arquivos em paralelo. Então eu corro em outros terminais:
gzip file2.json
gzip file3.json
gzip file4.json
Surpreendentemente, minha taxa de transferência não aumenta; A CPU é de cerca de 25% em cada núcleo, e meu HD ainda lê apenas 25 MB / s.
Por que e como lidar com isso?
dd
fazer o mesmo?dd
possa fazer o mesmo com suabs=
opção, sim.Depois de examinar as cinco primeiras palestras do MIT OpenCourseware para 6.172: "Engenharia de desempenho de sistemas de software", executei o analisador de desempenho Linux 'perf' em um arquivo de teste moderadamente grande. O resultado parece mostrar paradas no pipeline em que uma instrução precisa aguardar o resultado da anterior.
A segunda última instrução está sendo copiada
%ecx
e a última precisa aguardar (paralisando o pipeline) até que o%cx
registro tenha dados prontos para uso. Essa parada do pipeline sustenta o loop de contenção.Isso é resultado de algum estilo de programação C realmente "obscuro".
fonte
Uma dica que pode levar a outro nível de velocidade em uma CPU multi-core / hyperthreading:
(assumindo o Ubuntu)
O moreutils contém, entre outras coisas, "gnu paralelo" - que tem muitas opções para ajudar a usar mais sua CPU.
fonte