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

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.
- kyber
- harmonogram io
- jądro linuksa
- nvme
- opóźnienia