Yalnızca bir işlemci çekirdeği kullanma


9

Eşzamanlı programım için performans testleri çalıştırmam gerekiyor ve gereksinimim sadece bir CPU çekirdeğinde çalıştırılması gerektiğidir . (Kooperatif iş parçacıkları istemiyorum - her zaman bağlam değişikliği olmasını istiyorum).

İki sorum var:

  1. En iyi çözüm - Yalnızca programım için yalnızca bir CPU çekirdeği nasıl imzalanır ve rezerve edilir (işletim sistemini bu CPU çekirdeğini kullanmaya zorlamak için). Sanırım bu mümkün değil ama belki yanılıyorum ...

  2. Linux'u (Fedora 24) yalnızca bir CPU çekirdeği kullanacak şekilde nasıl ayarlayabilirim?



1
Modern CPU'ların toplamda kaç tane çekirdek kullanıldığına bağlı olarak hızlarını değiştirebileceğini unutmayın. İşleminizin yalnızca tek bir çekirdek kullandığından ve başka hiçbir işlem kullanmadığından emin olsanız bile, bu çekirdeğin hızı, işletim sisteminin diğer çekirdekleri nasıl kullanacağına bağlı olarak değişecektir. Testlerinizi yaparken bunu göz önünde bulundurun.
liori

CPU çekirdeklerini BIOS'tan devre dışı bırakabilmelisiniz, belki de @liori'nin yukarıda belirtildiği gibi, işletim sisteminin çekirdek hızını değiştirebileceğini testleriniz için daha güvenilirdir.
Marcs

VM oluşturma ve bu sunucuya yalnızca bir çekirdek atamaya ne dersiniz? Oh, sadece "Bu CPU çekirdeğini kullanmamak için" okudum, bu yüzden boşver ...
sakisk

Yanıtlar:


26

Linux'ta, bir işlem için CPU benzeşimini ayarlamak için sistem çağrısı yapılır sched_setaffinity. Sonra komut satırında bunu yapmak için bir tasksetaraç var .

Bu tek bir programın tek bir CPU'da çalışmasını sağlamak için,

taskset -c 1 ./myprogram

(herhangi bir CPU numarasını -canahtara bağımsız değişken olarak ayarlayın .)

Diğer işlemleriniz ölçmek istediğiniz işlemle karşılaştırıldığında çok fazla çalışmadığı veya diğer CPU'lara programlandığı sürece, bu tek işlemcili bir sisteme yeterince yakın olmalıdır. Bir CPU'yu yalnızca bu tek işleme ayırmak ve diğer işlemlerin bu CPU'da çalışmasını önlemek istiyorsanız, bunların benzeşimlerini de ayarlamanız gerekir.

Yani, ben yok düzgün nasıl yapılacağını biliyorum. initSistemdeki tüm işlemlere devralındığından emin olmak için önyükleme işleminde işlemci benzeşimini çok erken ayarlamanız gerekir . Geçici bir çözüm olarak, taskset -c -p 0 $PIDdiğer işlemlerin tümünü yalnızca CPU # 0'da çalışmaya zorlamak için kullanabilirsiniz.

systemd da vardırCPUAffinity= birim dosyalarında yakınlık kontrol etmek ve orada birkaç ait sorular unix.SE burada varsayılan yakınlık ayarlama konusunda, ama iyi bir çözüm ile herhangi bulamadık.

@Kamil Maciorowski'nin superuser.com'daki başka bir soruya yorum yapması ve cevap vermesine rağmen isolcpus=1 , çekirdek komut satırında ayar yapmak "bu CPU'yu genel programlama algoritmalarından ayırmalıdır", ki bu da isteyebileceğiniz bir şeydir.


Bu soruya tam olarak cevap vermiyor. Görev kümesi (veya görev benzeşimini ayarlamak için diğer yöntemler) bir işlemin yalnızca belirtilen çekirdek kümesinde çalışmasını sağlarken, yalnızca bu işlemin bu çekirdeklerde çalışacağını garanti etmez . Yani, işletim sistemi, işlem yakınlığınızı ayarladığınız çekirdeğe diğer işlemleri zamanlayabilir. Uygulamada, bu en yararlı cevaptır, ancak sınırlamaların farkında olun ve özellikle de 1'de istediğinizi vermediğinin farkında olun) "yalnızca programım için yalnızca bir işlemci çekirdeği ayırın (işletim sistemini cpu çekirdeğini kullanmayın) "
James Greenhalgh

@JamesGreenhalgh, ancak, her işlem için CPU benzeşimini ayarlamanın bir yolunu bulmak soruyu cevaplayacaktır. Çekirdek (cmd satırı) seçeneği olarak yeni işlemler için varsayılan işlemci yakınlığı ayarlamak mümkün müdür? Bu, önyükleme işleminin başlarında etkili olur ve tüm işlemleri etkiler.
jpaugh

Aslında parantez içindeki diğer işlemlerin bu CPU'da çalışmasını engelleme konusundaki cümleyi kaçırdım. Ya da belki de en büyük sorunun, söz konusu programın dördü yerine sadece bir çekirdek üzerinde çalışacağından ve diğer süreçlerin bir tür sıkıntı olarak kabul edilebileceğinden emin olmak olacağını düşündüm. buna kıyasla. Ama itiraf edeceğim, Kamil'in şimdi yorumladığı şeyin dışında, sorunun o kısmına uygun bir cevabım yoktu.
ilkkachu

@jpaugh, sanırım o zaman bile kendinizi "çekirdeğiniz" üzerinde başka bir işlem yapma olasılığından tamamen soyutlayamazsınız. Örneğin, kendi yakınlığını sıfırlayan, hatta çekirdek kodunun kendisi, işleminizin yönetimi ile ilgili olmayan zaman harcar. Yine, pratikte, bu cevabın sorunun büyük kısmını çözmek için en çok yapacağı şey olduğunu tamamen kabul ediyorum, ancak parantezin son kısmına bir cevap okumakla gerçekten ilgileneceğim!
James Greenhalgh
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.