Większość systemów Linux, którymi zarządzam, zawiera sprzętowe kontrolery RAID (głównie HP Smart Array ). Wszystkie działają pod kontrolą RHEL lub CentOS.
Szukam dostrajania w świecie rzeczywistym, aby pomóc zoptymalizować wydajność konfiguracji, które zawierają sprzętowe kontrolery RAID z dyskami SAS (Smart Array, Perc, LSI itp.) Oraz pamięć podręczną z podtrzymaniem bateryjnym lub flash. Załóżmy RAID 1 + 0 i wiele wrzecion (4+ dyski).
Spędzam dużo czasu na dostrajaniu ustawień sieci Linux dla aplikacji o niskim opóźnieniu i handlu finansowego. Ale wiele z tych opcji jest dobrze udokumentowanych (zmiana buforów wysyłania / odbierania, modyfikowanie ustawień okna TCP itp.). Co robią inżynierowie po stronie magazynu?
Historycznie wprowadziłem zmiany w elemencie windującym harmonogramowanie we / wy , ostatnio zdecydowałem się na harmonogramy deadline
i noop
, aby poprawić wydajność w swoich aplikacjach. W miarę rozwoju wersji RHEL zauważyłem również, że zmieniły się również domyślne ustawienia dla urządzeń blokowych SCSI i CCISS. Z czasem wpłynęło to na zalecane ustawienia podsystemu pamięci. Minęło trochę czasu, odkąd widziałem jakieś wyraźne rekomendacje. I wiem, że domyślne ustawienia systemu operacyjnego nie są optymalne. Na przykład wydaje się, że domyślny bufor odczytu z wyprzedzeniem 128 kb jest bardzo mały dla wdrożenia na sprzęcie klasy serwerowej.
W poniższych artykułach opisano wpływ na wydajność zmiany pamięci podręcznej z wyprzedzeniem i wartości nr_requests na kolejki bloków.
http://zackreed.me/articles/54-hp-smart-array-p410-controller-tuning
http://www.overclock.net/t/515068/tuning-a-hp-smart-array-p400-with -linux-dlaczego-tuning-naprawdę-ważne
http://yoshinorimatsunobu.blogspot.com/2009/04/linux-io-scheduler-queue-size-and.html
Na przykład są to sugerowane zmiany dla kontrolera RAID HP Smart Array:
echo "noop" > /sys/block/cciss\!c0d0/queue/scheduler
blockdev --setra 65536 /dev/cciss/c0d0
echo 512 > /sys/block/cciss\!c0d0/queue/nr_requests
echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb
Co jeszcze można niezawodnie dostroić, aby poprawić wydajność pamięci?
Szczególnie szukam opcji sysctl i sysfs w scenariuszach produkcyjnych.
Przede wszystkim wszystko zależy od obciążenia pracą.
read_ahead_kb
może ci pomóc, jeśli naprawdę pomocne jest wcześniejsze odczytanie dużej ilości danych z jakiegoś pliku, na przykład podczas przesyłania strumieniowego wideo. Czasami może cię to bardzo zranić. Tak, domyślnie 128 KB może brzmieć jak małe, ale przy wystarczającej współbieżności zaczyna brzmieć jak duże! Z drugiej strony, z serwerem takim jak serwer kodujący wideo, który konwertuje tylko filmy z jednego formatu na inny, może być bardzo dobrym pomysłem.nr_requests
, gdy zostanie przekroczony, może łatwo zalać kontroler RAID, co ponownie obniża wydajność.W prawdziwym świecie musisz obserwować opóźnienia . Jeśli jesteś podłączony do sieci SAN, przyjrzeć się
iostat
,sar
czy cokolwiek chcesz użyć, i sprawdzić, czy czasy serwisowe żądanie I / O są przez dach. Oczywiście pomaga to również w przypadku dysków lokalnych: jeśli opóźnienia są bardzo bardzo duże, rozważ zmniejszenie ustawień windy we / wy przez obniżenie wartości max_requests i innych ustawień.źródło
FYI
read_ahead_kb
iblockdev --setra
to tylko różne sposoby ustawienia tego samego ustawienia przy użyciu różnych jednostek (kB vs sektory):Więc…
w twoim przykładzie nie ma efektu.
źródło