Kernel Traffic
Latest | Archives | People | Topics
Wine
Latest | Archives | People | Topics
GNUe
Latest | Archives | People | Topics
Czech
Home | News | RSS Feeds | Mailing Lists | Authors Info | Mirrors | Stalled Traffic
 

Kernel Traffic #150 For 14 Jan 2002

By Zack Brown

Translated By:  Damian WojsławMaja Królikowska  and  Paweł Kot

Table Of Contents

Introduction

Dziś mija trzecia rocznica założenia Kernel Traffic. Pierwszy numer ukazał się 14 stycznia 1999. Muszę przyznać, że nie wiem, co mnie do tego skłoniło. Rozpocząłem to jako sposób na odwdzięczenie się społeczności ludzi, którzy wreszcie pozwolili mi używać mojego komputera. Od tej pory, pomogło mi to w 3000 milowej przeprowadzce z Nowego Jorku do San Francisco, zmianach zatrudnienia, uzyskaniu wielu przyjaciół oraz, po prostu, otworzyło mi oczy. Dzięki za wszystko.

Mailing List Stats For This Week

We looked at 2507 posts in 10941K.

There were 592 different contributors. 312 posted more than once. 173 posted last week too.

The top posters of the week were:

1. Problemy z reiserfs na Sparc64 z jądrem 2.4.17

27 Dec 2001 - 3 Jan 2002 (13 posts) Archive Link: "reiserfs nie współpracuje z linuksem 2.4.17 na procesorach sparc64"

Topics: Księgowanie, Systemy plików, Debugowanie

People: David S. MillerAlan Cox

Luigi Genoni zgłosił, że używanie jądra 2.4.17 z reiserfs na Sparc64 powoduje oopsy przy każdym podnoszeniu systemu, kiedy system próbował montować dyski. Na maszynach x86 wszystko działało poprawnie. Nikita Danilov poprosił, aby wystartował system w trybie single-user i zamontował partycje ręcznie, a zdekodowany oops wysłał na listę. Luigi tak zrobił, a David S. Miller skomentował: "Wygląda na to, że jakaś zmiana w reiserfs w 2.4.17 spowodowała, że operacje {set,clear,change}_bit() wykonują się na wskaźnikach, które nie są wyrównane do rozmiaru ,,long''." Alexander Zarochentcev wysłał łatę, a Alan Cox zauważył: "Ta poprawka jest zdecydowanie dobra -- bez niej coś się tak czy siak skaszani na każdej 64bitowej platformie BE." Luigi także potwierdził, że poprawka Alexandra działa i obiecał wykonać więcej testów odnośnie stabilności. Koniec wątku (tm).

2. Stan framebuffera w 2.4 i 2.5

27 Dec 2001 - 7 Jan 2002 (38 posts) Archive Link: "Framebuffer, mmap(), zwisy w stanie D, nieudane odmonowania głównego systemu plików"

Topics: Framebuffer, Debugowanie

People: Mark J RobertsAndrew MortonTimothy CovellLinus TorvaldsJames Simmons

Mark J Roberts wysłał bardzo któtki program testowy i zgłosił: "Gdy uruchamiam go na swoim jądrze 2.4.17rc2aa2 z włączonym framebufferem Voodoo3000, proces zwisa w stanie D. ps i top również zwisają w ten sam sposób, gdy czytają pliki /proc/pid zawieszonego procesu. A główny system plików nie chce się odmonować. Tak się dzieje, gdy ustawiona jest flaga PROT_READ|PROT_WRITE, gdy użyję jedynie PROT_WRITE, następuje błąd strony, tak jak można by się tego spodziewać... ale od momentu gdy wersja PROT_READ|PROT_WRITE zawiśnie, wieszają się również wersje PROT_WRITE." Andrew Morton zdiagnozował: "sterownikowi framebuffera nie udaje się zaznaczyć zmmapowanego vma jako VM_IO, więc jądro próbuje zrzucić urządzenie framebuffera do pliku core i wpada w nieskończoną pętlę." Powiedział, że najprostszym rozwiązaniem byłoby zaznaczenie framebuffera, jako urządzenia, którego nie da się ,,zrzucić'', w przypadku architektury x86, ale dodał: "Nie widzę jednak powodu, aby w jakiejkolwiek architekturze sensowne było umieszczanie obrazu framebuffera w plikach core. To byłoby dość ryzykowne." W tym momencie lamentować zaczął Timothy Covell: "Gdy X11 się zablokuje, mogę je zabić, a moja maszyna to przeżywa. Gdy wysypie się framebuffer, niezbędny jest restart systemu. W 1995 roku myślałem, że linuksowe wirtualne terminale i X11 zostawiły Solaris daleko z tyłu, a teraz chcemy wyrzucić do kosza cały ten postęp? Cały czas jestem zadziwiony tą całą sprawą z ,,ooooh mogę zobaczyć pingwina przy startowaniu systemu''. To prawda, framebuffery są użyteczne przy systemach osadzonych, ale czy naprawdę muszą być aż tak głęboko zintegrowane z jądrem??" Linus Torvalds odparł:

Nie są.

Żadna rozsądna osoba nie powinna używać framebuffera, jeśli ma wybór.

Tak, jak mówiła Ci mama: ,,Powiedz nie''. Używaj trybu tekstowego i X11, i będziesz szczęśliwy.

Oczywiście, niektórzy ludzie nie mają wyboru.

James Simmons odpowiedział: "Wybpróbuj to na dowolnej platformie poza ix86. Dodaj do tego, że M$ nie wspiera DOS-a. Dojrzyj, że producenci kart graficznych przestają wspierać VGA. Nawet setup BIOS w tej chwili wykorzystuje graficzną VESĘ. Cóż, dni tekstowego VGA są policzone. Zgadzam się, że warstwa framebuffera/konsoli wymaga jeszcze pracy, aby dojść do sensownych wyników." Dodał: "Planuję to zrobić w 2.5.X."

3. Obsługa dużych partycji FAT

3 Jan 2002 - 5 Jan 2002 (8 posts) Archive Link: "łatka na jądro z obsługą dużych partycji fat"

Topics: Obsługa legacy, Systemy plików, Obsługa Dużych Plików, Microsoft

People: Vijay KumarVijay KumarH. Peter Anvin

Vijay Kumar wysłał łatkę i powiedział:

To w związku ze zmianą, której musiałem dokonać w jądrze 2.2.17-14, aby wspierało naprawdę duże dyski. W naszym projekcie mamy do czynienia ze sporymi dyskami, czasami większymi niż 128 GB. System plików to FAT32 i na każdym dysku tworzona jest tylko jedna partycja. Podczas testów zdaliśmy sobie sprawę, że implementacja fat-u w Linuksie nie obsługuje partycji większych niż 128 GB (w zasadzie 64 GB, z powodu błędu w implementacji fat).

To ograniczenie wynika ze struktury danych, używanej przez implementację fat-u w Linuksie do odczytu/zapisu zawartości katalogów. Przy dostępie do zawartości katalogów na dysku używany jest typ danych 'long', w którym zaledwie 28 bitów identyfikuje sektor z danymi, pozostałe 4 bity wskazują przesunięcie danych wewnątrz sektora. Używanie 28 bitów oznacza, że nie mamy dostępu do danych powyżej 128 GB (2^28*512), i tak ogranicza tworzenie partycji większych niż 128 GB na dużych dyskach.

Zmieniłem implementacje fat, vfat i msdos w jądrze tak, aby obsługiwały większe typy danych, w ten sposób pozwalając na tworzenie większych partycji. Co do GPL, chciałbym udostępnić łatkę wszystkim, także na wypadek, gdyby ktoś natknął się na podobny kłopot (kto przejmuje się fat-em w świecie linuksowym). Łatka została solidnie przetestowana tylko na naszych systemach (p3, 700MHz z FC). Naprawdę doceniłbym, gdybyście wy & gdyby ktokolwiek z lkml miał coś do powiedzenia o tych zmianach.

Łatka dotyczy tylko jądra 2.2.17-14 i może wymagać zmian, aby działała z innymi wersjami. O ile mi wiadomo, nie poprawiono tego w żadnej wersji jądra.

Ktoś zauważył, że FAT przechowuje 28-bitowe numery klastrów i zmiana tej wielkości zepsułaby kompatybilność z FAT-em. Autor listy zasugerował w zamian zwiększenie wielkości klastra. Vijay odpisał: "Używając 28-bitowych numerów klastrów i klastrów o wielkości 65536, mógłbym dojść aż do 16TB, a to aż nadto. Na razie nie mam więc kłopotów z formatem partycji na dysku. Niemniej jednak, zważając na szybko spadające ceny dysków twardych, może minąć niewiele czasu, zanim dojdę do limitu." H. Peter Anvin skomentował:

To problem Microsoftu -- to podstawowe ograniczenie formatu, który zdefiniowali. Samo to, że go w ogóle zdefiniowali, jest problemem (jedynym sposobem na zmuszenie systemu FAT do *dobrej* pracy jest załadowanie całego FAT-u do pamięci przed czasem, a FAT32 to psuje), zamiast stworzenia bardziej sensownego zastępstwa.

(FWIW, powód, którego użyli dla usprawiedliwienia FAT32 brzmiał ,,zmuszenie DOS-u do używania NTFS-u wymagałoby zbyt wiele wysiłku'', jakby to były jedyne możliwe wybory...)

4. Nowy Skalowalny Algorytm Szeregowania Procesów

3 Jan 2002 - 7 Jan 2002 (67 posts) Archive Link: "[announce] [patch] ultra-skalowalny szeduler O(1) dla SMP i UP"

Topics: Scheduler, Wydajność

People: Ingo MolnarRobert LoveDavide LibenziLinus Torvalds

Ingo Molnar ogłosił:

teraz, gdy już wszystkie noworoczne zabawy się skończyły, wracamy do nudnych rzeczy. Dla tych, którzy chcą zobaczyć, a może nawet spróbować czegoś bardziej skomplikowanego, udostępniam tę łatkę, która prawie całkowicie przepisuje algorytm szeregowania procesów Linuksa dla 2.5.2-pre6:

http://redhat.com/~mingo/O(1)-scheduler/sched-O1-2.5.2-A0.patch

dla 2.4.17:

http://redhat.com/~mingo/O(1)-scheduler/sched-O1-2.4.17-A0.patch

Cel

Głównym celem nowego algorytmu jest zachowanie wszystkich tych dobrych rzeczy, które znamy i kochamy w aktualnym schedulerze Linuksa:

celem jest także dodanie kilku nowych rzeczy:

Projekt

(jeśli kogoś znudzi poniższy opis, może od razu przejść do sekcji 'Testy'.)

rdzeń nowego algorytmu szeregującego stanowią następujące mechanizmy:

rozwiązanie z dwoma tablicami pozwala nam na posiadanie dowolnej liczby aktywnych i wygasłych zadań, a ponowne przeliczenie kwantów czasu może być wykonane, gdy tylko przydzielony kwant czasu się skończy. Ponieważ tablice są zawsze dostępne za pośrednictwem wskaźników w kolejce zadań do wykonania, zamienianie tablic może być wykonane bardzo szybko.

to jest hybrydowe podejście list piorytetowych połączone z szeregowaniem round-robin i metodą zamieniania tablic z rozproszonych kwantów czasu.

jedną z trudniejszych rzeczy jest zagwarantowanie dobrej interaktywności przy dużym obiążeniu. Podczas zabaw z różnymi wersjami schedulera okazało się, że najlepsze odczucie interaktywności występuje, nie gdy ,,dożywiamy'' interaktywne zadania, ale gdy ,,karzemy'' zadania, które chcą zużyć więcej czasu procesora niż jest dostępne. Ta metoda jest również łatwiejsza do zaimplementowania w stylu O(1).

aby ustalić rzeczywiste ,,obciążenie'', jake zadanie generuje, użyta jest wyglądająca na skomplikowaną, ale dość dokładna metoda: jest 4-pozycyjny pierścień ,,historii'', zawierający informacje o aktywności zadań w ciągu ostatnich 4 sekund. Na tym pierścieniu można operować bez zbyt wielkiego narzutu. Kolejne pozycje dają schedulerowi dość dokładną historę obciążenia generowanego przez zadanie: czy zużyło więcej czy mniej czasu procesora w ciągu ostatnich N sekund. [rozmiar ,,4'' i przedziały 4x 1 sekunda zostały wyznaczone ekperymentalnie - ta część jest elastyczna i może zostać zmieniona w obu kierunkach.]

zadanie jest karane za wygenerowanie większego obciążenia, niż procesor jest w stanie obsłużyć. Karą tą jest obniżenie priorytetu -- istnieje maksymalna wysokość kary w stosunku do statycznego priorytetu, więc nawet zadania, które się ,,przyklejają'' do procesora będą wzajemnie obserwować swoje priorytety i odpowiednio dzielić CPU.

Oddzieliłem szeregowanie RT do innej podstawy kodu, zachowując jednocześnie część podstawowego kodu jako wspólną. To nie wygląda zbyt ładnie, zwłaszcza w takich miejscach, jak __sched_tail() czy activate_task(), ale nie sądzę, aby można było temu zapobiec. Szeregowanie RT jest inne, wykorzystuje globalną kolejkę zadań (i globalną blokadę) i potrzebuje globalnych decyzji. Aby przyspieszyć szeregowanie RT i upewnić się, że zadania RT z odpowiednim priorytetem są odpowiednio uszeregowane, dodałem wiadomość rozgłoszeniową z przeszeregowaniem, nawet na systemach SMP. Szeregowanie RT ma również złożoność O(1).

load-balancer SMP może być rozszerzony/zmieniony przy pomocy dodatkowych równoległych obliczeń i koncepcji hierarchicznej pamięci podręcznej: szeregowanie NUMA, wielordzeniowe CPU mogą być w prosty sposób obsłużone przez zmianę load-balancera. W tej chwili jest on dopasowany do moich systemów SMP.

pominąłem zaletę prev->mm == next->mm - żadne obciążenie jakie znam nie wykazuje jakiejkolwiek reakcji na to. Można to z powrotem włączyć poprzez poświęcenie schedule() działającego w czasie O(1) [listy priorytetów, obecna i przesunięta o jeden w dół, mogą być przeszukane na okoliczność warunku that->mm == current->mm], ale to kosztuje nas sporą liczbę cykli przy pewnej liczbie ważnych obciążeń, dlatego chciałem omijać to jak tylko się da.

(z pewnością są też inne szczegóły, których zapomniałem wyjaśnić. Skomentowałem część ważniejszych kawałków kodu i struktur danych. Jeśli sądzisz, że któryś aspekt projektu jest błędny, lub brakuje w nim czegoś istotnego, proszę, powiadom mnie o tym.)

(obecny kod w żadnym razie nie jest doskonały, w tej chwili moim głównym celem, poza poprawieniem błędów, jest zrobienie kodu bardziej przejrzystym. Wszelkie sugestie uproszczeń są mile widziane.)

Testy

wykonałem dwa rodzaje testów: najpierw sprawdzałem wrażenie interaktywnści przy nowym schedulerze na systemach UP i SMP. Chociaż jest to dość subiektywne odczucie, to uważam, że nowy scheduler sprawuje się nie gorzej niż stary, a przy niektórych wysokich obciążeniach, jest nawet lepiej. Sprawdzałem wiele obciążeń m. in. wykonując kompilację make -j w tle, uruchamiając 1000 procesów, i stwierdziłem, że oba schedulery nie mają problemów z zapomnianymi procesami, czy dużymi opóźnieniami w przypadku SMP.

inna grupa testów miała za zadanie zbadać rzeczywistą wydajność schedulera. Spośród nich wybrałem następujące (niektóre miały jedynie obciążyć scheduler, inne miały dać szerszy obraz jego zachowań):

[mogę też przetestować inne obciążenia, które wydadzą się komuś interesujące.]

przeprowadziłem te testy na komputerze jednoprocesorowym z jądrem UP oraz na komputerach dwu- i ośmioprocesorowych z jądrem SMP.

Symulator serwera chat tworzy pewną liczbe procesów połączonych ze sobą przez gniazda TCP, procesy losowo wysyłają do siebie wiadomości, w ten sposób, że symulują właściwie strukturę i obciążenie sewerów chat.

3 kolejne przebiegi './chat_c 127.0.0.1 10 1000' zaowocowały w następującej przepustowości wiadomości:

vanilla-2.5.2-pre6:

Średnia przepustowość : 110619 wiadomości na sekundę
Średnia przepustowość : 107813 wiadomości na sekundę
Średnia przepustowość : 120558 wiadomości na sekundę

O(1)-schedule-2.5.2-pre6:

Średnia przepustowość : 131250 wiadomości na sekundę
Średnia przepustowość : 116333 wiadomości na sekundę
Średnia przepustowość : 179686 wiadomości na sekundę

to jest prawie 20% poprawa.

Aby wykorzystać wszystkie zalety nowego schedulera, uruchomiłem to ze zmienionym priorytetem, co, w gruncie rzeczy, uruchomiło zadania serwera chat uszeregowane przy wykorzystaniu wsadowego szeregowania round-robin:

3 kolejne przebiegi 'nice -n 19 ./chat_c 127.0.0.1 10 1000' zaowocowały następującą przepustowością:

vanilla-2.5.2-pre6:

Średnia przepustowość : 77719 wiadomości na sekundę
Średnia przepustowość : 83460 wiadomości na sekundę
Średnia przepustowość : 90029 wiadomości na sekundę

O(1)-schedule-2.5.2-pre6:

Średnia przepustowość : 609942 wiadomości na sekundę
Średnia przepustowość : 610221 wiadomości na sekundę
Średnia przepustowość : 609570 wiadomości na sekundę

przepustowość wzrosła ponad 600%. Wyniki testów na UP i dwuprocesorowym SMP pokazują mniej więcej taką samą przewagę nowego algorytmu szeregującego. Co więcej, przy testach z serwerem chat, stary scheduler nie obsługiwał zbyt dobrze zadań interaktywnych i system był bardzo spowolniony. (co jest skutkiem ubocznym sytuacji przeszeregowania, w którą wpada scheduler.)

na jednoprocesorowym UP wyniki też są interesujące:

vanilla-2.5.2-pre6:

./chat_c 127.0.0.1 10 100
Średnia przepustowość : 102885 wiadomości na sekundę
Średnia przepustowość : 95319 wiadomości na sekundę
Średnia przepustowość : 99076 wiadomości na sekundę

nice -n 19 ./chat_c 127.0.0.1 10 1000
Średnia przepustowość : 161205 wiadomości na sekundę
Średnia przepustowość : 151785 wiadomości na sekundę
Średnia przepustowość : 152951 wiadomości na sekundę

O(1)-schedule-2.5.2-pre6:

./chat_c 127.0.0.1 10 100 # NEW
Średnia przepustowość : 128865 wiadomości na sekundę
Średnia przepustowość : 115240 wiadomości na sekundę
Średnia przepustowość : 99034 wiadomości na sekundę

nice -n 19 ./chat_c 127.0.0.1 10 1000 # NEW
Średnia przepustowość : 163112 wiadomości na sekundę
Średnia przepustowość : 163012 wiadomości na sekundę
Średnia przepustowość : 163652 wiadomości na sekundę

to pokazuje, że chociaż na UP nie widać poprawy skalowalności, szeregowanie O(1) i tak jest lepsze.

kolejny test mierzy wydajność sched_yield(). (od której, w dużej mierze, zależy kod pthreads.)

na dwuprocesorowym systemie, po wystartowaniu 4 kopii ./loop_yield, otrzymałem następującą wydajność względem przełączeń kontekstu:

vanilla-2.5.2-pre6

  # vmstat 5 | cut -c57-
     system         cpu
   in    cs  us  sy  id
  102 241247   6  94   0
  101 240977   5  95   0
  101 241051   6  94   0
  101 241176   7  93   0

O(1)-schedule-2.5.2-pre6

  # vmstat 5 | cut -c57-
     system         cpu
   in     cs  us  sy  id
  101 977530  31  69   0
  101 977478  28  72   0
  101 977538  27  73   0

scheduler O(1) jest o 300% szybszy i wykonujemy prawie 1 milion przełączeń kontekstu na sekundę!

ten test wygląda jeszcze lepiej na ośmioprocesorowym systemie, na którym działa 16 kopii loop_yield:

vanilla-2.5.2-pre6:

   vmstat 5 | cut -c57-
      system         cpu
    in     cs  us  sy  id
   106 108498   2  98   0
   101 108333   1  99   0
   102 108437   1  99   0

100K przełączeń kontekstu na sekundę -- narzut w globalnej kolejce spowalnia scheduler w porównaniu do maszyny dwuprocesorowej!

O(1)-schedule-2.5.2-pre6:

    vmstat 5 | cut -c57-
     system         cpu
    in      cs  us  sy  id
   102 6120358  34  66   0
   101 6117063  33  67   0
   101 6117124  34  66   0

to jest ponad 6 milionów przełączeń kontekstu na sekundę! (sądzę, że to jest najlepszy wynik w historii, żadna inna maszynka działająca pod Linuksem nigdy wcześniej nie osiągnęła takiej liczby przełączeń kontekstu na sekundę). To jest nalepszy przykład, w którym kolejki zadań per CPU i zalety skalowalności pokazują pazurki.

a oto porówniania lat_proc i lat_ctx (wyniki tu wklejone to najlepsze wyniki z serii testów):

vanilla-2.5.2-pre6:

./lat_proc fork
Przetwarzanie fork+exit: 440.0000 mikrosekund
./lat_proc exec
Przetwarzanie fork+execve: 491.6364 mikrosekund
./lat_proc shell
Przetwarzanie fork+/bin/sh -c: 3545.0000 mikrosekund

O(1)-schedule-2.5.2-pre6:

./lat_proc fork
Przetwarzanie fork+exit: 168.6667 mikrosekund
./lat_proc exec
Przetwarzanie fork+execve: 279.6500 mikrosekund
./lat_proc shell
Przetwarzanie fork+/bin/sh -c: 2874.0000 mikrosekund

różnica jest olbrzymia -- głównie dzięki uniknięciu większości narzutu COW, który wynika z wykonania fork()+execve(). Poprawa fork()+exit() wynika głównie z lepszego powinowactwa CPU -- rodzic i potomek działają na tym samym procesorze, podczas gdy stary scheduler wysyłał potomka na inny, nieużywany procesor, co powodowało duży, blokujący ruch pomiędzy strukturami MM.

testy kompilacji dały bardzo podobne wyniki przy obu schedulerach. Algorytm szeregujący O(1) dał małą, 2% przewagę przy testach wykorzystujących make -j (to się mieści w granicach błędu statystycznego -- ciężko jest przeprowadzić solidne testy kompilacji) -- przypuszczalnie ponownie z powodu lepszego powinowactwa CPU.

Stan

przetestowałem nowy scheduler w dużym zakresie systemów i obciążeń, ale jest to jeszcze kod eksperymentalny. Rozwijałem go używając jąder 2.5.2-pre na systemach SMP, więc w tym zakresie jest najlepiej przetestowany, ale wykonałem też dość dużo testów na UP i 2.4.17. UWAGA! Przy jądrze 2.5.2-pre6 musicie najpierw zaaplikować ostatnią łatę Andriesa, 2.5.2pre6-kdev_t dostępną pod adresem:

http://www.kernel.org/pub/linux/kernel/people/aeb/

przetestowałem także szeregowanie RT w różnych sytuacjach, takich jak sched_yield()-owanie zadań RT, strace-owanie zadań RT i różnych innych, i to działa tak, jak oczekiwałem. Może być jednak parę chropowatości.

Wiele osób wypróbowało tę łatę. Część miała problemy ze zmuszeniem jej do działania, innym zadziałała od razu. Duże wrażenie robiły dane zaprezentowane przez Ingo: 6 000 000 przełączeń kontekstu na sekundę. W pewnym miejscu dyskusji David Nitzel spytał, czy łata może być połączona z łatą wywłaszczającą jądro. Ingo odpowiedział: "tak, szybkie wywłaszczanie zadań z trybu jądra i kod szeregowania są prawie ortogonalne. Sądzę więc, że najlepsze wyniki osiągniesz stosując je naraz." Kilka wiadomości niżej George Anzinger powiedział: "Te dwie łaty nie są ze sobą zgodne. Gdy przyjdzie na to czas, trzeba będzie wymyślić, jak to naprawić. Obie łaty modyfikują kluczowe części pliku sched.c." Robert Love odparł: "Ingo i ja już nad tym pracujemy. Jajks."

Gdzie indziej, Davide Libenzi odpowiedział na pierszą wiadomość Ingo, wskazując, że Ingo miał obiekcje co do analogicznej łaty, którą Davide zaprezentował 4 lata wcześniej. Tamta łata robiła to, co Ingo chce teraz osiągnąć: złożoność obliczeniową rzędu O(1). Davide powiedział: "Powiedziałeś, na wypadek gdybyś nie pamiętał, że średnie obciążenie jednego procesora, nawet przy bardzo obciążonych serwerach, zazwyczaj nie przekracza 5. Więc po cholerę tworzyć 13456 kolejek, aby osiągnąć złożoność O(1) przy kodzie przeglądającym, skoro 70% kosztu przełączenia kontekstu siedzi w przełączaniu pamięci? Tak, 70% kosztu przełączenia kontekstu to przełączenie pamięci i to jest mierzalne licznikiem cykli. Jeśli nie wierzysz, popatrz tu: http://www.xmailserver.org/linux-patches/ltcpu.png." Ingo odparł: "ano, tak mogło być 4 lata temu :) Ale nie wstydzę się zmienić zdania, nawet jeśli wypowiedziałem je kilka miesięcy temu. Dziś mamy takie rzeczy jak ,,slashdot effect'', które mogą rozwalić każdy zdrowy i dobrze zaprojektowny system. Ludzie zaczęli pracować nad rzeczami, takimi jak projektowanie serwerów, które uruchamiają ograniczoną liczbę procesów, ale tak naprawdę, czemu mamy ograniczać wybór twórców aplikacji, zwłaszcza, gdy są oni zainteresowani przede wszystkim odpornością na błędy, a nie małym marginesem wydajności. Istnieje wiele serwerów aplikacyjnych, które wołają o pomstę do nieba, gdy uruchomi się je pod Linuksem przy rzeczywistym obciążeniu." Davide odrzekł: "Nie Ingo, fakt, że to Ty tym razem zaimplementowałeś tę łatę, nie zmienia obciążeń, ponieważ masz kolejki zadań i ich blokady dla każdego procesora. To co sprawia, że duże serwery wołają o pomstę do nieba, to wspólna kolejka plus, spowodowany przez wspólną blokadę, ruch w pamięci podręcznej. Popatrz na system 8-procesorowy: http://www.xmailserver.org/linux-patches/lats8-latsch.png Nawet przy _bardzo_realistycznym_ obciążeniu na takim serwerze, wpływ schedulera nie przekracza 5-15% i przez zwykły podział kolejki/blokady dostajesz poprawę od 30 do 60 razy (zobacz na obrazku), co zmniejsza wpływ schedulera do 0.2-0.3%. Czemu chcesz przeoptymalizować to wszystko dla 0.2%?"

W pewnym momencie Linus Torvalds powiedział: "Nie sądzę aby O(1) było aż tak istotne, ale z pewnością nie szkodzi. O ILE NIE powoduje dokonania złych wyborów. Które są złe, możemy w tej chwili jedynie zgadywać." Taka wypowiedź usatysfakcjonowała Davide i kilka osób zagłębiło się w dyskusję na temat implementacji.

5. Wiele równoległych wersji jądra

4 Jan 2002 - 7 Jan 2002 (10 posts) Archive Link: "Linux Kernel-2.4.18-nj1"

Topics: Filozofia rozwijania, Projekt się dzieli

People: Willy TarreauTom Rini

Nathan Russell podesłał swój własny zbiór łat na 2.4.18, a Willy Tarreau miał wątpliwości:

Nie bierz tego za złe, nie chcę na Ciebie ani na nikogo bluzgać, ale sądzę, że jeśli każdy publicznie ogłosi swoje drzewo Linuksa, z własnym zbiorem łat na główne jądro, to w ten sposób zniechęci wielu użytkowników.

Mamy ,,tylko'' trzy główne drzewa w stabilnych wersjach :

Teraz, gdy Alan pracuje nad czymś innym, łatwo mi zrozumieć, że ludzie potrzebują gałęzi takiej jak ta utrzymywana przez niego, nawet w sytuacji, w której większość jego pracy została włączona do głównego drzewa.

Ale teraz jest drzewo -mjc, drzewo -nj, pewnie inne, których nie zauważyłem i wiele innych nie ogłaszanych tu (-wt, pamietam -ma Mathiasa Andree na przykład, który był chyba pierwszym, który włączył ext3 i reiserfs w to samo jądro). Wszystkie one zawierają prawie te same zbiory poprawek, które jeszcze nie znalazły się w oficjalnym jądrze, oraz zbiór mniej lub bardziej stabilnych, mniej lub bardziej interesujących cech (w zależności od celu produkowanych zbiorów łat). Każdy powinien, conajmniej, ogłosić cel, w którym tworzy swoje jądro i komu ono ma służyć: deweloperom, użytkownikom na maszyny produkcyjne, użytkownikom desktopów, testerom, wszystkim? Po treści Twojego ogłoszenia nie widać, jakie ryzyko podejmuje się używając Twojego jądra. Na przykład: sądzę, że co najmniej Andre Pavenis ciągle ma problemy ze sterownikiem i810_audio Douga, więc ten sterownik nie może być ogłaszany po prostu jako ,,poprawka'' bez żadnego komentarza.

Oczywiście wiem, że opieka na zbiorem łat na główne jądro zabiera mnóstwo czasu, a jeszcze więcej czasu zabiera czytanie raportów o błędach i określanie, co jest stabilne, a co nie jest. Nie trzeba nawet mówić o tuzinach kompilacji przed ogłoszeniem (bo je kompilujecie, nieprawdaż?), i od czasu do czasu przenoszenie pewnych poprawek na inne architektury.

Zatem naprawdę myślę, że byłoby bardziej produktywne, gdyby ludzie pracowali nad mniejszą liczbą drzew, przestali ciągle edytować ręcznie łaty aby rozwiązać niektóre konflikty i probować by były bardziej zrozumiałe dla nowicjuszy, którzy są trochę zgubieni, gdy nie wiedzą, które jądro wypróbowywać.

Być może powinieneś był wysłać swoje łaty Mickaelowi Cohenowi, by pomóc mu szybciej wypuścić -mjc2, tak jak to wszyscy robiliśmy z Alanem? Albo może powinieneś ułożyć sobie w głowie jasny plan, jak powinno wyglądać Twoje jądro, ale w tym wypadku opisz to trochę dokładniej, niż jedną wiadomością i przygotuj się na raporty o błędach przychodzące od ludzi, którzy uwierzą w Twoją wersję jądra. Ta ostatnia rzecz jest chyba najważniejszą przyczyną, dla której zdecydowałem się oferować moje jądra tylko moim przyjaciołom i mnie samemu...

Mam nadzieję, że nie przyjąłeś tego jako ataku, tak naprawdę, to nie było skierowane przeciwko tobie, nie było też wywoływaniem wojny na bluzgi, napisałem to, by skłonić ludzi do myślenia o czymś bardziej konstruktywnym.

Tom Rini stwierdził, że nawet obecna liczba drzew to zbyt wiele, pisząc: "Gdy Alan zabrał się za 2.2.x, byli inni, którzy także wypuszczali -ac'owe 2.2. Marcelo zajmuje się teraz 2.4.x i wydaje się, że robi kawał dobrej roboty pilnując, żeby dodawać tylko stabilne rzeczy. Jedyne łaty, które nie znajdą się w jądrach Marcelo wkrótce (a o tym chcę mówić), to łaty wywłaszczające jądro. Ludzie, proszę, więcej drzew to nie zawsze lepiej, pomyślcie, gdy robicie to samo co inni. " Willy odpowiedział: "Być może ludzie, którzy mają własne dobre drzewa jądra chcieliby kontynuować tę dyskusję poza listą i znaleźć zgodę na jedno drzewo testowe. Co do stabilnych wersji, sądzę, że zarówno jądra Marcelo, jak i Andreii są bardzo porządne. Inni ludzie mogę chcieć ich używać."

6. Śledzenie źródeł

5 Jan 2002 - 6 Jan 2002 (5 posts) Archive Link: "Binutils i wyszukiwarka źródeł jądra Linux"

People: Dr. David Alan Gilbert

Dr. David Alan Gilbert napisał:

Jestem autorem 'Linux kernel source finder' - strony www, na której wymieniono miejsca, w których można uzyskać łaty na jądro Linuksa dla każdej architektury - zobaczcie:

http://www.treblig.org/Linux_kernel_source_finder.html

Chciałbym ją poszerzyć tak, by zawierała odnośniki do najlepszych/najnowszych/najbardziej odpowiednich binutilsów dla każdej architektury. Umieściłem odnośniki do nich dla x86, Alphy i MIPS prowadzące do ftpa H.J.Lu, bo dla tych trzech platform prowadzi on testy przed wypuszczeniem.

Będę wdzięczny za rekomendacje i komentarze od tych, którzy używają binutils na Linuksie na innych platformach, będę też wdzięczny za odnośniki do ftpów, repozytoriów cvs i stron www, opisujących rozwiązania stosowane dla tych architektur.

 

 

 

 

 

 

Sharon And Joy
 

Kernel Traffic is grateful to be developed on a computer donated by Professor Greg Benson and Professor Allan Cruse in the Department of Computer Science at the University of San Francisco. This is the same department that invented FlashMob Computing. Kernel Traffic is hosted by the generous folks at kernel.org. All pages on this site are copyright their original authors, and distributed under the terms of the GNU General Public License version 2.0.

Mirror provided by HKMirror. Sponsored by Porno Verzameling and webcamsex