Skocz do zawartości
Zaloguj się, aby obserwować  
Johnatan

Użycie Swap Przez Serwer A Jego Ogólna Wydajność

Polecane posty

Witam. Mam następujący przypadek:

Gdy maszyna ma bardzo duży ruch (te 60 minut szczytu), nagle bardzo zwalnia. Drastycznie (wielokrotnie - nieporównywalnie z ilością osób odwiedzających serwer) skacze ilość uruchomionych wątków MySQL, użycie procesora, IO wait dysku, load avarage, response time, netstat no i SWAP IN / OUT (z tym że nie jest to ciągle użycie SWAP'u, tylko pojedyńcze odchyły 1-3 str./sek., komenda top pokazuje, że w użyciu jest np. 10 MB swapu ).

 

Normalnie rośnie natomiast ilość użytkowników, oraz ilość zapytań mySQL na sekundę.

 

Moja teoria jest taka, że w którymś miejscu serwer po prostu inicjuje za dużo wątków, co sprawia że zaczyna on używać SWAP, co spowalnia go, tak więc musi on zainicjować nowe wątki itd. Czy mam rację? Jak poprawić konfigurację serwera?

 

Czy jeżeli serwer używa SWAP'u, powiedzmy ok. 3 MB, to już jest niedobrze i może to znacząco wpłynąć na jego wydajność?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Heh, nie ja aktualnie mam 300MB swapu ( z ostatniego wycieku pamięci mi zostało ) i śmiga normalnie. Wystarczy odmontować partycje i podmonotować lub zrebootować system i swap będzie czysty. Jakie masz tam dyski?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Chciałem dorzucić, że swap można zmienić w każdej chwili bez potrzeby rebootu / reinstallki.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Tak, zwykle rebot całego LAMP pomaga, ale to nie jest wyjście na dłuższą metę. Sprawa ma miejsce w zasadzie codziennie w godzinach szczytu.

 

Dyski - standardowe IDE.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Swap w Linuksie jest dość konfigurowalny i nie jest on używany tylko kiedy brakuje pamięci RAM. Kernel może przerzucić do swapu pewne nie używane regiony pamięci i one będą tam siedziały dopóki jakiś proces się do nich nie odwoła. Tak za pewne było w przypadku serwera @Linuksa. Podczas wycieku kernel zdecydował, że pamięć właśnie zadeklarowana jest ważniejsza więc aby zrobić dla niej miejsce część dawno nie używanych regionów wylądowało w SWAP. Jako, że do tej pory żaden proces się do nich nie odniósł to tam zostały. Fizycznie wolna przestrzeń pamięci jest natomiast używana na bufory więc nic się nie marnuje.

 

Wracając do głównego wątku, 3MB zajętej pamięci SWAP nie oznacza nic konkretnego. Być może zostały one tam wrzucone żeby zrobić miejsce dla innych procesów (bądź buforów) i nie wróciły bo nikt się do nich nie odwołał. Być może jednak te 3MB jest ciągle wymieniane między swapem a pamięcią bo akurat tyle brakuje (no tak, bardzo mało prawdopodobna sytuacja) a wtedy degradacja prędkości będzie znaczna.

 

Problem może przynieść efekt lawinowy kiedy tak jak napisałeś przez to, że brakuje RAM obsługa klientów działa wolno więc na raz odpalonych jest ich więcej co powoduje większe zapotrzebowanie na RAM więc więcej regionów jest swapowanych i znów wszystko spowalnia..

 

Jak się przed tym bronić? Zależy od aplikacji. Niektóre potrafią nie spawnować nowych procesów przy dużym load, inne mają ograniczenia na ilość procesów albo na ilość RAM jaką zajmują. Trzeba sobie jakoś oszacować dobrze te parametry tak żeby nigdy nie zabrakło RAM.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

u mnie tez ostatnio zamula serwer i wszedl na swapa troche :/

jak sprawdzic czy brakuje ramu? (poza IO wait w szczycie :/)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
u mnie tez ostatnio zamula serwer i wszedl na swapa troche :/

jak sprawdzic czy brakuje ramu? (poza IO wait w szczycie :/)

Komenda 'free' albo interaktywnie 'top' (lub różne odmiany) pokazują zużycie RAMu. Jak do wolnego RUMu dodasz RAM użyty na bufory albo od zajętego odejmiesz tą wartość to dowiesz się ile masz wolne.

 

EDIT:

Jeszcze taki mały TIP. Jak w 'top' wciśnie się 'f' a potem 'p' i ESC to zostanie dodana kolumna SWAP pokazująca który proces ile wyswapował. Można to też obliczyć po prostu odejmując od VIRT wartość RES

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

pleple wiem gdzie sprawdzic ile jest wolne ile zajete (top jest dobry ale wole lstat :))

ale to ze mi serwer wszedl na swap wcale nie musi znaczyc ze mu brakuje...

chodzilo mi jak rozpoznac ze jednak juz czas najwyzszy dokupic troche

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Masz rację, to że wszedł na SWAP nie oznacza, że brakuje RAMu, pisałem o tym. Natomiast w mojej odpowiedzi na Twoje pytanie nie było nic odnośnie SWAP (tylko dałem TIP dla ludzi, którzy pisali o SWAP w temacie) a zamiast tego była informacja jak stwierdzić czy brakuje RAM. Skoro wiesz jak sprawdzić ile masz wolnego RAM to wiesz też czy potrzebujesz go więcej czy nie - jeśli masz dużo wolnej pamięci to nie potrzebujesz a jak mało to potrzebujesz. Nie wiem, to chyba prosty i logiczny sposób...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

RAM jako taki mam zawsze zajety ale z tego co mi tlumaczono to tak pracuje linux ze wsjo do pamieci wali...

(zaznaczam ze co prawda zielony nie jestem ale sie nei znam :))

aktualnie mam wolnego ramu 60-100mb a SWAP uzyty 77mb

jest jakas komenda na zwolnienie ramu czy trzeba restart robic?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
jest jakas komenda na zwolnienie ramu czy trzeba restart robic?

skopiuj b. duży plik ( np. obraz ISO 650 MB ) z jednego katalogu do drugiego,

po czym tą utworzoną kopię skasuj i zaraz się zrobi dużo wolnej pamięci :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ech, Ty chyba nie czytasz co ja piszę. Poza tym piszesz, że umiesz sprawdzić ile masz RAM a teraz się okazuje, że nie umiesz (albo w ogóle tego nie rozumiesz). Więc raz jeszcze jak krowie na rowie:

- Nie zajęta pamięć w Linuksie jest używana na wszelkiego rodzaju bufory

 

- Żeby więc stwierdzić ile jest wolnej (czyli takiej, która może zostać przydzielona jakiemuś procesowi) pamięci, można do pamięci wolnej (free) dodać pamięć zajętą przez bufory (buffered) oraz przez cache (cached). Program 'free' robi to za nas w linijce '-/+ buffers/cache'.

 

- Systemy operacyjne są dziś projektowane tak żeby nie trzeba było ich restartować. O ile nie wystąpiła jakaś bardzo poważna awaria (w Linuksie takie zdarzają się bardzo sporadycznie) to nie trzeba go restartować. Trzeba go tylko zrozumieć. Jak więc zwolnić pamięć? Trzeba zabić tych, którzy ją zaalokowali czyli procesy. Mam jednak wątpliwości czy wiesz ile masz faktycznie wolnej pamięci (czyli po doliczeniu buforów i cache).

 

- Zawsze powinieneś mieć sporo więcej pamięci niż potrzebują same procesy (czyli used-(buffers+cache)) po to żeby mieć miejsce na bardzo istotne z punktu widzenia wydajności bufory i cache

 

- Jeśli więc po odliczeniu cache i buforów masz mniej niż 30% wolnej pamięci to zdecydowanie potrzebujesz zastanowić się nad kupnem większej ilości pamięci (próg 30% może się zmienić w zależności o tego do czego używany jest serwer, to wartość bardzo orientacyjna wymyślona przeze mnie)

 

Mam nadzieję, że teraz nie ma niejasności.

 

skopiuj b. duży plik ( np. obraz ISO 650 MB ) z jednego katalogu do drugiego,po czym tą utworzoną kopię skasuj i zaraz się zrobi dużo wolnej pamięci :)

 

Hmm.. przede wszystkim należy tu zaznaczyć iż sztuczne zwalnianie pamięci (tzn. pamięć nie jest zwalniana tylko są z niej usuwane bufory) pogarsza a nie polepsza wydajność systemu. Tak gwoli wyjaśnienia tym, którzy nie bardzo się orientują - operacja ta wsadzi w bufory totalnie nieprzydatne informacje (usuwając te, które mogłyby być użyte do przyspieszenia pewnych operacji), czyli cache bloków systemu plików, na których jest ten duży plik, po czym usunie je z pamięci jako iż plik został usunięty (i nie można z niego już korzystać więc cache się już na pewno nie przyda).

 

Ja proponuję więc zrobić taki test:

- Dla rozbudowanego katalogu w systemie plików policzcie sumaryczny obszar jaki zajmują przez:

du -s {KATALOG}

 

- Należy wybrać taki katalog, dla którego operacja ta wykona się w ciągu co najmniej kilku sekund (czyli z zauważalnym obciążeniem)

 

- Teraz wykonajcie tą operację raz jeszcze, powinna wykonać się w mgnieniu oka i nie usłyszycie już dźwięków pracy dysku

 

- Teraz skopiujcie duży plik i usuńcie kopie

 

- Znów odpalcie to samo polecenie du, dalej śmiga tak szybko jak za drugim razem?

 

No a teraz wyobraźcie sobie, że w pamięci nie są zapisane metadane plików z tego katalogu tylko pliki obciążonej bazy danych. Lepiej jak odwołanie do tych plików jest natychmiastowe (ale nie macie "wolnego ramu") czy z opóźnieniem (ale macie "wolny" pięknie marnując się RAM)?

 

P.S. Automatyczne sklejanie postów działa koszmarnie :/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

pleple, sorcia - nie skapowalem do konca o co ci chodzilo :)

dzieki za wyjasnienie

 

total used free shared buffers cached

Mem: 1032872 967148 65724 0 13764 538784

-/+ buffers/cache: 414600 618272

Swap: 1020024 77516 942508

40% zajete, 60% wolne

wychodzi wiec ze jest ok

jednak trzeba bedzie w lepsza maszyne zainwestowac niedlugo :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×