Nigdy do końca nie rozumiałem, dlaczego wysokie We / Wy dysku tak bardzo spowolniło system. Jest to dla mnie dziwne, ponieważ oczekiwałbym, że spowolnienie wpłynie tylko na procesy zależne od danych dysku twardego / optycznego, ale spowolnienie wpływa nawet na rzeczy załadowane do pamięci RAM. Mam tu na myśli iowait .
Dlaczego procesor czeka zamiast wykonywać inną pracę? Czy ktoś może wyjaśnić to ograniczenie i dlaczego nie zostało ono rozwiązane w jądrze Linuksa? Czy istnieje jądro, które nie ma tego problemu?
[ uwaga ] Poczyniono pewne postępy w tym obszarze wyników. Po pierwsze, późniejsze jądra (w moim przypadku 2.6.37) są znacznie bardziej responsywne.
linux
kernel
performance
io
tshepang
źródło
źródło
Odpowiedzi:
Systemy operacyjne korzystają z pamięci wirtualnej, dzięki czemu można użyć więcej pamięci niż dostępna jest fizyczna pamięć RAM. Gdy jądro zdecyduje, że lepiej wykorzystuje stronę pamięci fizycznej, jego zawartość może zostać „stronicowana” w celu przechowywania na dysku. Gdy strona pamięci wirtualnej jest otwierana podczas stronicowania, generuje błąd strony i jest przenoszona z dysku do pamięci RAM.
Błędy strony są katastrofą dla wydajności, ponieważ opóźnienie dysku jest mierzone w milisekundach, a opóźnienie pamięci RAM jest mierzone w nanosekundach. (1 milisekunda = milion nanosekund!)
Pamięć jest wykorzystywana nie tylko przez procesy użytkownika, ale także przez jądro do buforowania systemu plików. Podczas działania systemu plików jądro będzie buforować ostatnio używane dane. Zakłada się, że istnieje duża szansa, że te same dane zostaną wkrótce ponownie wykorzystane, więc buforowanie powinno poprawić wydajność operacji we / wy.
Pamięć fizyczna używana dla pamięci podręcznej systemu plików nie może być używana dla procesów, więc podczas aktywności systemu plików więcej pamięci procesowej zostanie stronicowane, a błędy stron będą rosły. Ponadto dostępna jest mniejsza przepustowość we / wy dysku do przenoszenia stron pamięci zi na dysk. W rezultacie procesy mogą zostać zatrzymane.
źródło
O ile rozumiem, IOwait oznacza, że proces, a nie procesor, czeka na dostępność IO. Procesory zyskały znacznie większą prędkość niż dyski twarde, co oznacza, że więcej kodu skończy się szybciej, a następnie dysk będzie musiał zostać odczytany. Gdy trzeba odczytać wiele więcej, niż dysk może zrobić wystarczająco szybko, kończy się czekanie procesora. Sposób, w jaki zdecydowano, kto może czytać / zapisywać na dysku, zależy od harmonogramu bloków, w większości przypadków teraz CFQ. Jeśli używasz CFQ i potrzebujesz procesu, który zużyje mniej całkowitego czasu operacji we / wy, aby zwiększyć czas reakcji systemu, możesz użyć
ionice -c3 <processid>
. Mówi to systemowi, aby ten proces IO mógł nadawać tylko wtedy, gdy nic więcej go nie potrzebuje.Jest to nadal interesujące i lepiej wyjaśnia problem iowait.
źródło