Harmonogram I/O Kyber w Linuksie: jak działa i kiedy go używać

Krótki wielotorowy przenośnik z małymi bramkami na każdym torze, które przepuszczają po kilka paczek do jednego modułu dysku

Kto wpisuje w wyszukiwarkę „kyber linux”, zwykle nie szuka nas. Szuka Kybera, harmonogramu blokowego wejścia-wyjścia, który jest częścią jądra Linuksa od 2017 roku. Zbieżność nazw jest przypadkowa, więc najmniej, co możemy zrobić, to porządnie wyjaśnić to, po co ktoś przyszedł.

O czym decyduje harmonogram I/O

Między programem, który prosi o odczyt pliku, a dyskiem, który zwraca dane, jest warstwa blokowa. Harmonogram to jej część, która decyduje, w jakiej kolejności żądania trafiają do urządzenia i ile może ich być w drodze naraz.

Na dyskach talerzowych kolejność miała ogromne znaczenie, bo głowica musiała się przesuwać. Na nowoczesnym dysku NVMe z wieloma kolejkami sprzętowymi przestawianie żądań daje niewiele. Nadal liczy się natomiast sprawiedliwość między rodzajami pracy: duży zapis w tle nie powinien kazać czekać każdemu drobnemu odczytowi.

Jak działa Kyber

Kyber powstał w Facebooku dokładnie z myślą o takiej sytuacji: o szybkich urządzeniach wielokolejkowych, na których głównym ryzykiem nie jest czas wyszukiwania, tylko głęboka kolejka wolnych żądań, która opóźnia te szybkie.

Dzieli żądania na domeny: odczyty, zapisy synchroniczne, operacje discard i całą resztę. Każda domena dostaje pulę żetonów, a żądanie potrzebuje żetonu, żeby trafić do urządzenia. Kyber mierzy, ile faktycznie trwa obsługa żądań. Jeśli odczyty nie mieszczą się w swoim celu opóźnienia, wydaje mniej żetonów pozostałym domenom. Kolejka w urządzeniu się skraca, a odczyty przestają czekać za zapisami. Gdy opóźnienia są wyraźnie poniżej celu, oddaje żetony i przepustowość znów rośnie.

To cały pomysł i jest celowo prosty. Kyber nie rozlicza procesów i nie próbuje być sprawiedliwy między użytkownikami. Ma dwa parametry i bardzo mały narzut na żądanie, dlatego pasuje do urządzeń, które obsługują setki tysięcy operacji na sekundę.

Jak sprawdzić i zmienić harmonogram

Aktywny harmonogram jest pokazany w nawiasach kwadratowych:

cat /sys/block/nvme0n1/queue/scheduler
# [none] mq-deadline kyber bfq

Jeśli na liście nie ma kyber, moduł nie jest załadowany:

sudo modprobe kyber-iosched

Zmiana harmonogramu dla urządzenia w trakcie pracy:

echo kyber | sudo tee /sys/block/nvme0n1/queue/scheduler

Oba cele opóźnień są obok, w nanosekundach. Domyślnie cel dla odczytów to 2 ms, a dla zapisów synchronicznych 10 ms:

cat /sys/block/nvme0n1/queue/iosched/read_lat_nsec
cat /sys/block/nvme0n1/queue/iosched/write_lat_nsec

Tak wprowadzona zmiana nie przetrwa restartu. Żeby była trwała, użyj reguły udev, na przykład w pliku /etc/udev/rules.d/60-iosched.rules:

ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ATTR{queue/scheduler}="kyber"

Kiedy Kyber to dobry wybór, a kiedy nie

Kyber pasuje do szybkich SSD i dysków NVMe z mieszaną pracą, na przykład do bazy danych albo usługi, która czyta, gdy coś innego zapisuje w tle. Jego zadaniem jest utrzymać przewidywalne opóźnienie odczytów pod obciążeniem.

none bywa lepszym domyślnym wyborem dla jednego bardzo szybkiego dysku NVMe z jednym głównym obciążeniem. Pracę wykonują kolejki samego urządzenia, a każdy harmonogram tylko dokłada narzut. Z tego powodu wiele dystrybucji wybiera go dla NVMe.

mq-deadline to bezpieczny wybór ogólny dla dysków SSD SATA i dysków talerzowych. Każde żądanie dostaje termin, więc nic nie czeka w nieskończoność, a harmonogram dobrze zachowuje się na prawie każdym urządzeniu.

BFQ jest dla komputerów biurkowych i wolnych urządzeń, na których płynność działania liczy się bardziej niż przepustowość: laptop kopiujący duży plik powinien nadal od razu otworzyć terminal. To najbardziej rozbudowany z czterech harmonogramów i najdroższy na żądanie, dlatego rzadko trafia na serwery z szybkimi dyskami.

Jak wybrać bez zgadywania

Mierz opóźnienie, które odczuwają użytkownicy, a nie przepustowość z testu syntetycznego. Uruchom prawdziwe obciążenie albo zadanie fio, które łączy odczyty z zapisami w tle, i porównaj 99. percentyl opóźnienia odczytów dla none, mq-deadline i kyber. Jeśli ogon się nie zmienia, zostań przy najprostszej opcji. Jeśli zapisy w tle wyraźnie szkodzą odczytom na szybkim dysku, Kyber jest narzędziem zbudowanym dokładnie na ten problem.

A KyberLinux?

KyberLinux to coś innego, co dzieli z nim pierwszą połowę nazwy: ultralekki, bezpieczny, otwarty system operacyjny dla SI, ten sam na kieszonkowym decku, w robocie i w węźle chmurowym. Jeśli jednak tego szukasz, zacznij tutaj.