Korzystanie i rozumienie systemowych opcji związanych z planowaniem w kontekście pulpitu


14

W plikach usług systemowych można ustawić następujące opcje związane z planowaniem (na systemd.execstronie podręcznika popraw mnie, jeśli się mylę):

Nice Ustawia domyślny poziom nice (priorytet planowania) dla wykonywanych procesów. Przyjmuje liczbę całkowitą od -20 (najwyższy priorytet) do 19 (najniższy priorytet). Szczegóły w setpriority (2) .

Co to jest znajomy niezły poziom. Wygląda na to, że jego działanie jest nieco „podważone” ze względu na funkcję „automatycznego grupowania” ostatnich jąder Linuksa. Więc poniższe opcje mogą być tym, co naprawdę chciałbym ustawić, aby procesy zachowywały się ładnie na moim komputerze.

CPUSchedulingPolicy Ustawia zasady planowania CPU dla wykonywanych procesów. Pobiera jedną z pozostałych, partię, bezczynność, fifo lub rr. Aby uzyskać szczegółowe informacje, zobacz Sched_setscheduler (2) .

CPUSchedulingPriority Ustawia priorytet planowania CPU dla wykonywanych procesów. Dostępny zakres priorytetów zależy od wybranych zasad planowania CPU (patrz wyżej). W przypadku zasad planowania w czasie rzeczywistym można użyć liczby całkowitej od 1 (najniższy priorytet) do 99 (najwyższy priorytet). Aby uzyskać szczegółowe informacje, zobacz Sched_setscheduler (2) .

CPUSchedulingResetOnFork Pobiera argument boolowski. Jeśli jest to prawda, podwyższone priorytety i zasady planowania procesora zostaną zresetowane po rozwidleniu się wykonanych procesów, a zatem nie mogą przeciekać do procesów potomnych. Aby uzyskać szczegółowe informacje, zobacz Sched_setscheduler (2) . Domyślnie false.

Rozumiem ostatnią opcję. Na podstawie dwóch pierwszych wyjaśnień dowiaduję się, że mogę wybrać zasadę planowania, a następnie, biorąc pod uwagę tę zasadę, priorytet. Nie jest dla mnie do końca jasne, co powinienem wybrać do jakiego rodzaju zadań. Na przykład, czy bezpieczne jest wybranie „bezczynności” dla zadań tworzenia kopii zapasowych (stosunkowo intensywnie wykorzystujących procesor, ponieważ deduplikacja), czy też lepiej nadaje się inny?

Ogólnie rzecz biorąc, szukam zrozumiałego przeglądu każdej polityki, każdego z jej priorytetów i przydatności do określonych celów. Interesująca jest także interakcja z niezłym poziomem.

Oprócz planowania procesora istnieje szeregowanie we / wy. Myślę, że to odpowiada ionice(popraw mnie, jeśli się mylę).

IOSchedulingClass Ustawia klasę planowania we / wy dla wykonywanych procesów. Przyjmuje liczbę całkowitą od 0 do 3 lub jeden z ciągów brak, w czasie rzeczywistym, najlepszym wysiłkiem lub bezczynności. Aby uzyskać szczegółowe informacje, patrz ioprio_set (2) .

IOSchedulingPriority Ustawia priorytet planowania we / wy dla wykonywanych procesów. Przyjmuje liczbę całkowitą od 0 (najwyższy priorytet) do 7 (najniższy priorytet). Dostępne priorytety zależą od wybranej klasy planowania we / wy (patrz wyżej). Aby uzyskać szczegółowe informacje, patrz ioprio_set (2) .

Widzimy tutaj taką samą strukturę jak w przypadku planowania CPU. Szukam również tego samego rodzaju informacji.

Dla wszystkich opcji „Planowania” strony, do których się odwołuje, nie są dla mnie wystarczająco jasne, głównie w tłumaczeniu rzeczy na nieco technicznie skłonny użytkownik pulpitu.


2
Jaki konkretny problem z wydajnością próbujesz rozwiązać? Czy coś działa zbyt wolno lub ma zbyt duże opóźnienie? Używam Ubuntu 16.04 z systemd jako pulpit, z kopiami zapasowymi działającymi w tle i nie mam problemów z wydajnością związanych z względnym priorytetem.
Mark Stosberg,

@MarkStosberg Pytanie pojawiło się po uruchomieniu zadań tworzenia kopii zapasowych w tle, podczas gdy zadania obliczeniowe pierwszego planu w systemie dwurdzeniowym spowodowały, że interfejs nie odpowiadał. Następnie dodałem opcję Nice do skryptu kopii zapasowej i jednocześnie zobaczyłem inne opcje. Mogą dotyczyć problemu spowodowanego przez kopię zapasową lub innych problemów, które napotkam w przyszłości. Chciałbym więc dowiedzieć się więcej o tych innych opcjach, nie odnosząc się do konkretnego problemu.
equaeghe

Każdy kawałek dokumentacji odnosi się do strony podręcznika, na której możesz znaleźć więcej dokumentacji, jeśli jesteś zainteresowany. Czy czytanie odnośnych stron podręcznika dla ioprio_set (2) i schedule_setscheduler (2) pomaga odpowiedzieć na twoje pytania?
Mark Stosberg

@MarkStosberg Nie, jak wskazano w moim pytaniu. Strony podręcznika nie są złe, ale niekoniecznie pomagają mi zdecydować, co robić (czy dostosowywanie dobrych wartości jest nadal bezpieczną / właściwą rzeczą do zrobienia w dzisiejszych czasach?). mam nadzieję na odpowiedzi od doświadczonych użytkowników tych opcji, które mogą dać konkretne przykłady i poznać wpływ autogrupy w takich konkretnych przypadkach.
equaeghe

Natknąłem się na te dyrektywy w prawie tym samym kontekście (kopie zapasowe w tle powodują opóźnienie). Odkryłem, że man plan (7) ma o wiele bardziej wyczerpujący opis pozostałych dwóch stron podręcznika. (Wspomina także, kiedy obowiązuje nicewartość).
Wisperwind

Odpowiedzi:


5

CPUScheduling {Policy | Priority}

Link informuje, że CPUSchedulingPrioritynależy ustawić tylko dla zadań fifolub rr(„w czasie rzeczywistym”). Nie chcesz wymuszać planowania usług w czasie rzeczywistym.

CPUSchedulingPolicy=other jest wartością domyślną.

To opuszcza batchi idle. Różnica między nimi jest istotna tylko wtedy, gdy masz wiele zadań o priorytecie bezczynności, które jednocześnie zużywają procesor. Teoretycznie batchdaje większą przepustowość (w zamian za dłuższe opóźnienia). Ale to nie jest duża wygrana, więc nie jest tak naprawdę w tym przypadku istotna.

idledosłownie głoduje, jeśli cokolwiek innego chce procesora. Priorytet procesora jest raczej mniej znaczący niż kiedyś w przypadku starych systemów UNIX z jednym rdzeniem. Byłbym szczęśliwszy zaczynając od nicenp. Niezłego poziomu 10 lub 14, zanim zacznę uciekać się idle. Zobacz następny rozdział.

Jednak większość komputerów stacjonarnych jest stosunkowo bezczynna przez większość czasu. A kiedy masz świnia procesora, która wyprzedziłaby zadanie w tle, to świnia często używa tylko jednego z twoich procesorów. Mając to na uwadze, nie czułbym się zbyt ryzykowny idlew kontekście przeciętnego komputera stacjonarnego lub laptopa. Chyba że ma procesor Atom / Celeron / ARM o mocy co najmniej 15 watów ; wtedy chciałbym przyjrzeć się nieco bardziej uważnie.

Czy fajny poziom jest „podważony” przez funkcję „automatycznego grupowania” jądra?

Tak.

Automatyczne grupowanie jest trochę dziwne. Autor systemdnie lubił heurystyki, nawet dla komputerów stacjonarnych. Jeśli chcesz przetestować wyłączanie automatycznego grupowania, możesz ustawić sysctl kernel.sched_autogroup_enabled na 0. Myślę, że najlepiej jest przetestować, ustawiając sysctl w stałej konfiguracji i restartując, aby upewnić się, że pozbyłeś się wszystkich grup automatycznych.

Powinieneś być w stanie osiągnąć niezły poziom dla swoich usług bez żadnego problemu. Przynajmniej w aktualnych wersjach systemd - patrz następna sekcja.

Np. Niezły poziom 10 obniży wagę każdego wątku w harmonogramie procesora Linux do około 10%. Niezły poziom 14 jest poniżej 5%. (Link: pełna formuła )

Dodatek: czy ładny poziom jest „podważony” przez systemd cgroups?

Bieżące DefaultCPUAccounting= ustawienie jest domyślnie wyłączone, chyba że można je włączyć bez włączania kontroli procesora dla poszczególnych usług. Więc powinno być dobrze. Możesz to sprawdzić w swojej aktualnej dokumentacji:man systemd-system.conf

Należy pamiętać, że kontrola procesora dla poszczególnych usług zostanie również włączona, gdy dowolna usługa ustawi rachunkowość CPU / CPUWeight / StartupCPUWeight / CPUShares / StartupCPUShares.

Poniższy wyciąg z bloga jest nieaktualny (ale nadal online). Domyślne zachowanie uległo zmianie, a dokumentacja referencyjna została odpowiednio zaktualizowana.

Domyślnie, jeśli kontroler procesora jest włączony w jądrze, systemd utworzy grupę cgroup dla każdej usługi podczas jej uruchamiania. Bez dalszej konfiguracji ma to już jeden fajny efekt: w systemie systemowym każda usługa systemowa otrzyma równą ilość procesora, bez względu na to, ile składa się procesów. Innymi słowy: na twoim serwerze WWW MySQL dostanie mniej więcej tyle samo procesora co Apache, nawet jeśli ten ostatni składa się z 1000 procesów skryptowych CGI, ale to pierwsze z kilku zadań roboczych. (To zachowanie można wyłączyć, patrz DefaultControllers = w /etc/systemd/system.conf.)

Oprócz tej wartości domyślnej można jawnie skonfigurować udziały procesora otrzymywane przez usługę przy ustawieniu CPUShares =. Wartość domyślna to 1024, jeśli zwiększysz tę liczbę, przypisasz więcej procesora do usługi niż niezmieniona w 1024, jeśli ją zmniejszysz, mniej.

http://0pointer.de/blog/projects/resources.html


-3

Klasyczna rada strojenia to „Don't Optimize, Benchmark”.

Zamiast przejmować się ogólnymi poradami, zacznij od konkretnego przypadku, który martwisz się o ulepszenie i został przetestowany pod kątem konkretnego problemu z wydajnością. Pozwól, aby dane pozwoliły Ci dostroić właściwą dyrektywę. W przypadku danych może być jasne, czy proces ma zły priorytet, zapiera procesor lub ma inny problem.

Nowoczesne komputery stacjonarne są często bardzo szybkie do pracy bez żadnego strojenia.


3
Przepraszam, ale to nie jest odpowiedź na pytanie. Chodzi o to, że wypróbowanie rzeczy jest trudne, jeśli tak naprawdę nie rozumie się efektów. Pytanie to pojawiło się (ale nie dotyczy!) Problemów z wydajnością na nowoczesnym komputerze stacjonarnym.
equaeghe

1
Wypróbowanie dowolnej opcji zajmuje tylko kilka minut. Jeśli masz wyjściowy test porównawczy i cel wydajnościowy, możesz łatwo sprawdzić, czy wypróbowana opcja przesuwa cię w żądanym kierunku.
Mark Stosberg,

@equaeghe, wybijanie losowych pokręteł bez wiedzy o tym, co robią, również nie rozwiąże problemu.
vonbrand,

Duża rada, ale nie odpowiedź. To raczej powinien być komentarz. Czasami przeczucie, że „to jest zbyt wolne” jest wystarczającym punktem odniesienia do podjęcia natychmiastowych działań. Na przykład korzystając systemd-analyzez blamei plotudało mi się zmniejszyć czas rozruchu na starszego RPI przez ponad minutę. Jasne, że jeśli chodzi o analizę problemu, należy zmierzyć zamiast przedwcześnie rozpocząć „optymalizację”.
0xC0000022L,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.