Wpis z mikrobloga

#codziennylinustorvalds 25/32 - special edition 2

So I think this is firmly one of those "real improvement" patches. Good job. Group scheduling goes from "useful for some specific server loads" to "that's a killer feature".


LKML, 10.11.2010 na temat tego patcha

Pamiętacie co robiliście w listopadzie roku pańskiego dwa tysiące dziesiątego?
Nie? W sumie nic dziwnego przecież to było aż 19 lat temu ( ͡° ͜ʖ ͡°), w czasach kernela 2.6.37, gdy procesory miały najczęśćiej dwa rdzenie a dyski SSD były rzadko spotykane. Natomiast ja pamiętam całkiem dobrze - tak jak setki użytkowników Linuksa śledziłem dyskusje dotyczące patcha nad którym zawchwyca się Linus w powyższym cytacie.

Dobrze, to co w jednym zdaniu robi ten patch?
Dodaje on do planisty zadań(schedulera) funkcjonalność automatycznego tworzenia grup szeregowania procesów.
Pewnie nie wyjaśniło wam to zbyt wiele, więc spróbuję opisać jak działa świat i jaki problem rozwiązuje ten patch.

Przypomnijmy sobie co jest zadaniem tego całego schedulera - oczywiście jest nim rozdzielanie czasu procesora pomiędzy działające w systemie procesy. W jaki sposób działa to w Linuksie?
CFS czyli nowy domyślny scheduler [wprowadzony w 2007 roku]( https://lwn.net/Articles/230501/) stara się odwzorować działanie czysto teoretycznego 'idealnie wielozadaniowego procesora' na rzeczywistym sprzęcie.

Ingo Molnar(autor CFS, pracownik Red Hata) wyjaśnia to w ten sposób:

80% of CFS's design can be summed up in a single sentence: CFS basically models an "ideal, precise multi-tasking CPU" on real hardware.

Ideal multi-tasking CPU" is a (non-existent :-)) CPU that has 100% physical power and which can run each task at precise equal speed, in parallel, each at 1/nrrunning speed. For example: if there are 2 tasks running, then it runs each at 50% physical power --- i.e., actually in parallel.


Najmniejszą jednostką którą szereguje CFS jest wątek, więc mając w systemie N procesów mających łącznie K wątków o takim samym priorytecie scheduler będzie dążył do tego by każdy wątek dostawał średnio 1/K części mocy obliczeniowej procesora.

Mała uwaga, mimo że to wszystko brzmi dość prosto i wydaje się oczywiste to wcale takie nie jest.
Linux jest bodajże jedynym systemem operacyjnym z prawdziwego zdarzenia szeregującym zadania w ten sposób.
Windows oraz OS X oraz inne systemy szeregują zadania przy pomocy wariacji algorytmu wielopoziomowej kolejki ze sprzężeniem zwrotnym. Szeregowanie zadań przy pomocy tego typu algorytmów będzie dawało prawdopodobnie lepsze efekty w przypadku typowego użytkowania systemu na desktopie. Jak wiecie, desktop to nie jest główne zastosowanie Linuksa.

Skoro wiemy jak z grubsza działa CFS to możemy przejść do opisu problemu, który rozwiązuje ten patch.
Ogólnie rzecz biorąc to abstrakcja w postaci wątku nie do końca odpowiada potocznemu pojęciu 'zadania'.
Wyobraźmy sobie, że chcemy chcemy jednocześnie napisać maila oraz skompilować kernel.
Mamy dwa zadania, pierwsze stworzy zapewne jeden proces z maksymalnie kikoma wątkami, natomiast drugie może stworzyć dziesiątki procesów.

Równe rozdzielanie czasu procesora per wątek będzie miało przykrą konsekwencję, że nasze zadanie w postaci pisania maila będzie dostawało sumarycznie małą ilość czasu procesora ponieważ ma sumarycznie małą ilość wątków w stosunku do drugiego zadania. Mówiąc wprost nasz klient poczty będzie w c!@j zlagowany. Żeby nie być gołosłownym to poniżej filmik przedstawiający ten efekt:
https://www.youtube.com/watch?v=uk70SeGA7pg

W naszym przypadku chielibyśmy by nasze dwa zadania w ujęciu całościowy dostawały taką samą ilość czasu procesora.
Oczywiście można uskuteczniać dzikie tańce w postaci ustawiania odpowiednich priorytetów, tylko jest to upierdliwe, ma ograniczoną funkcjonalność i zapewne nie będzie to do końca dobrze działać.

W oczywisty sposób brakuje abstrakcji umożliwiającej łączenie różnych procesów w logiczne grupy i rozdzielania mocy procesora per grupa.

Problem ten został zauważony również w data center poważnych graczy takich jak IBM czy Google.
Funkcjonalność schedulera została roszerzona przez pracownika IBM o możliwość szeregowania juz nie pojedynczych wątków i procesów ale właśnie ich grup. Koncepcja ta została rozwinięta przez pracowników Google poprzez dodanie bardziej ogólnego mechanizmu grupowania procesów i podziału również innych zasobów pomiedzy grupami. Funkcjonalność ta jest obecnie znana jako cgroups i jest jednym z filarów niezwykle dzisaj popularnej technologi jaką sa kontenery(Docker, itp).

Wracając do naszego patcha, sprawia on że ta cała technologia z data center jest łatwo dostępna dla zwyklego zjadacza chleba na desktopie.
Dzięki niemu kernel automatycznie stara się pogrupować powiązane ze sobą procesy bez żadnej dodatkowej konfiguracji przez użytkownika.

W jaki sposób się odbywa to automatycznie grupowanie?
Jak domyślacie się kernel nie ma kryształowej kuli, która z całą pewnością powie mu, które procesy są ze sobą powiązane.
Potrzeba tutaj pewnej heurystyki, pierwsza wersja patcha grupowała razem procesy przypięte do danego terminala.

Z tym podejściem jest jeden problem, co jeśli dany proces nie ma żadnego terminala?
Taka sytuacja ma miejsce w przypadku demonów działający w tle i nie będą one poprawnie automatycznie grupowane.
Tak się składa, że wokół terminali istnieje jeszcze ogólniejsze pojęcie sesji, które również pokrywa przypadek demonów.
Patrząc na to bardziej niskopoziomowo, w ostatecznej wersji patcha nowa automatyczna grupa szeregowania jest tworzona w momencie utowrzenia nowej sesji przu pomocy syscalla setsid. Każdy proces potomny w tej samej sesji jest przypisywany do tej samej automatycznej grupy szeregowania.

Nie jest to idealna może idealna heurystyka ale działa całkiem sensownie i co najważniejsze automatycznie.

Dlaczego Linusa akurat tak ucieszył ten patch?
Ponieważ pisanie maili i kompilowanie kernela jest jego głównym zastosowaniem komputera, a ten elegancki i mały(~200 linijkowy) kawałek kodu mocno usprawnił komfort jego codziennej pracy.

Filmik przedstawiający działanie patcha, porównajcie z poprzednim jak zmieniła się responsywność systemu:
https://www.youtube.com/watch?v=prxInRdaNfc

#linux #programista15k #komputery #cytatywielkichludzi #cytaty #heheszki #programowanie #gruparatowaniapoziomu
y.....m - #codziennylinustorvalds 25/32 - special edition 2

So I think this is firm...

źródło: comment_biaJiNbkkDbXxJHlpsttIbSD8MuZZ8wi.jpg

Pobierz
  • 12
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Jeśli kogoś ominął poprzedni dłuższy wpis to zapraszam tutaj. Jeśli ktoś chce być wołany do takich dłuższych wpisów to zapraszam do zostawienia plusa w tym komentarzu.
  • Odpowiedz
@czasem: dzięki, w sumie ten post miał wyglądać trochę inaczej. Chciałem przenalizowac kod tego patcha krok po kroku bo jest całkiem fajny, ale jak zacząłem pisać wstęp to wyszło mi to co wyszło xD
  • Odpowiedz
@shabangbinbash:

No to tak, ogólnie o systemach operacyjnych masz książkę 'Podstwy systemów operacyjnych' Silberschatza.
Problem z nią jest taki ze w języku polskim jest ona dostępna w wydaniu piątym, więc jest niektualna trochę.
Jak masz możliwość pożyczenia to możesz to zrobić, a jeśli znasz angielski to możesz sobie kupić najnowsze wydanie z tamtego roku. Ja czytałem lata temu wydanie polskie, więc o tym najnowszym angielskim zbyt dużo nie mogę powiedzieć, ale
  • Odpowiedz