2009/09/02

i/o tuning - linux

Skończyły się wakacje, czas odpoczynku i lenistwa. Dzieci i młodzież wracają do szkoły, dorośli zapominają o urlopach i biorą się do roboty. Czas odkurzyć klawiaturę i dodać nowej treści do tego bloga. Zaczynam od rozpoczęcia nowego cyklu dotyczącego tuningu różnych systemów operacyjnych pod kątem współpracy z macierzą dyskową.

Kilka miesięcy temu pewien Portugalczyk, konsultant z Microsoftu, młody człowiek z wielką charyzmą, uświadomił mi, że przy strojeniu współczesnych systemów operacyjnych najlepsze efekty można uzyskać w podsystemie i/o. Druga w kolejności, ale dosyć daleko, jest pamięć operacyjna, a parametry systemowe dotyczące pozostałych elementów sprzętu - procesorów, magistral, ..., - nie mają już praktycznie żadnego znaczenia dla wydajności całego systemu.

Powodem takiego stanu rzeczy jest fakt, że współczesne dyski mają wydajność nie wiele większą niż te z poprzedniego wieku. W tym samym czasie moc procesorów wzrosła o kilka tysięcy procent. Przy tak wielkiej różnicy wydajności tych podzespołów, dyski zawsze będą metalową kulą u nogi całego systemu.

Całe szczęście jest kilka mechanizmów, które przy prawidłowych ustawieniach są w stanie znacznie polepszyć tą sytuację. Większość z nich występuję we wszystkich systemach operacyjnych, czasami inaczej się nazywają i inaczej są konfigurowane. W tym wpisie opiszę te, które są istotne w systemie linux (RedHat 5, kernel 2.6):

- długość kolejki niepotwierdzonych operacji i/o (outstanding i/o queue depth)

Każda zlecenie z systemu operacyjnego do macierzy dyskowej wymaga potwierdzenia. Zawiera ono informacje o statusie zakończenia operacji i/o. Nie jest jednak powiedziane, że system musi czekać z wysłaniem nowego zlecenia na potwierdzenie zakończenia poprzedniego. System posiada kolejkę, w której umieszcza zlecone operacje i/o. Czekają one tam na potwierdzenie ich wykonania. Długość tej kolejki określa ile zleceń system może wysłać. (tu przeczytasz o tym więcej). W linux'ie wielkość tą konfiguruje się na poziomie sterownika karty HBA. Jest to jeden parametr który określa długość kolejki dla każdego lun'a obsługiwanego przez ten sterownik. Wpisujemy go do pliku /etc/modprobe.conf:

dla kart Qlogic dopisujemy:
options qla2xxx ql2xmaxqdepth=długość kolejki

dla kart Emulex dopisujemy:
options lpfc lpfc_lun_queue_depth=długość kolejki

(update - zapomniełem o tym napisać) Teraz trzeba skreować nowy plik initrd (mkinitrd), aby nowe parametry były dostępne dla modułów ładowanych podczas startu systemu.

Niestety konieczny jest restart systemu.
Parametr ten decyduje o ilości operacji i/o na sekundę (iops) jaką może zlecić system operacyjny. Zwiększanie go nie ma sensu jeżeli macierz nie jest w stanie wykonać tylu IOPS. Często jednak macierz może więcej, ale system jest ograniczany krótką kolejką. Widać to po różnicy w czasie wykonania operacji i/o na macierzy (szybko) i czasie wykonania operacji i/o w systemie (długo). W takiej sytuacji wydłużenie kolejki powinno zwiększyć wydajność.

- I/O scheduler (elewator)

Developerzy jądra linux'a, mając świadomość ograniczeń wydajnościowych dysków twardych, zaimplementowali mechanizm i/o scheduler'ów zwanych również elewatorami. Znając budowę dysku (sektory, cylindry) stara się on grupować operacji i/o przed wysłaniem do dysku, tak aby jednocześnie trafiły w ten sam region talerza. Mechanizm ten sprawdza się przy pojedynczych dyskach, ale w przypadku macierzy jest zupełnie nieprzydatny. Co więcej może ograniczać wydajność systemu. Dlatego najlepsze co można zrobić to go wyłączyć. Robi się to poprzez ustawienie na dyskach elewatora noop. Można to zrobić globalnie dla całego systemu dodając opcję elevator=noop w linii z parametrami kernela w pliku /boot/grub/grub.conf, np.:

kernel /boot/vmlinuz-2.6.18-32.el5 ro root=LABEL=/1 rhgb quiet elevator=noop

Następnie należy wykonać restart systemu.
Można również zmienić elewator dla konkretnego dysku:

echo noop > /sys/block/nazwa dysku/queue/scheduler

Operacja ta jest online, jednak wymaga powtórzenia po każdym restarcie (potrzebny skrypt startowy). Więcej o scheduler'ach można poczytać w Red Hat Enterprise Linux 5 IO Tuning Guide

I to tyle w temacie tuning i/o w systemie Linux.

Brak komentarzy: