xargs paralel kullanımını düzeltin


9

xargsYaklaşık 30 milyon küçük dosyayı işlemek için bir python betiği çağırmak için kullanıyorum . xargsSüreci paralelleştirmek için kullanmayı umuyorum . Kullanıyorum komut:

find ./data -name "*.json" -print0 |
  xargs -0 -I{} -P 40 python Convert.py {} > log.txt

Temel olarak, Convert.pyküçük bir json dosyasında (4kb) okur, biraz işlem yapar ve başka bir 4kb dosyasına yazar. 40 CPU çekirdeği olan bir sunucu üzerinde çalışıyorum. Ve bu sunucuda başka bir CPU yoğun işlem çalışmıyor.

Htop'u izleyerek (btw, CPU performansını izlemenin başka iyi bir yolu var mı?), -P 40Beklediğim kadar hızlı olmadığını düşünüyorum. Bazen tüm çekirdekler 3-4 saniye donar ve neredeyse sıfıra düşer, daha sonra% 60-70'e geri döner. Sonra paralel süreçlerin sayısını azaltmaya çalışıyorum -P 20-30, ama yine de çok hızlı değil. İdeal davranış doğrusal hızlanma olmalıdır. Xargs'ın paralel kullanımı için herhangi bir öneriniz var mı?


6
Büyük olasılıkla G / Ç'ye çarparsınız: Sistem dosyaları yeterince hızlı okuyamaz. 40'tan fazla başlatmayı deneyin: Bu şekilde, bazı işlemlerin G / Ç'yi beklemesi gerekecek.
Ole Tange

Senaryo ne tür bir işlem yapar? Herhangi bir veritabanı / ağ / io dahil? Ne kadar sürecek?
Fox

1
İkinci olarak @OleTange. Çekirdekleriniz olduğu kadar çok işlem çalıştırırsanız ve görevleriniz IO'ya bağlıysa, beklenen davranış budur. İlk önce çekirdekler görevleri (uyku) için IO'yu bekleyecek, sonra işleyecek ve daha sonra tekrar edecekler. Daha fazla işlem eklerseniz, şu anda fiziksel bir çekirdek üzerinde çalışmayan ek işlemler, paralel IO işlemlerini başlatmış olacak ve bu da bittiğinde çekirdeklerinizdeki uyku sürelerini ortadan kaldıracak veya en azından azaltacaktır.
PSkocik

1- Hiper iş parçacığı etkin mi? 2- orada ne var, log.txt aslında her convert.py çağrısı ile üzerine yazılır ... bunun amaçlanan davranış olup olmadığından emin değilim.
Bichoy

xargs -Pve gnu.org/software/parallel/…> yarı çizgi problemi nedeniyle yarış koşullarına açılmaktadır . Bunun yerine GNU Parallel kullanmak bu problemi yaşamayacaktır.
Ole Tange

Yanıtlar:


4

Sorununuzun python olduğuna bahse girmeye hazırım . Her dosyada ne tür bir işlem yapıldığını söylemediniz, ancak verilerin sadece bellek içi işlemesini yaptığınızı varsayarsak, çalışma süresine 30 milyon python sanal makinesi (tercüman) başlatarak hakim olunacaktır.

Python programınızı sadece bir yerine bir dosya listesi alacak şekilde yeniden yapılandırabiliyorsanız, performansta büyük bir gelişme elde edersiniz. Daha sonra, performansı daha da artırmak için xargs kullanabilirsiniz. Örneğin, her biri 1000 dosyayı işleyen 40 işlem:

find ./data -name "*.json" -print0 |
  xargs -0 -L1000 -P 40 python Convert.py

Bu, python'un kötü / yavaş bir dil olduğu anlamına gelmez; sadece başlangıç ​​zamanı için optimize edilmemiştir. Bunu herhangi bir sanal makine tabanlı veya yorumlanmış dilde göreceksiniz. Örneğin, Java daha da kötü olurdu. Programınız C dilinde yazıldıysa, yine de her dosyayı işlemek için ayrı bir işletim sistemi işlemi başlatmanın maliyeti olurdu, ancak çok daha az olacaktır.

Oradan -P, veri okunurken / yazılırken boşta işlemcilerden yararlanmak için süreç sayısını artırarak, biraz daha fazla hız sıkıştırabileceğinizi görmek için uğraşabilirsiniz .


1

İlk olarak, kısıtlamaları göz önünde bulundurun:

Her işteki kısıtlama nedir? I / O ise, muhtemelen I / O sınırına ulaşana kadar CPU çekirdeği başına birden fazla işten kurtulabilirsiniz, ancak CPU yoğunsa, eşzamanlı olarak CPU çekirdeklerinizden daha fazla iş çalıştırmaktan daha kötü olacaktır.

Bunları anladım, GNU Parallel size işlerin sırası vb. Üzerinde daha iyi kontrol sağlayacak.

Bkz Xargs -P vs & (Ben kötü mü arka) vs GNU paralel iki farklı şekline ilişkin daha ayrıntılı bir açıklama için.


0

Diğerlerinin söylediği gibi, G / Ç bağlı olup olmadığınızı kontrol edin. Ayrıca, xargs'ın man sayfası -nile birlikte kullanmanızı önerir , paralel olarak gördüğünüz işlemlerin -Psayısından bahsetmezsiniz Convert.py.

Bir öneri olarak, G / Ç'ye bağlıysanız, bir SSD blok cihazı kullanmayı deneyebilir veya bir tmpfs'de işlemi yapmayı deneyebilirsiniz (elbette, bu durumda tmpfs nedeniyle takastan kaçınarak yeterli belleği kontrol etmelisiniz. baskı (bence) ve ilk etapta verilerin kopyalanması yükü).

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.