Çok fazla arka plan işi başlatırsam ne olur?


13

Bir beklenti komut dosyası kullanarak 700 ağ cihazlarında bazı işler yapmam gerekiyor. Bunu sırayla yapabilirim, ancak şimdiye kadar çalışma süresi yaklaşık 24 saat. Bu çoğunlukla bir bağlantı kurmak için geçen zaman ve bu cihazlardan (eski olanlar) çıkıştaki gecikmeden kaynaklanmaktadır. İki bağlantı kurabiliyorum ve paralel olarak paralel çalışmasını sağlayabiliyorum, ama bunu ne kadar ileri itebilirim?

Bunların 700 tanesini aynı anda yapabileceğimi sanmıyorum, kesinlikle hayır için bir sınır var. VM'imin yönetebileceği telnet bağlantılarının

Eğer bunlardan 700 tane böyle bir döngüde başlatmayı denediysem:

for node in `ls ~/sagLogs/`; do  
    foo &  
done

İle

  • CPU 12 CPU x Intel (R) Xeon (R) CPU E5649 @ 2,53GHz

  • Bellek 47.94 GB

Sorum şu:

  1. 700 örneğin tümü aynı anda çalışabilir mi?
  2. Sunucum sınırına ulaşıncaya kadar ne kadar uzağa gidebilirim?
  3. Bu sınıra ulaşıldığında, bir sonraki yinelemeye başlamak için mi bekleyecek fooyoksa kutu çökecek mi?

Ne yazık ki kurumsal bir üretim ortamında çalışıyorum, bu yüzden ne olduğunu tam olarak deneyip göremiyorum.


3
parallelYaklaşık 50 eşzamanlı iş kullanarak iyi şanslar yaşadım . 1 ile 700 arasındaki paralellik arasında harika bir ortam. Bir diğer güzel şey de batchless. Tek bir duraklı bağlantı diğerlerinin değil, yalnızca kendini durduracaktır. Ana dezavantajı hata yönetimi. Kabuk tabanlı yaklaşımların hiçbiri hataları incelikle işlemeyecektir. Başarıyı kendiniz manuel olarak kontrol etmeniz ve kendi yeniden denemelerinizi yapmanız gerekir.
Adam

1
Görev kuyruğunuz bugün 700 olabilir, ancak boyut genişleyebilir mi? Takas alanının büyümesine dikkat edin - bu, bellek sınırına ulaştığınızın göstergesidir. Ve cpu% iyi bir ölçü değildir (linux / unix için), yük ortalamasını (çalışma kuyruğu uzunluğu) dikkate almak daha iyidir.
ChuckCottrill

1
Hala yeni olan işimde üretime son vermenin yolu yanlışlıkla bir milyon artı kısa ömürlü arka plan işini aynı anda yürütmekti. JVM'leri dahil ettiler (bekle, dirgenleri yere bırakın), bu nedenle sonuçlar, iş parçacıklarının başlatılamadığı yüz binlerce hata raporu dosyasıyla 'sınırlı' idi.
michaelb958 - GoFundMonica


1
@KuboMD Ve hiç kimse kodunuzu kullanmak istemediği sürece.
l0b0

Yanıtlar:


17

700 örneğin tümü aynı anda çalışabilir mi?

Bu aynı anda ne demek istediğinize bağlı. Seçici olursak, hayır, sisteminizde kullanabileceğiniz 700 yürütme iş parçacığı yoksa (muhtemelen değil) yapamazlar. Gerçekçi olarak, evet, sistemde yeterli RAM ve / veya takas alanı olması koşuluyla, muhtemelen yapabilirler. UNIX ve çeşitli çocukları, büyük eşzamanlılık düzeylerini yönetmede oldukça iyi, bu da büyük ölçekli HPC kullanımı için neden bu kadar popüler olduklarının bir parçası.

Sunucum sınırına ulaşıncaya kadar ne kadar uzağa gidebilirim?

Daha fazla bilgi olmadan somut olarak cevap vermek imkansızdır. Hemen hemen, karşılamak için yeterli belleğe sahip olmanız gerekir:

  • Bir işin tüm çalışma zamanı bellek gereksinimleri, 700 kez.
  • Birçok işi yönetmek için bash'ın bellek gereksinimleri (bash bu konuda korkunç değildir, ancak iş kontrolü tam olarak bellek verimli değildir).
  • Sistemdeki diğer tüm bellek gereksinimleri.

Bunu karşıladığınızı varsayarsak (yine yalnızca 50GB RAM ile, diğer sorunlarla uğraşmaya devam edersiniz:

  • İş kontrolünde bash tarafından ne kadar CPU süresi harcanacak? Muhtemelen çok fazla değil, ancak yüzlerce işte önemli olabilir.
  • Bunun için ne kadar ağ bant genişliği gerekir? Tüm bu bağlantıların açılması, bant genişliğinize ve gecikmenize bağlı olarak ağınızı birkaç dakika batabilir.
  • Muhtemelen hiç düşünmediğim birçok şey.

Bu sınıra ulaşıldığında, bir sonraki yinelemeye başlamak için beklemek mi yoksa kutu çökecek mi?

Hangi limitin vurulduğuna bağlıdır. Bellekse, sistemde bir şey ölür (daha spesifik olarak, belleği boşaltmak için çekirdek tarafından öldürülür) veya sistemin kendisi çökebilir (bellek yetersiz kaldığında sistemleri kasıtlı olarak çökecek şekilde yapılandırmak olağandışı değildir). CPU zamanı ise, sorun olmadan devam edecek, sistemde başka şeyler yapmak imkansız olacak. Yine de ağ ise, diğer sistemleri veya hizmetleri çökertebilirsiniz.


Ne gerçekten burada gerek aynı anda tüm işlerini yapacak değildir. Bunun yerine, bunları gruplara ayırın ve bir gruptaki tüm işleri aynı anda çalıştırın, bitirmelerine izin verin, ardından bir sonraki toplu işi başlatın. GNU Parallel ( https://www.gnu.org/software/parallel/ ) bunun için kullanılabilir, ancak bir üretim ortamında bu ölçekte ideal olmaktan daha azdır (eğer giderseniz çok agresif olmayın, Dediğim gibi, ağı batabilir ve dokunmayacağınız sistemleri etkileyebilirsiniz). Ansible ( https://www.ansible.com/) gibi uygun bir ağ düzenleme aracına bakmanızı gerçekten tavsiye ederim.), çünkü sadece eşzamanlılık sorunlarınızı çözmekle kalmayacak (Ansible, otomatik olarak yukarıda bahsettiğim gibi toplu iş yapıyor), aynı zamanda size çalışmanız için birçok yararlı özellik de sunuyor (görevlerin idempotent yürütülmesi, güzel durum raporları ve yerel entegrasyon gibi) çok sayıda başka araç).


Sınırlı sayıda arka plan görevi çalıştırmanın (bash, perl, python ve ark.), Görevin tamamlanmasını izlemenin ve önceki görevler tamamlandığında daha fazla görevi çalıştırmanın yolları vardır. Basit bir yaklaşım, alt dizinlerdeki dosyalar tarafından temsil edilen görev gruplarını toplamak ve bir seferde bir toplu işi işlemek olacaktır. Başka yollar da var ...
ChuckCottrill

Bu aynı zamanda unix benzeri sistemleri de içeriyor mu? Peki "GUN paralel" nedir?
Biswapriyo

2
@ChuckCottrill Evet, bunun yapılabilecek başka yolları da var. Bu tür bir şeyle ilgili kendi deneyimim göz önüne alındığında, özellikle ölçek açısından birkaç düzine sistemi geçtikten sonra, kendi çözümünüzü denemek ve yuvarlamaktan ziyade gerçek bir düzenleme aracı almak neredeyse her zaman daha iyidir.
Austin Hemmelgarn


3
@forest Evet, sistemin çökmesini önlemek için rlimits kullanabilirsiniz, ancak böyle bir durumda bunları doğru yapmak kolay değildir (görevler için kaynak gereksinimlerinin önceden ne olduğunu bilmeniz gerekir) ve ağın geri kalanı, bu işlerin neden olabileceği herhangi bir etkiden kaynaklanmaktadır (bu, muhtemelen yerel sistemi çökmekten daha büyük bir sorun olabilir).
Austin Hemmelgarn

12

Tanımladığınız şekilde arka plan işleri olarak kaç örneğin çalıştırılabileceğini söylemek zor. Ancak normal bir sunucu, doğru şekilde yaptığınız sürece 700 eşzamanlı bağlantıyı kesinlikle koruyabilir. Web sunucuları bunu her zaman yapar.

Bunu yapmak için GNU paralel ( https://www.gnu.org/software/parallel/ ) veya benzeri bir şey kullanmanızı önerebilir miyim ? Arka plan iş yaklaşımına bir takım avantajlar sağlayacaktır:

  • Eşzamanlı oturum sayısını kolayca değiştirebilirsiniz.
  • Ve yeni oturumlara başlamadan önce oturumların tamamlanmasını bekleyecektir.
  • İptal etmek daha kolay.

Hızlı bir başlangıç ​​için buraya bir göz atın: https://www.gnu.org/software/parallel/parallel_tutorial.html#A-single-input-source


1
İlginç! Buna bir göz atacağım. Bu tür bir operasyonu denemenin (Paralel yardımı olmadan) hipervizörü çökmesine neden olup olmayacağını biliyor musunuz?
KuboMD

2
@KuboMD, hipervizörü bu kadar sıradan bir şeyle çarpabilirseniz, hipervizörde bir hata var :)
Ocaklar

bir yana, web sunucuları genellikle iş parçacığı veya olay tabanlı işleme kullanır (örnek: gunicorn.org )
ChuckCottrill

10

&Paralel işlem için kullanmak , birkaç işlem yaparken ve ilerlemeyi izlediğinizde iyidir. Ancak kurumsal bir üretim ortamında çalışıyorsanız, size daha iyi kontrol sağlayan bir şeye ihtiyacınız vardır.

ls ~/sagLogs/ | parallel --delay 0.5 --memfree 1G -j0 --joblog my.log --retries 10 foo {}

Bu, fooiçindeki her dosya için çalışır ~/sagLogs. Her 0.5 saniyede bir iş başlatır, 1 GB RAM boş olduğu sürece olabildiğince çok sayıda paralel olarak çalışır, ancak sisteminizdeki sınırlara (örn. Dosya ve işlem sayısı) uyur. Bu, izin verilen açık dosya sayısını ayarlamadıysanız, 250 işi paralel olarak çalıştıracağınız anlamına gelir. Açık dosya sayısını ayarlarsanız, yeterli belleğe sahip olduğunuz sürece 32000'i paralel çalıştırırken sorun yaşamamalısınız.

Bir iş başarısız olursa (yani bir hata kodu ile dönerse) 10 kez yeniden denenecektir.

my.log bir işin başarılı olup olmadığını (muhtemelen tekrar denedikten sonra) söyleyecektir.


Bu çok umut verici görünüyor, teşekkürler.
KuboMD

Basit bir test cat ~/sagLogs/* >> ~/woah | parallelyaptım ve hızlı olan kutsal moly. Göz açıp kapayıncaya kadar 1.054.552 satır.
KuboMD

3
Verdiğiniz komutun çift yönlendirmesi var, bu yüzden yapmak istediğinizi yaptığını sanmıyorum. GNU Parallel, iş başına 10 ms ek yüke sahiptir, bu nedenle 1M işlerinin 3 saat sürmesi gerekir.
Ole Tange

1
Yapmak istediğiniz tek şey dosyaları birleştirmekse hiç geçerli değildir.
Ole Tange

1
@KuboMD gibi önemsiz bir CPU meşgul döngü awk 'BEGIN{for(i=rand()*10000000; i<100000000;i++){}}' ile oynamak için işe yarayacaktı. Ya da çok fazla CPU zamanı kullanmadan işleri uçuşta sleep 10tutmasını görmek gibi bir görevde deneyin n. örneğin time parallel sleep ::: {100..1}, 100 saniyeden 1 saniyeye kadar uyku çeker.
Peter Cordes

1

Çok fazla arka plan işi başlatırsam ne olur?

sistem yavaş ve tepkisiz hale gelecektir, en kötü durum o kadar tepkisizdir, sadece güç düğmesine basmak ve sert bir yeniden başlatma yapmak en iyisidir ... bu, bunu yapmaktan kurtulma ayrıcalığına sahip olduğu bir kök olarak çalışacaktır. Sizin bash komut normal kullanıcı ayrıcalıkları altında çalışıyorsa, o zaman akla gelen ilk şey /etc/security/limits.confve /etc/systemd/system.confve oradaki [ideal olarak konuşan] tüm değişkenler önlemek kullanıcıyı (ler) aşırı yükleme sistemi.

  • cpu = xeon E5649, bu 12 çekirdekli bir işlemci; böylece her biri% 100 oniki çekirdekten birini kullanarak aynı anda çalışacak 12 işlem için 12 çekirdeğiniz vardır. 24 işlemi başlatırsanız, her biri on iki çekirdeğin her birinde% 50 kullanımda çalışacaktır, 700 işlem =% 1.7 ancak her şey tamam bir sürede düzgün bir şekilde tamamlandığı sürece bu = başarı; verimli olmak her zaman uygun değildir.

    1. 700 örneğin tümü aynı anda çalışabilir mi? Şüphesiz, 700 çok sayıda değildir; maxprocörneğin /etc/security/limits.conf varsayılan değer 4.135.275

    2. Sunucum sınırına ulaşıncaya kadar ne kadar uzağa gidebilirim? 700'den çok daha fazla eminim.

    3. Sınırlar ... komut dosyası bir kullanıcı hesabı altında başlatılırsa (ve genel olarak kök limits.confve herkes için de geçerlidir), komut dosyasının foo &700 kez denedikten sonra çıkmasıdır; daha sonra her biri farklı bir pid ile 700 foo işlemi görmeyi beklersiniz, ancak sadece 456 (rasgele sayı seçimi) görebilirsiniz ve diğer 244 hiç başlamadı çünkü bazı güvenlik veya sistemd sınırı tarafından engellendi.

Milyon $ soru: Aynı anda kaç tane çalıştırmalısınız?

ağa dahil olmak ve her birinin bir telnet bağlantısı yapacağını söylediniz, eğitimli tahmin, cpu ve ram sınırları için yapmadan önce ağ sınırlarına ve ek yüke gireceğinizdir. Ama özel olarak ne yaptığınızı bilmiyorum, muhtemelen ne olacağınız 700'ü bir kerede başlatabilirsiniz, ancak önceki süreçler ve ağ bağlantıları çeşitli sistem sınırlarına veya ilk 500 başlayacak, sonra kalan 200 değişmeyecek çünkü sistem veya çekirdek sınırları bunu önlüyor. Ama birçoğu aynı anda koşsa da, biraz tatlı olacakişlerin olabildiğince hızlı yapılmasını sağlayın ... yükü en aza indirmek ve verimliliği artırmak. 12 çekirdekli olmak (veya 2 cpu'unuz varsa 24) bir kerede 12 (veya 24) ile başlayın ve daha sonra çalışma süresi iyileşmesini görmeyene kadar bu eşzamanlı parti numarasını 12 veya 24 artırın.

ipucu: google max telnet bağlantıları ve bunun sistemleriniz için nasıl geçerli olduğunu görün. Ayrıca güvenlik duvarlarını da unutmayın. Ayrıca, işlem başına gereken belleğin hızlı hesaplamasını x 700; <kullanılabilir RAM'in (davanızda yaklaşık 50 gb) olduğundan emin olun, aksi takdirde sistem SWAP'ı kullanmaya başlar ve temelde yanıt vermez. Bu nedenle, 12, 24, N işlemlerini tek seferde yapın ve RAM'i ücretsiz izleyin, sonra N'yi zaten neler olduğu hakkında bilgi sahibi olarak artırın .

Varsayılan olarak RHEL, tek bir ana bilgisayardan gelen telnet bağlantılarının sayısını 10 eşzamanlı oturumla sınırlar. Bu bir güvenlik özelliğidir ... /etc/xinetd.conf olarak ayarlanır, “per_source” değerini değiştirin.

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.