dlaczego część mojej przestrzeni wymiany jest używana, skoro nadal mam nieużywaną pamięć RAM?


9

Bardziej ciekawość niż problem; i, przyznaję, coś z żenująco podstawowego pytania:

Zauważyłem, że przy wielu okazjach na moim komputerze z Linuksem mam ~ 500 MB miejsca do wymiany, chociaż mam ~ 600 MB nieużywanej pamięci RAM.

Moje naiwne zrozumienie na wysokim poziomie brzmiało: wymiana przestrzeni nie zaczyna się, dopóki pamięć RAM nie zostanie wyczerpana.

Poszedłem dalej i założyłem, że taka sytuacja musi być spowodowana przez jądro Linuksa, ponieważ proces użytkownika, który żąda pamięci, robi to tylko logicznie i nie ma pojęcia, czy ta pamięć jest fizycznie wspierana przez RAM, czy przestrzeń wymiany.

Co prowadzi do pytania, dlaczego jądro miałoby prewencyjnie korzystać z przestrzeni wymiany? Czy to część algorytmu dostrajania wydajności? Czy zamienia się na dyskowe części pamięci, które uważa za najmniej prawdopodobne do uzyskania dostępu (być może schemat LRU)? Jeśli tak, to czy nie ma sensu pozostawiać wszystkiego w pamięci RAM i tylko przy zbliżającym się wyczerpaniu, wtedy i tylko wtedy zamieniać części LRU z pamięci RAM na przestrzeń wymiany?

Powinienem wyjaśnić, mój serwer linux ma 2 GB pamięci RAM i 2 GB przestrzeni wymiany.


1
dlaczego 4 głosy, by zamknąć to pytanie?

2
@Aaron: To nie tak, że masz złe pytanie. Właśnie sformułowałeś to w kontekście zarządzania systemem, aby lepiej pasowało do zaawansowanych użytkowników lub administratorów serwerów. To, że zastanawiasz się nad tym, ponieważ ciekawość wydaje się bardziej zaawansowanym POV.

Odpowiedzi:


11

Niewykorzystana część pamięci RAM jest w rzeczywistości wykorzystywane jako HDD cache. Jeśli się nad tym zastanowisz, faktycznie częściej odczytujesz części dysku, uzyskując dostęp do niektórych części pamięci RAM. Co ma sens, aby umieścić tę pamięć RAM na dysku, jednocześnie używając pamięci RAM do buforowania danych dysku twardego.


7

Sensowne jest zamiana rzeczy z góry, ponieważ kiedy naprawdę potrzebujesz pamięci, nie będziesz musiał czekać, aż jądro zakończy dostęp do dysku.

Załóżmy na przykład, że chcesz otworzyć duży obraz. Po załadowaniu obrazu zajmuje 300 MB pamięci RAM. Jeśli jądro zużywa całą dostępną pamięć RAM, załadowanie obrazu wymaga, aby jądro przesłało 200 MB z pamięci RAM na dysk. Jeśli wcześniej aktywnie opróżnia pamięć RAM, oszczędzasz kilka milisekund.


7

2 powody:

  1. (@dtrosset) Linux zamieni nieużywane fragmenty programów, aby zapewnić więcej pamięci podręcznej i buforów.
  2. Być może używałeś więcej pamięci w przeszłości i zamieniłeś niektóre rzeczy, i nie został zamieniony, ponieważ nie został wykorzystany, nawet jeśli cokolwiek go zmusiło, już minęło.

1

Oprócz innych odpowiedzi możesz skonfigurować Linuksa tak, aby wymagał tworzenia kopii zapasowej dla przydzielonej pamięci, nawet jeśli programy jej nie używają.

Nadmierna pamięć i obawa przed zabójcą OOM nie są jednak niezbędnymi elementami Linuksa. Po prostu ustawienie parametru sysctl vm / overcommit_memory na 2 wyłącza zachowanie nadmiaru i utrzymuje OOM zabójcę na zawsze na dystans. Większość nowoczesnych systemów powinna mieć wystarczającą ilość miejsca na dysku, aby zapewnić wystarczający plik wymiany w większości sytuacji. Zamiast próbować zabić procesy zwierząt domowych przed zabiciem, gdy skończy się nadmierna pamięć, może być łatwiej po prostu uniknąć sytuacji. [ Wytchnienie od zabójcy OOM ]

Jeśli program przydziela pamięć, jądro może po prostu oznaczyć więcej stron wymiany jako zatwierdzone. To wskazanie jest przechowywane w menedżerze pamięci jądra, faktyczne miejsce na dysku nie zostało jeszcze dotknięte. Dopóki pamięć nie zostanie wykorzystana, nic nie trzeba zamieniać i zamieniać. Jeśli nigdy nie będą używane, użycie wymiany będzie się zmieniać bez wpływu na wydajność.

Ponieważ procesy są prezentowane z własną przestrzenią adresową lub „widokiem” (tak właśnie działa zamiana), jądro ma dużą swobodę w zarządzaniu tym. Korzystając z przykładu rozwidlenia również z powyższego artykułu, ponieważ znacznie bardziej prawdopodobne jest, że strony pamięci współdzielonej niż świeżo przydzielą dużą ilość nieużywanej pamięci, pamięć można przydzielić kopiowaniu przy zapisie, zwiększając liczbę operacji wymiany. Kiedy jest faktycznie napisane do (co może się nie zdarzyć), wówczas „zatwierdzoną zamianę” można zastąpić dowolną nieużywaną pamięcią RAM (następnie zwiększając użycie pamięci RAM i zmniejszając użycie wymiany). Wyobraź sobie proces z przydzielonym 500 MB, który powoduje rozwidlenie na maszynie z całą lub prawie całą pamięcią RAM. Jeśli w swapie jest dostępne 500 MB (a miejsce na dysku jest tanie, jak duży jest 1% dzisiejszych dysków TB?: P), nie trzeba kopiować pamięci (jeszcze,

W ten sposób unika się możliwości zabójcy OOM i znacznie łatwiej jest zaprojektować większość oprogramowania przy założeniu, że przydziały pamięci (w tym przydziały „niejawne” poprzez coś takiego jak rozwidlenie) albo udają się, albo kończą natychmiast, z praktyczną świadomością, że jeśli pamięć musi być zamienione, to może wpłynąć na wydajność. Wpływ ten jest prawie zawsze niewielki, ale w najgorszym przypadku prowadzi do przełamania zamiany (nadal czasami jest to lepsze niż bezpośrednie awarie jądra lub zabójca OOM).

Chociaż nie znam dokładnych szczegółów działania menedżera pamięci dla systemu Linux, ta odpowiedź jest moim uogólnionym zrozumieniem i pamiętam, że czytałem przez lata. Próbowałem ponownie edytować tę odpowiedź, więc wymagane jest minimalne zrozumienie projektu systemu operacyjnego (jest to znacznie skomplikowane i nie jest to coś, co mnie bardzo interesuje), ale wydaje się, że trochę się kręci; daj mi znać, jeśli zobaczysz, jak można to poprawić. Chwytliwa ręka może nie być tak zawstydzająco podstawowym pytaniem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.