wyłączanie rdzeni procesora w czterordzeniowym procesorze w systemie Linux

14

Chcę wyłączyć 3 rdzenie procesora i uruchomić procesor na jednym rdzeniu. Mam polecenie używane: maxcpus=1. Ale potem wykonałem to polecenie ls /sys/devices/system/cpu. Nadal pokazuje cpu0,cpu1,cpu2,cpu3.

Próbowałem również: echo 0 > /sys/devices/system/cpu3/onlineale pojawia się następujący błąd: no such file or directory.

użytkownik3818847
źródło
Nie jest jasne, gdzie umieścisz maxcpus=1 polecenie ? Czy umieściłeś ten ciąg grub.cfgjako opcję rozruchu? (Zaktualizuj swoje pytanie zamiast odpowiadać w komentarzach).
Anthon
Używam freescale IMx6 sabreauto na Linuksie. Wykonałem polecenie na emulatorze terminali „gtkterm”
user3818847
Dzięki temu poleceniu echo 0> / sys / devices / system / cpu3 / online mogę zobaczyć zamknięcie procesora cpu3. Teraz chcę wiedzieć, czy powinienem zrestartować system, aby zmiany
odniosły
AFAIK, powinieneś podać maxcpus = 1 jako parametr jądra (tj. Kiedy jesteś w grub). Edytuj „/ etc / defaults / grub”, aby dodać go do parametrów jądra, uruchom „update-grub” i uruchom ponownie. To sprawi, że wszystko będzie trwałe, tj. Z jednym procesorem podczas uruchamiania Linuksa.
Anthon
2
@ user3818847 z jakiej dystrybucji korzystasz? Modyfikowanie parametrów rozruchowych (do przejścia maxcpus=1) różni się w zależności od dystrybucji. Również /sysścieżka, którą masz, jest po prostu niewłaściwa, właściwa jest ścieżka /sys/devices/system/cpu/cpu3/online.
Patrick

Odpowiedzi:

28

Jak wskazał Patrick w komentarzu , /sysźle zrozumiałeś ścieżkę .

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

Jeśli chcesz wyłączyć wszystkie procesory, z wyjątkiem cpu0:

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

Pisanie maxcpus=1w wierszu poleceń powłoki nie ma żadnego efektu. Dokładniej, ustawia zmienną maxcpusna wartość 1w tej powłoce, co nie ma żadnego innego efektu. Możesz ustawić liczbę procesorów w czasie uruchamiania, przekazując maxcpusjako parametr jądra . W tym celu musisz zmienić konfigurację programu ładującego (np. Zmienić wiersz poleceń jądra w U-Boot).

Gilles „SO- przestań być zły”
źródło
Dziękuję za sugestie. Działa z poleceniem
poleconym
Jest to przynajmniej trochę specyficzne dla jądra. Używam jądra 3.6.6 i nie ma takich plików; zamiast tego używasz pojedynczego /sys/devices/system/cpu/onlinei ./offlineplików do sterowania wszystkimi rdzeniami.
Daniel Griscom
@Gilles - Czy istnieje sposób, aby dowiedzieć się, ile czasu zajmuje włączenie corei wyłączenie?
Chetan Arvind Patil
@ChetanArvindPatil Czas to. Myślę, że czas byłby zdominowany przez dostęp do pamięci RAM, jeśli kod nie znajduje się już w pamięci podręcznej L2 i do czasu wyłączenia rdzenia inaczej, ale w dużej mierze zależy to od procesora i systemu operacyjnego.
Gilles „SO- przestań być zły”
1
@Xofo Gdy jądro wyłącza rdzeń, ten rdzeń uruchamia kod jądra, więc w tym momencie nie jest zaplanowany wątek na tym konkretnym rdzeniu. Po wyłączeniu rdzenia wątki nie są już planowane dla tego rdzenia. Nie wiem, co się stanie, jeśli powinowactwo nici ograniczy go do zestawu rdzeni, które są wyłączone.
Gilles „SO- przestań być zły”,
1

niekoniecznie wyłączasz lub dezaktywujesz rdzenie.

należałoby użyć CPUSET i taskset

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

Zestaw definiuje listę procesorów i węzłów pamięci ...

System plików cpuset to pseudo-systemowy interfejs mechanizmu cpuset jądra, który służy do kontrolowania położenia procesora i pamięci procesów. Jest zwykle montowany w / dev / cpuset.

W systemach z jądrem skompilowanymi z wbudowaną obsługą cpusets, wszystkie procesy są dołączone do cpuset, a cpusets są zawsze obecne. Jeśli system obsługuje cpusets, to będzie miał wpis nodev cpuset w pliku / proc / filesystems. Instalując system plików cpuset (patrz sekcja PRZYKŁAD poniżej), administrator może skonfigurować cpusets w systemie, aby kontrolować procesor i rozmieszczenie pamięci w procesach w tym systemie. Domyślnie, jeśli konfiguracja zestawu procesorów w systemie nie jest zmodyfikowana lub system plików procesora nie jest nawet zamontowany, to mechanizm procesora, chociaż jest obecny, nie ma wpływu na zachowanie systemu.

Procesory systemu obejmują wszystkie logiczne jednostki przetwarzania, na których proces może być wykonywany, w tym, jeśli są obecne, wiele rdzeni procesora w pakiecie i Hyper-Threads w rdzeniu procesora. Węzły pamięci obejmują wszystkie odrębne banki pamięci głównej; małe i SMP zazwyczaj mają tylko jeden węzeł pamięci, który zawiera całą pamięć główną systemu, podczas gdy systemy NUMA (nierównomierny dostęp do pamięci) mają wiele węzłów pamięci.

Krótko mówiąc, jeśli masz 1 procesor posiadający 6 rdzeni, skonfiguruj cpusety i uruchom proces w procesorze skonfigurowanym tylko na jednym rdzeniu, na przykład na rdzeniu nr 3. Gdyby to był proces równoległy, wszystko byłoby ograniczone do tego jednego rdzenia, tak że jeśli uruchomisz 4 procesy w danym procesorze, mając zdefiniowany tylko jeden rdzeń, to każdy z 4 procesów uzyska 25% wykorzystania procesora na rdzeniu # 3.

Opierając się na tym, zwykle dzieje się tak, że procesor jest tak skonfigurowany, że

  • na przykład w ponad 200 systemach rdzenia cpusetA to rdzenie 0..60, gdziekolwiek mogą się one znajdować, cpusetB to rdzenie 61..70; cpusetC to rdzenie 71..80; i tak dalej, jednak administrator / architekt decyduje się skonfigurować.
  • cpusetA jest przypisany do niektórych użytkowników i / lub określonych programów; cpusetB jest przydzielany różnym użytkownikom / programom; i tak dalej.
  • użytkownik uruchamia zadanie (proces), które zażąda N rdzeni ... w ramach danego zestawu procesorów, a teraz te liczne (równoległe) procesy są ograniczone do danego zestawu procesorów. A dla tych N równoległych ograniczonych do danego procesora, każdy z tych procesów powinien / powinien wykorzystywać powinowactwo procesora lub powinowactwo procesora, aby te równoległe procesy nie rzucały się wokół różnych rdzeni w procesorze.

także: https://linux.die.net/man/1/taskset

Ron
źródło