Gentoo Logo

Uwaga: Oryginalna wersja tego artykułu została opublikowana w IBM developerWorks i jest własnością Westtech Information Services. Poniższy dokument jest poprawioną przez zespół GDP wersją oryginalnego tekstu i nie jest już aktualizowany.


Maksymalna wydajność swapa

1.  Uzyskiwanie prędkości z partycji wymiany (swapa)

Czy kiedy konfigurujemy nowy serwer oparty na Linuksie i tworzymy pojedynczą partycję wymiany o rozmiarze 128 MB to zdajemy sobie sprawę, że w ten sposób znacznie zmniejszamy jego wydajność? Chcielibyśmy zwiększyć wydajność partycji wymiany o kilka rzędów wielkości i stworzyć partycje swap większe niż 1GB? Jest to możliwe, bez łatania jądra lub specjalnego sprzętu, jest to czysta wiedza geeka!

Niektórzy nie troszczą się o swap. Jak wiadomo systemy Linux są zwykle bardzo wydajne w wykorzystywaniu pamięci i swap rzadko kiedy jest tknięty. Jest to często prawdą na systemach biurkowych, jednak serwery to zupełnie inna historia. Ponieważ mogą one być poddawane nieoczekiwanym naprężeniom, takim jak niekontrolowany proces, atak DoS lub nawet efekt Slashdot, muszą posiadać odpowiednio szybki swap, żeby nie zatrzymywały się kiedy cała pamięć fizyczna zostanie wyczerpana.

Nadal nie jesteście przekonani, że to dobry interes? Pokażę jak łatwo zawiesić serwer poprzez załączenie ogromnej ilości nowych procesów.

Ostrzeżenie: Prób należy dokonywać na maszynach innych niż produkcyjne.

Powiedzmy, że mamy dwa zindywidualizowane polecenia grep w /usr/bin, nazwane bobgrep i jimgrep. Teraz załóżmy, że bobgrep jest po prostu skryptem powłoki, który wywołuje plik wykonywalny ELF jimgrep, następująco:

Listing 1.1: Skrypt bobgrep

#!/bin/bash
jimgrep -r $*

Jak na razie wszystko wygląda dobrze, ale co się stanie jeśli jimgrep przez przypadek zostanie zastąpione przez dowiązanie symboliczne do bobgrep? W tym przypadku, wywołanie bobgrep lub jimgrep spowoduje nieskończoną pętlę, wywołującą setki procesów basha w ułamki sekund. Zdarzyło mi się to raz i uwierzcie, bolało!

Jeśli serwer nie posiada odpowiedniego swapa, powyższa sytuacja może zawiesić maszynę w czasie znacznie krótszym niż minuta. Jak rozwiązać taki problem? Jednym rozwiązaniem jest zwiększenie rozmiaru swapa powyżej 128 MB. Na szczęście dla nas, 128MB nie jest granicą wielkości swapa pod jądrami 2.2.x+ i nowszymi, jak to miało miejsce w przeszłości. Obecne limity wynoszą około 2 GB na systemach x86, PowerPC i MC680x0, 512 MB na systemach MIPS, 128 GB na Alpha i przytłaczające 3 terabajty na platformach UltraSparc!

Listing 1.2: Ograniczenia wielkości partycji swap pod ostatnimi jądrami Linuksa

x86                 2 Gigabytes
PowerPC             2 Gigabytes
Motorola 680x0      2 Gigabytes
Sparc               1 Gigabyte
MIPS                512 Megabytes
Alpha               128 Gigabytes
UltraSparc          3 Terabytes

Dobrze, ale co z tego, że możemy zwiększyć wielkość partycji swap. Co ze zwiększeniem wydajności? W idealnej sytuacji możemy utworzyć macierz RAID 0 z partycji swap, żeby odczyt i zapis były równo rozłożone na wszystkie partycje. Jeśli te partycje znajdują się na osobnych urządzeniach i/lub kontrolerach, to znacznie zwiększy wydajność pliku swap, pozwalając serwerom na radzenie sobie z tymczasowymi, gwałtownymi skokami użycia pamięci bez znacznego spowolnienia działania systemu.

Zaskakujące jest to, że obecnie wszystkie jądra Linuksa, domyślnie (bez specjalnych opcji lub łatek) pozwalają na urównoleglenie swapa, tak jak macierz RAID 0. Używając opcji pri w /etc/fstab, ustawiamy kilka partycji swap na ten sam priorytet, w ten sposób mówimy Linuksowi, aby używał ich równolegle:

Listing 1.3: Ustawianie kilku partycji swap na ten sam priorytet

/dev/sda2       none    swap    sw,pri=3        0       0
/dev/sdb2       none    swap    sw,pri=3        0       0
/dev/sdc2       none    swap    sw,pri=3        0       0
/dev/sdd2       none    swap    sw,pri=1        0       0

W powyższym przykładzie Linux będzie używał partycji swap sda2, sdb2 i sdc2 równolegle. Ponieważ te partycje znajdują się na różnych dyskach możliwe, że nawet na innych kontrolerach SCSI, odczyt i zapis niemal się potroi. Czwarta partycja swap, sdd2, będzie używana tylko wtedy gdy wszystkie trzy partycje zostaną zapełnione.

Opcja pri jest łatwa w użyciu. Priorytet musi być liczbą z przedziału pomiędzy 0 a 32767, z 32767 będącym najwyższym priorytetem. Partycje swap będą używane od tej z najwyższym priorytetem do tej z najniższym, innymi słowy partycja z priorytetem x zostanie użyta tylko jeśli wszystkie partycje z priorytetem większym niż x są już pełne. Jeśli kilka partycji ma ten sam priorytet, wtedy Linux automatycznie urównolegli dostęp pomiędzy nimi. To pozwala na urównoleglenie nie tylko swapu, ale także na wyznaczenie priorytetów dostępu tak, aby partycje na szybszych dyskach (lub obszarach dysków) były używane najpierw. Więc można ustawić awaryjną partycję swap na starym, wolniejszym dysku, która zostanie użyta tylko wtedy, gdy cały szybki swap zostanie wykorzystany.

Teraz nadszedł czas, aby naszą wiedzę o swapie wprowadzić w życie. Parafrazując pana Miyagi znanego z Karate Kid: "Swap on, swap off, geek-san!"

Zasoby



Drukuj

Zaktualizowano 9 października 2005

Podsumowanie: Nauczymy się jak zwiększyć wydajność partycji wymiany na Linuksowym serwerze o kilka rzędów wielkości. Autor Daniel Robbins w tej krótkiej wskazówce wyciśnie z naszego serwera ostatnie poty.

Daniel Robbins
Autor

Mateusz Kotyrba
Tłumaczenie

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Online Kredit Index
Copyright 2001-2009 Gentoo Foundation, Inc. Questions, Comments? Contact us.