Linux'ta dört çekirdekli işlemcide CPU çekirdeklerini devre dışı bırakma


14

3 CPU çekirdeğini devre dışı bırakmak ve işlemcimi tek bir çekirdek üzerinde çalıştırmak istiyorum. Kendimi kullanılmış komutu vardır: maxcpus=1. Ama bundan sonra bu komutu yerine getirdim ls /sys/devices/system/cpu. Hala gösteriyor cpu0,cpu1,cpu2,cpu3.

Ben de denedim: echo 0 > /sys/devices/system/cpu3/onlineama aşağıdaki hatayı alıyorum: no such file or directory.


maxcpus=1 Komutu nereye koyduğunuz belli değil mi? Bu dizeyi grub.cfgönyükleme seçeneği olarak mı yerleştirdiniz? (Lütfen yorumlarda yanıt vermek yerine sorunuzu güncelleyin).
Anthon

Linux OS.I bir terminal emülatörü "gtkterm" konulu komutu infaz ben freescale IMx6 sabreauto kartını kullanıyorum
user3818847

Echo 0> / sys / Devices / system / cpu3 / online komutuyla cpu3 kapanışını görebiliyorum. Şimdi ne istiyorum biliyorum ben etkisine değişiklikler için sistemi yeniden olmalıdır, ya da ben yeniden başlatmadan devam edebilir
user3818847

AFAIK, çekirdeğe parametre olarak maxcpus = 1 belirtmelisiniz (örn. Grubtayken). Çekirdek parametrelerine eklemek için '/ etc / defaults / grub' düzenleyin, 'update-grub' komutunu çalıştırın ve yeniden başlatın. Bu, şeyleri kalıcı hale getirir, yani Linux başlangıcında sadece bir CPU ile.
Anthon

2
@ user3818847 Hangi dağıtımı kullanıyorsunuz? Önyükleme parametrelerini değiştirmek (geçmek için maxcpus=1) dağıtımına göre değişir. Ayrıca /syssahip olduğunuz yol sadece yanlış yol, doğru yol /sys/devices/system/cpu/cpu3/online.
Patrick

Yanıtlar:


28

As Patrick yorumunda belirtti , sen altında yolunu var /sysyanlış.

echo 0 > /sys/devices/system/cpu/cpu3/online

Şunlar dışındaki tüm CPU'ları kapatmak istiyorsanız cpu0:

for x in /sys/devices/system/cpu/cpu[1-9]*/online; do
  echo 0 >"$x"
done

maxcpus=1Kabuk istemine yazmanın bir etkisi yoktur. Daha doğrusu, değişkeni başka bir etkisi olmayan bu kabuktaki maxcpusdeğere ayarlar 1. maxcpusBir çekirdek parametresi olarak ileterek önyükleme sırasında CPU sayısını ayarlayabilirsiniz . Bunun için önyükleyici yapılandırmanızı değiştirmeniz gerekir (örn. U-Boot içindeki çekirdek komut satırını değiştirmek için).


Önerileriniz için teşekkür ederim. Sizin tarafınızdan önerilen komutla çalıştı
user3818847

Bu en azından bir şekilde çekirdeğe özgüdür. 3.6.6 çekirdeğini çalıştırıyorum ve böyle dosyalar yok; bunun yerine tekli /sys/devices/system/cpu/onlineve ./offlinedosyaları tüm çekirdekleri kontrol etmek için kullanırsınız .
Daniel Griscom

@Gilles - Açmak coreve kapatmak için ne kadar zaman gerektiğini bilmenin bir yolu var mı ?
Chetan Arvind Patil

@ChetanArvindPatil Zamanı geldi. Eğer kod zaten L2 önbelleğinde değilse zaman RAM erişimi tarafından hakim olacağını düşünüyorum ve aksi takdirde çekirdek kapatmak için zaman, ama çok CPU ve OS bağlıdır.
Gilles 'SO- kötü olmayı bırak

1
@Xofo Çekirdek bir çekirdeği kapattığında, bu çekirdek çekirdek kodunu çalıştırır, bu nedenle o anda belirli bir çekirdek üzerinde iş parçacığı programlanmaz. Çekirdek kapandıktan sonra, iş parçacıkları artık bu çekirdek üzerinde zamanlanmıyor. Bir iş parçacığının afinite tüm kapalı çekirdek bir dizi ile kısıtlarsa ne olacağını bilmiyorum.
Gilles 'SO- kötü olmayı bırak'

1

çekirdeği kapatmanız veya devre dışı bırakmanız gerekmez .

kullanırsınız cpusets ve taskset

http://man7.org/linux/man-pages/man7/cpuset.7.html

Bir cpuset, CPU'ların ve bellek düğümlerinin listesini tanımlar ...

Cpuset dosya sistemi, işlemci yerleşimini ve işlemlerin bellek yerleşimini denetlemek için kullanılan çekirdek cpuset mekanizmasına yönelik sahte dosya sistemi arabirimidir. Genellikle / dev / cpuset'e monte edilir.

Çekirdekler için yerleşik destekle derlenmiş çekirdekli sistemlerde, tüm işlemler bir cpuset'e bağlanır ve cpusets her zaman mevcuttur. Bir sistem cpusets'i destekliyorsa, / proc / filesystems dosyasında nodev cpuset girdisine sahip olacaktır. Cpuset dosya sistemini bağlayarak (aşağıdaki ÖRNEK bölümüne bakın), yönetici bir sistemdeki cpuset'leri bu sistemdeki işlemciyi ve bellek yerleşimini kontrol edecek şekilde yapılandırabilir. Varsayılan olarak, bir sistemdeki cpuset yapılandırması değiştirilmezse veya cpuset dosya sistemi bağlanmamışsa, cpuset mekanizmasının, var olsa da, sistemin davranışı üzerinde hiçbir etkisi yoktur.

Bir sistemin CPU'ları, bir paket içinde birden çok işlemci çekirdeği ve bir işlemci çekirdeği içindeki Hyper-Threads dahil olmak üzere, bir işlemin gerçekleştirilebildiği tüm mantıksal işlem birimlerini içerir. Bellek düğümleri ana belleğin tüm farklı kümelerini içerir; küçük ve SMP sistemlerinde tipik olarak sistemin tüm ana belleğini içeren tek bir bellek düğümü bulunurken, NUMA (tekdüze olmayan bellek erişimi) sistemlerinde birden çok bellek düğümü bulunur.

Kısacası, 6 çekirdeğe sahip 1 cpu'nuz varsa, cpusets'i yapılandırabilir ve işleminizi yalnızca bir çekirdek üzerinde yapılandırılmış bir cpuset'te başlatabilirsiniz , örneğin çekirdek # 3. Paralel bir süreç olsaydı, tek bir çekirdek tanımlanmış belirli bir cpuset'te 4 işlem başlattıysanız, 4 işlemin her biri çekirdek # 3'te% 25 cpu kullanımı elde edecekti.

Bundan yola çıkarak, tipik olarak olan bir cpuset ,

  • örneğin 200'den fazla bir çekirdek sistemde, cpusetA, nerede bulunurlarsa bulunsunlar, 0–60 çekirdekleri, cpusetB çekirdekleri 61.,70; cpusetC, 71..80 çekirdekleri; ancak bir yönetici / mimar yapılandırmayı seçer.
  • cpusetA belirli kullanıcılara ve / veya belirli yazılım programlarına tahsis edilmiştir; cpusetB farklı kullanıcılara / programlara tahsis edilir; ve bunun gibi.
  • bir kullanıcı belirli bir cpuset içinde N çekirdeği isteyecek bir iş (süreç) başlatır ve şimdi bu çoklu (paralel) süreç verilen cpuset ile sınırlıdır . Ve belirli bir cpuset ile sınırlı olan N paralelleri için, bu işlemlerin her biri işlemci benzeşimi veya cpu benzeşiminden yararlanır / kullanılmalıdır, böylece bu paralel süreçler cpuset içindeki farklı çekirdekler üzerinde dökülmez.

ayrıca: https://linux.die.net/man/1/taskset

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.