Görev kümesi isolcpus'ta bir dizi çekirdek üzerinde çalışmıyor


13

Önsöz için Debian Wheezy'i AMD64 yonga setinde çekirdek 3.2 ile kullanıyorum. Makinemin iki Xeon E5-2690 çekirdeği var. Önyükleme parametrelerini bir CPU'daki tüm çekirdekler tek bir işleme ayrılacak şekilde ayarladım. Bunu yapmak için grub içinde isolcpus = 8,9,10,11,12,13,14,15 ayarladım.

Çok uzak çok iyi. Şimdi diyelim ki belirli bir komut için izole edilmiş CPU'ları kullanmak istiyorum, basit olmak için basit bir sonsuz döngü kullanacağım:

$ tasket -c 8-15 bash -c 'doğru; yankı merhaba> / dev / null; bitti '&

Şimdiye kadar iyi olan top, çekirdek 8'in% 100'e yakın kullanıma döndüğünü gösteriyor. Şimdi bu komutu tekrar başlattığımı varsayalım:

$ tasket -c 8-15 bash -c 'doğru; yankı merhaba> / dev / null; bitti '&

Şimdi üst 9-15 nolu çekirdeklerin boş kaldığını ve iki işlemin çekirdek 8'i paylaştığını gösteriyor.

$ tasket -c 8 bash -c 'doğru; yankı merhaba> / dev / null; bitti '&

$ tasket -c 9 bash -c 'doğru; yankı merhaba> / dev / null; bitti '&

Çekirdek 8 ve 9'un her biri gerektiği gibi% 100 kullanım elde eder. Bu yalnızca isolcpus için geçerlidir, çünkü çekirdek 1-7 ile aynı görev kümesi işlemleri ilgili çekirdekler üzerine düzgün bir şekilde yayar. Ayrıca "tasket -p", 8-15 işlem için benzeşim maskesinin doğru ayarlandığını gösterir. Çekirdek zamanlayıcı, bir isolcpus yakınlık maskesinde belirtilen en düşük çekirdek dışında bir şey kullanmayı reddetti.

Şimdi normalde bu benim yukarıdaki örnekleri ile büyük bir anlaşma olmaz, sadece her işlem için bireysel çekirdek belirtin. Ancak, özel CPU'da çok iş parçacıklı bir uygulama çalıştırmak istiyorum. Çekirdek kümesi belirtmek istiyorum ve işlenen her iş parçacığı için işlemci benzeşim ayrı ayrı sıfırlamak zorunda kalmadan, otomatik olarak iş parçacığı havuzu kullanmak istiyorum.

Herhangi bir zamanlayıcı bana isolcpu setinden birden fazla çekirdek vermek için nasıl bir fikrim var mı?


Çok iş parçacıklı bir program kullanmayı deneyebilir misiniz? bash multithread değil
c4f4t0r

1
Evet, aslında fark etmeme neden oldu (çok iş parçacıklı programım birden fazla çekirdek kullanmıyordu). Çok sayıda iş parçacığı oluşturan basit bir python betiği, isolcpus kümesinde çalıştırıldığında birden fazla çekirdeği kullanamaz. (Yalıtımsız çekirdekler üzerinde çalıştırıldığında mevcut tüm 8 çekirdeği kullanır).
user79126

bu linuxtopia.org/online_books/linux_kernel/kernel_configuration/… 'ı okuyun, bu bir cpus'u çekirdek zamanlayıcısından hariç tutar, ancak cpus'u hariç tuttuktan sonra hariç tutulan cpus üzerinde işlem yapmak mı istiyorsunuz?
c4f4t0r

1
İşlemci benzeşimi maskesi, kullanılması gerektiğini belirtmediği sürece, çekirdek isolcpu üzerinde bir iş parçacığı veya işlem zamanlamayacaktır. Aksi takdirde, amaç bir çekirdeği kullanıcı tarafından belirlenen bir nedenle ayırmak ve istenmeyen bir işlemin kullanmadığından emin olmak olduğunda, isolcpus çekirdeği kapatmakla aynı olacaktır. Görev Kümesi, afinite maskesini 8-15 aralığındaki tüm çekirdekleri kullanacak şekilde ayarlar (/ proc içinde kontrol edildiğinde doğru şekilde ayarlanır), böylece çekirdek işlemi boş çekirdekler üzerinde programlamalıdır.
user79126

Yanıtlar:


10

Bir gün hayal kırıklığından sonra bir çözüm belirledim. Bu davranış, varsayılan çekirdek zamanlayıcı algoritması (bu dağıtım / çekirdek için SCHED_OTHER) bir yapaylık gibi görünüyor. Süreci farklı bir algoritmaya değiştirmek sorunu ortadan kaldırır, isolcpus süreçler / iş parçacıkları arasında yeterince kullanılır.

Sonunda SCHED_RR kullandım, ancak her ikisi de işe yaramış gibi görünen SCHED_FIFO ve SCHED_IDLE'yi test ettim. İşlem, chrt yardımcı programı kullanılarak alternatif algoritma ile başlatılabilir:

$ sudo chrt -r 1 [komut]

(Kök olmayan olarak çalıştırmak istiyorsanız, komutla ilgili ikili dosyada CAP_SYS_NICE özelliğini etkinleştirmek için setcap yardımcı programını kullanabilirsiniz)


1
Her ne kadar çekirdeği 0,1'e yakınlık ayarlayan java uygulamam sadece ilk çekirdeği kullandı. 'sudo chrt -r 1 [command]' sorunumu da çözdü.
Barry NL
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.