Bir sürece bireysel bir çekirdek atayın


4

Uygulamaya çalıştığım, Raspberry Pi 2'de Debian'la birlikte kendi özünde bir python betiği çalıştırmak. Bir kullanabilirsiniz taskset bir süreci belirli bir çekirdeğe bağlamak için. Ancak bu çekirdeğe işletim sisteminden ve diğer işlemlerden aynı anda kurtulmak zorundayım. Nasıl yapabilirim?


Belki de gerçek zamanlı önceliğe ayarlanmış?
grawity

@ Leonidas Bazı test sonuçları ile cevabımı genişlettim. Buna bir bak.
Kamil Maciorowski

Yanıtlar:


5

Bütün bu konu faydalı olmalı.

'İnit' işlemini cpu 1'de çalıştırmakla sınırlandırmanın bir yolunu arardım.

Genel durumda, son sözler "tüm CPU'larda çalışıyor ancak 1" olmalı. Sanırım birileri kullanabilir çekirdek parametreleri ; irqaffinity, isolcpus umut verici görünüyorsun.


DÜZENLE:

hakkında isolcpus içinde çekirdek parametreleri dokümantasyonu :

Bu seçenek CPU'ları izole etmenin tercih edilen yoludur. Alternatif olarak - sistemdeki tüm görevlerin CPU maskesinin manuel olarak ayarlanması - sorunlara ve en düşük yük dengeleyici performansına neden olabilir.

Bazı testler yaptım. Sonuçlar:

  • Çekirdek parametresi isolcpus sınırlandırmak için kullanabileceğiniz init CPU'ları işler ve izole eder.

  • Bana bu çekirdek parametresi gibiydi irqaffinity izole edilmiş CPU'ları etkilemedi. Muhtemelen bu parametreye ihtiyacınız yoktur.

  • İzole ettiğimde CPU0 tamamen boşta gitmedi. Bu sistem veya donanım, izolasyona rağmen onunla bir miktar hesaplama yapmak zorunda mı? - Bilmiyorum.

  • İzole ettiğimde CPU1 veya CPU7 öyleydi kadar sağlam bir kaya gibi boşta.

İzole etmek CPU1 eklemek isolcpus=1 senin içinde grub.cfg, bunun gibi:
linux /vmlinuz- (… Burada tüm geçerli parametreleriniz…) isolcpus=1


ORİJİNAL CEVAP DEVAM EDİYOR:

Alternatif olarak, sistem başladıktan sonra, çalışmakta olan tüm işlemlerin yakınlığını yeniden atayabilirsiniz, ancak bu daha az zarif görünüyor.

Daha az zarif görünüyor, ancak yeterince iyi çalışabileceğini kabul ediyorum (EDIT: yukarıda belirtildiği gibi sorunlara ve en düşük yük dengeleyici performansına neden olabilir). Debian'ımda çalışan hızlı ve kirli bir gömlek var:

sudo bash -c 'cd /proc ; for i in [1-9]* ; do taskset -a -p fffffffe $i ; done'

Bazı hatalar aldım pid s, yine de htop Bir çekirdeğin bundan sonra neredeyse boşta olduğunu gösterir. Elbette komut dosyanızı daha sonra çalıştırmanız, bir şekilde dışlamanız veya yeniden atama yapmanız gerekir:

taskset -a -p 1 PID

İşlemci benzeşimi kalıtımsal olduğu için yeni işlemleri kapsayacak tek bir lineri tekrar etmeniz gerekmeyeceğini umuyorum.


3

Paket Cpuset ile:

# cset shield -c 42 -k on

Görevinize 42 numaralı CPU ayırmak için (bir grup CPU ayırtabilirsiniz), sonra

# cset shield -e your_script

başlamak your_script ayrılmış işlemcilerinizde. (Ayrıca bakınız seçenekleri --user ve --group.)

İşiniz bittiğinde, CPU'ları serbest bırakın ("kalkanı sıfırlayın"):

# cset shield -r

Bu araca çok daha fazlası var. Örneğin, önceden çalışan bir işlemi ayrılmış CPU'ya eklemek:

# cset shield -s -p <PID> --threads

Komut satırı yardımı:

# cset help

Çevrimiçi yardım / eğitim


Umut verici görünüyor. Cevabınızı genişletip rezervasyonu serbest bırakmak ve varsayılan durumuna geri dönmek için bir komut gönderebilir misiniz?
Kamil Maciorowski

@KamilMaciorowski: isteğiniz üzerine eklediğim komutlar hakkında geri bildiriminiz var mı?
L. Levrel
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.