Katran + gzip / bzip sıkıştırma / açma için çoklu çekirdek kullanımı


225

Normalde kullanarak sıkıştırıyorum tar zcvfve kullanarak sıkıştırmayı açıyorum tar zxvf(alışkanlık nedeniyle gzip kullanarak).

Son zamanlarda hiper iş parçacıklı bir dört çekirdekli CPU aldım, bu yüzden 8 mantıksal çekirdeğe sahibim ve çekirdeklerin çoğunun sıkıştırma / açma sırasında kullanılmadığını fark ettim.

Kullanılmayan çekirdekleri daha hızlı hale getirmek için kullanabilmemin bir yolu var mı?


Yukarıda Xiong Chiamiov tarafından önerilen çözüm güzel çalışıyor. Dizüstü bilgisayarımı .tar.bz2 ile yedekledim ve sadece bir cpu ipliği kullanarak 132 dakika sürdü. Daha sonra tar kaynağını derlemeden kurduk : gnu.org/software/tar Yapılandırma adımında belirtilen seçenekleri ekledim : ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip Yedeklemeyi tekrar çalıştırdım ve sadece 32 dakika sürdü. Bu 4X iyileştirmeden daha iyi! Sistem monitörünü izledim ve tüm 4 cpus'u (8 iplik) tüm zaman boyunca% 100 düzleştirilmiş halde tuttu. BU en iyi çözümdür.
Warren Severin

Yanıtlar:


309

Birden çok çekirdeğe gzip sıkıştırması yapan gzip yerine pigz kullanabilirsiniz . -Z seçeneğini kullanmak yerine, pigz ile boru döşersiniz:

tar cf - paths-to-archive | pigz > archive.tar.gz

Varsayılan olarak, pigz kullanılabilir çekirdek sayısını veya bunu sorgulayamadıysa sekiz kullanır. -Pn ile daha fazlasını isteyebilirsiniz, örneğin -p 32. pigz, gzip ile aynı seçeneklere sahiptir, bu nedenle -9 ile daha iyi sıkıştırma talep edebilirsiniz. Örneğin

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz

3
Pigz'i aynı şekilde açmak için nasıl kullanıyorsunuz? Yoksa sadece sıkıştırma için mi çalışır?
user788171

42
pigz, dekompresyon için çoklu çekirdekler kullanır, ancak sadece tek bir çekirdek üzerinde sınırlı gelişme ile. Deflate formatı kendisini paralel dekompresyona borçlandırmaz. Dekompresyon kısmı seri olarak yapılmalıdır. Pigz dekompresyonu için diğer çekirdekler CRC'yi okumak, yazmak ve hesaplamak için kullanılır. Öte yandan Sıkıştırırken, pigz bir faktör yakın alır , n ile iyileştirme , n çekirdekleri.
Mark Adler

7
Buradaki kısa çizgi stdout ( bu sayfaya bakın ).
Garrett

3
Evet. Her iki yönde% 100 uyumlu.
Mark Adler

4
Katran için harcanan CPU zamanı etkili değildir, bu yüzden fazla yardımcı olmaz. Tar biçimi, dosyalar arasında başlık blokları bulunan giriş dosyasının sadece bir kopyasıdır.
Mark Adler

324

Katran bayrağını hangi sıkıştırma programının kullanacağını söylemek için "--use-dvd-program =" katranını da kullanabilirsiniz.

Örneğin:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 

21
Bu harika bir küçük külçe ve daha fazla oy hak ediyor. Bu seçeneğin bile var olduğu hakkında hiçbir fikrim yoktu ve yıllar boyunca kılavuz sayfasını birkaç kez okudum.
Randall Hunt

2
@ValerioSchiavoni: Burada değilim, tüm 4 çekirdeğin tam yükünü alıyorum (Ubuntu 15.04 'Vivid').
bovender

8
Tercih ederim tar - dir_to_zip | pv | pigz > tar.filepv tahmin etmeme yardımcı olur, atlayabilirsiniz. Ama yine de yazmak ve hatırlamak daha kolay.
Offenso

@ NathanS.Watson-Haigh Evet. Program adını ve argümanlarını tırnak içine almanız yeterlidir. man tarböylece, hem yapar diyor bu .
Marc.2377

1
2020'de zstdbunu yapmanın en hızlı aracı. Sıkıştırma ve açma sırasında fark edilir hızlanma. tar -cf --use-compress-program=zstdmtBunu çoklu iş parçacığıyla yapmak için kullanın .
jadelord

112

Ortak bir yaklaşım

tarProgram için bir seçenek var :

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

Archiver veya kompresör yardımcı programının çok iş parçacıklı sürümünü kullanabilirsiniz.

En popüler çok iş parçacıklı arşivler pigz (gzip yerine) ve pbzip2'dir (bzip2 yerine). Örneğin:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

Arşivleyici -d'yi kabul etmelidir. Değişim yardımcı programınızda bu parametre yoksa ve / veya ek parametreler belirtmeniz gerekiyorsa, borular kullanın (gerekirse parametreleri ekleyin):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

Tekli ve çok parçalı giriş ve çıkışlar uyumludur. Çok parçalı sürümü kullanarak sıkıştırabilir ve tekli sürümü kullanarak sıkıştırmayı açabilirsiniz veya tam tersini yapabilirsiniz.

p7zip

Sıkıştırma için p7zip için aşağıdaki gibi küçük bir kabuk betiğine ihtiyacınız vardır:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

7zhelper.sh kaydedin. İşte kullanım örneği:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

xz

Çok iş parçacıklı XZ desteği ile ilgili. XZ Utils'ın 5.2.0 veya daha üst bir sürümünü çalıştırıyorsanız, XZ_DEFAULTS (örn. ) Çevresel değişkeni aracılığıyla uygun bir değere ayarlayarak -Tveya --threadsuygun bir değere sıkıştırma için birden fazla çekirdek kullanabilirsiniz XZ_DEFAULTS="-T 0".

Bu 5.1.0 alfa versiyonu için bir insan parçası:

Çok iş parçacıklı sıkıştırma ve açma işlemi henüz uygulanmadığından, bu seçeneğin şimdilik bir etkisi yoktur.

Ancak bu, iş parçacığı etkinleştirilmişken de sıkıştırılmamış dosyaların sıkıştırılması için çalışmaz. 5.2.2 sürümü için insandan:

Dişli dekompresyon henüz uygulanmadı. Yalnızca blok başlıklarında boyut bilgisi olan birden fazla blok içeren dosyalarda çalışır. Çok iş parçacıklı modda sıkıştırılmış tüm dosyalar bu koşulu karşılar, ancak tek iş parçacıklı modda sıkıştırılmış dosyalar --block-size = size kullanılsa bile çalışmaz.

Değiştirme ile yeniden derleme

Kaynaklardan tar oluşturursanız, parametrelerle yeniden derleyebilirsiniz

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

Katranı bu seçeneklerle yeniden derledikten sonra katran yardımının çıktısını kontrol edebilirsiniz:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz

1
Bu gerçekten en iyi cevap. Katranımı kesinlikle yeniden inşa edeceğim!

1
Az önce pbzip2 ve mpibzip2'yi buldum . mpibzip2, kümeler için veya örneğin bir dizüstü bilgisayarınız ve çok çekirdekli bir masaüstü bilgisayarınız varsa çok umut verici görünüyor.

Bu harika ve ayrıntılı bir cevap. Çok iş parçacıklı sıkıştırmanın (örn. İle pigz) yalnızca dosyadan okunduğunda etkinleştirildiğinden bahsetmek iyi olabilir . STDIN işlemek aslında daha yavaş olabilir.
oᴉɹǝɥɔ

3
Artı 1 xzseçeneği için. En basit ama etkili yaklaşım.
selurvedu

2
export XZ_DEFAULTS="-T 0"xz sıkıştırma tarseçeneği ile aramadan önce -Jcazibe gibi çalışır.
scai

13

-IKatran --use-compress-programanahtarı için kısayolu kullanabilir ve pbzip2birden çok çekirdeğe bzip2 sıkıştırması başlatabilirsiniz :

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/

MaximSuslov'un cevabı için güzel bir TL; DR .
einpoklum

Bu döner tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash

1

Dosya adları ve sıkıştırma seçeneklerinde daha fazla esnekliğe sahip olmak istiyorsanız, şunları kullanabilirsiniz:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

Aşama 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

Bu komut arşivlemek istediğiniz dosyaları, bu durumda /my/path/*.sqlve /my/path/*.log. -o -name "pattern"İstediğiniz kadar ekleyin .

-execaşağıdaki komutu kullanarak bir sonraki komutu yürütür find:tar

Adım 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transformbasit bir dize değiştirme parametresidir. Dosyaların arşivdeki yolunu çıkarır, böylece tarball'ın kökü ayıklanırken geçerli dizin olur. -CAvantajları kaybedeceğiniz için dizini değiştirme seçeneğini kullanamayacağınızı unutmayın find: dizindeki tüm dosyalar dahil edilecektir.

-Ptarmutlak yollar kullanmasını söyler , bu nedenle "Önde gelen` / '' üye adlarından çıkarılıyor "uyarısını tetiklemez. İle başlayan '/' --transformyine de kaldırılır .

-cf -tardaha sonra belirleyeceğimiz tarball adını kullanmayı söyler

{} +findönceden bulunan her dosyayı kullanır

Aşama 3: pigz

pigz -9 -p 4

İstediğiniz kadar parametre kullanın. Bu durumda -9sıkıştırma seviyesi ve -p 4sıkıştırmaya ayrılan çekirdek sayısıdır. Bunu ağır yüklü bir web sunucusunda çalıştırırsanız, muhtemelen tüm kullanılabilir çekirdekleri kullanmak istemezsiniz.

4.Adım: Arşiv adı

> myarchive.tar.gz

En sonunda.


0

Dikkate almak isteyebileceğiniz nispeten daha yeni (de) bir sıkıştırma aracı standarttır . Yedek çekirdeklerin kullanılması konusunda mükemmel bir iş çıkarır ve sıkıştırma oranı ile (de) sıkıştırma süresi söz konusu olduğunda bazı büyük ödünleşmeler yapmıştır. Sıkıştırma oranı gereksinimlerinize bağlı olarak da son derece ince ayar yapılabilir.

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.