Używanie tylko jednego rdzenia procesora

9

Muszę uruchomić testy wydajności dla mojego współbieżnego programu, a moim wymaganiem jest, aby był uruchamiany tylko na jednym rdzeniu procesora. (Nie chcę współpracować z wątkami - chcę zawsze przełączać kontekst).

Mam więc dwa pytania:

  1. Najlepsze rozwiązanie - jak podpisać i zarezerwować tylko jeden rdzeń procesora tylko dla mojego programu (aby zmusić system operacyjny do nieużywania tego rdzenia procesora). Chyba nie jest to możliwe, ale może się mylę ...

  2. Jak ustawić Linuksa (Fedora 24) na używanie tylko jednego rdzenia procesora?

peter55555
źródło
Zobacz to .
Kamil Maciorowski
1
Należy pamiętać, że nowoczesne procesory mogą zmieniać prędkość w zależności od liczby używanych rdzeni. Nawet jeśli upewnisz się, że proces używa tylko jednego rdzenia, a żaden inny proces go nie używa, szybkość tego rdzenia będzie się różnić w zależności od tego, jak system operacyjny użyje innych rdzeni. Weź to pod uwagę podczas uruchamiania testów.
liori
Powinieneś być w stanie dezaktywować rdzenie procesora z BIOS-u, być może jest bardziej niezawodny dla twoich testów, ponieważ @liori stwierdził powyżej, że system operacyjny może zmieniać szybkość rdzenia.
Marcs,
Co z utworzeniem maszyny wirtualnej i przypisaniem do niej tylko jednego rdzenia? Och, właśnie przeczytałem „nie używać tego rdzenia procesora”, więc nieważne ...
sakisk

Odpowiedzi:

26

W systemie Linux wywołanie systemowe w celu ustawienia powinowactwa procesora dla procesu to sched_setaffinity. Następnie jest tasksetnarzędzie do wykonania tego w wierszu poleceń.

Aby ten pojedynczy program działał tylko na jednym procesorze, myślę, że potrzebujesz czegoś takiego

taskset -c 1 ./myprogram

(ustaw dowolny numer procesora jako argument -cprzełącznika).

Powinno to być wystarczająco zbliżone do systemu jednoprocesorowego, o ile twoje inne procesy nie działają zbyt szybko w porównaniu z tym, który chcesz zmierzyć, lub są planowane na inne procesory. Jeśli chcesz poświęcić jeden procesor tylko jednemu procesowi i uniemożliwić uruchamianie innych procesów na tym procesorze, musisz również ustawić ich powinowactwo.

Że ja nie wiem, jak prawidłowo zrobić. Należy ustawić powinowactwo procesora na initbardzo wczesnym etapie procesu rozruchu, aby mieć pewność, że zostanie on odziedziczony po wszystkich procesach w systemie. Aby obejść ten problem, możesz użyć taskset -c -p 0 $PIDwszystkich innych procesów, aby zmusić je do działania tylko na procesorze nr 0.

Systemd ma równieżCPUAffinity= kontrolowanie powinowactwa w plikach jednostkowych i istnieje kilka z pytań dotyczących ustawiania domyślnego powinowactwo tutaj na unix.SE, ale nie znaleźliśmy żadnych roztworem dobry.

Chociaż @Kamil Maciorowski skomentował i odpowiedział na inne pytanie na superuser.com , ustawienie isolcpus=1 w wierszu poleceń jądra powinno „odizolować ten procesor od ogólnych algorytmów planowania”, co jest czymś, czego możesz chcieć.

ilkkachu
źródło
To nie do końca odpowiada na pytanie. Chociaż zestaw zadań (lub inne metody ustawiania koligacji zadań) zapewnią, że proces działa tylko na określonym zestawie rdzeni, nie gwarantuje, że tylko ten proces będzie działał na tych rdzeniach. To znaczy, że system operacyjny może zaplanować inne procesy na rdzeniu, na który ustawiono powinowactwo do procesu. W praktyce jest to najbardziej użyteczna odpowiedź, ale należy pamiętać o ograniczeniach, aw szczególności pamiętać, że nie daje ona tego, o co prosisz w 1) „Zarezerwuj tylko jeden rdzeń procesora dla mojego programu (aby zmusić system operacyjny do nie używaj tego rdzenia procesora) ”
James Greenhalgh
@JamesGreenhalgh, ale znalezienie sposobu na ustawienie powinowactwa procesora dla każdego procesu byłoby odpowiedzią na pytanie. Czy można ustawić domyślne powinowactwo procesora dla nowych procesów jako opcję jądra (linia cmd)? To zadziałałoby na początku procesu rozruchu i wpłynęło na wszystkie procesy.
jpaugh
Właściwie pominąłem w nawiasach klauzulę dotyczącą zapobiegania uruchamianiu innych procesów na tym procesorze. A może pomyślałem, że największym problemem będzie upewnienie się, że program, o którym mowa, będzie działał tylko na jednym rdzeniu, zamiast na czterech, i że inne procesy można uznać za rodzaj uciążliwości, która nie miałaby większego znaczenia w porównaniu do tego. Ale przyznam, że nie miałem właściwej odpowiedzi na tę część pytania, poza tym, co skomentował teraz Kamil.
ilkkachu
@ jpaugh, myślę, że nawet wtedy nie byłbyś w stanie całkowicie odizolować się od możliwości wykonania innego procesu na „twoim” rdzeniu. Na przykład taki, który resetuje swoje własne powinowactwo, a nawet sam kod jądra, zużywa czas niezwiązany z zarządzaniem twoim procesem. Ponownie w pełni zgadzam się, że w praktyce ta odpowiedź byłaby najbardziej skuteczna, aby rozwiązać większość problemu, ale byłbym naprawdę zainteresowany przeczytaniem odpowiedzi na tę ostatnią część w nawiasie!
James Greenhalgh