#codziennylinustorvalds 25/32…

#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 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/nr_running 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:

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:

#linux #programista15k #komputery #cytatywielkichludzi #cytaty #heheszki #programowanie #gruparatowaniapoziomu

Powered by WPeMatico