CPU ve sabit disk performansı maksimum olmasına rağmen gzip neden yavaş?


14

Sıkıştırmak istediğiniz bazı JSON dosyaları, her biri 20 GB var gzip:

gzip file1.json

Bu, tamamen iyi bir tam CPU çekirdeği kaplıyor.

Yaklaşık 25 MB / s (check-in atop) işliyor , sabit diskim 125 MB / s okuyabilir ve 3 ücretsiz işlemci çekirdeğine sahibim, bu yüzden birden fazla dosyayı paralel olarak sıkıştırırken hızlanmayı bekliyorum. Bu yüzden diğer terminallerde koşuyorum:

gzip file2.json
gzip file3.json
gzip file4.json

Şaşırtıcı bir şekilde, verimim artmıyor; CPU her çekirdekte yaklaşık% 25'tir ve HD'm hala sadece 25 MB / s'de okuyor.

Neden ve nasıl ele alınmalı?

Yanıtlar:


17

Ben buldum:

Bunun nedeni, gzip( günümüzde HD arama hızı ve CPU arama hızı açısından) son derece düşük arabellek boyutları üzerinde çalışıyor olmasıdır .

Giriş dosyasından birkaç KB okur, sıkıştırır ve çıktı dosyasına temizler. Bunun bir sabit sürücü araması gerektirdiği göz önüne alındığında, saniyede sadece birkaç işlem yapılabilir.

Performansımın ölçeklenmemesinin nedeni, zaten birisinin gzipdeli gibi aramasıydı.


Unix bufferyardımcı programını kullanarak bu konuda çalıştı :

buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz

Gzip'e göndermeden önce çok sayıda girdi arabelleğe alındığında, küçük aramaların sayısı önemli ölçüde azaltılabilir. Seçenekler:

  • -sve -marabellek boyutunu belirtmek için ( KB olduğuna inanıyorum , ama emin değilim)
  • -p 100 arabellek% 100 doldurulduğunda verilerin gzip'e aktarıldığından emin olur

Bunlardan dördünü paralel olarak çalıştırarak, beklendiği gibi 4 * 25 MB / s verim alabildim.


Hala neden gzip arabellek boyutunu artırmak için izin vermiyor merak ediyorum - bu şekilde, dönen bir disk üzerinde çalıştırmak oldukça işe yaramaz.

EDIT : Birkaç sıkıştırma programı davranışı denedim:

  • bzip2 daha güçlü / daha yoğun CPU sıkıştırması nedeniyle yalnızca 2 MB / sn işler
  • lzop daha büyük arabelleklere izin veriyor gibi görünüyor: çekirdek başına 70 MB / s ve 2 çekirdek, aşırı arama yapmadan HD'mi maksimize edebilir

Can ddaynı şeyi?
Simon Kuang

@SimonKuang ddAynı bs=seçenekle yapabileceğinden şüpheleniyorum , evet.
nh2

Tek bir dosya için blok boyutunun hem tek bir CPU çekirdeğini hem de bir sürücünün IOPS'sini tam olarak kullanması ilginç bir tesadüf gibi görünüyor.
Dave L.

3

6.172 için MIT OpenCourseware: "Yazılım Sistemlerinin Performans Mühendisliği" ilk beş dersine baktıktan sonra, Linux performans analizörünü 'perf' i orta derecede büyük bir test dosyasında çalıştırdım. Sonuç, bir komutun bir öncekinin sonucunu beklemesi gereken boru hattı duraklarını gösteriyor gibi görünüyor.

       │         while (lookahead != 0) {                                                                
       │             /* Insert the string window[strstart .. strstart+2] in the                          
       │              * dictionary, and set hash_head to the head of the hash chain:                     
       │              */                                                                                 
       │             INSERT_STRING(strstart, hash_head);                                                 
  2.07 │       movzbl 0x8096d82(%edx),%eax                                                               
  3.99 │       mov    %edx,%ebp                                                                          
       │       shl    $0x5,%ecx                                                                          
  0.03 │       and    $0x7fff,%ebp                                                                       
  1.94 │       xor    %ecx,%eax                                                                          
  1.43 │       and    $0x7fff,%eax                                                                       
  2.01 │       mov    %eax,0x805e588                                                                     
  2.40 │       add    $0x8000,%eax                                                                      
  0.88 │       movzwl 0x8062140(%eax,%eax,1),%ecx                                                        
 23.79 │       movzwl %cx,%edi                                                                           
       │             /* Find the longest match, discarding those <= prev_length.  

İkinci son talimat kopyalamaktır %ecxve sonuncusu, %cxkayıt defterinde kullanıma hazır veriler bulunana kadar beklemek zorundadır (boru hattının durdurulması) . Bu boru hattı durak içeren döngüyü tutar.

Bu, gerçekten belirsiz bazı 'eski okul' C programlama tarzının bir sonucudur.


1

Çok çekirdekli / hiper iş parçacıklı bir CPU'da başka bir hız seviyesine götürebilecek bir ipucu:
(Ubuntu varsayalım)

sudo apt-get moreutils yükleyin

moreutils diğer şeylerin yanı sıra "gnu paralel" içerir - bu da CPU'nuzdan daha fazla yararlanmanıza yardımcı olacak birçok seçeneğe sahiptir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.