Dlaczego Red Hat Linux zgłasza mniej wolnej pamięci w systemie niż jest faktycznie dostępna?

9

Mam stosunkowo niewielki domowy serwer Red Hat Linux (około 8 GB pamięci RAM). Nie używam go do innych celów niż uruchamianie domowych aplikacji do śledzenia różnych rzeczy. Jedynymi prawdziwymi rzeczami działającymi na urządzeniu są baza danych i serwer WWW.

Zauważyłem, że podczas sprawdzania liczników systemowych za pomocą narzędzi takich jak NMON i TOP, całkowita wolna pamięć systemowa jest stosunkowo niska (rzędu kilkuset MB), podczas gdy pamięć aktywna dla bazy danych i serwera WWW jest wciąż niska (tylko zużywające łącznie 3 GB). Nawet po uwzględnieniu wszystkich innych uruchomionych procesów całkowita zajętość pamięci jest mniejsza niż 4 GB.

Dlaczego Red Hat Linux zgłasza mniej wolnej pamięci niż pamięć całkowita minus suma pamięci używanej przez uruchomione procesy?

Aaron K.
źródło

Odpowiedzi:

19

Nie pomyl wolnej pamięci z niewykorzystaną pamięcią. Wolna pamięć w świecie uniksowym to strona pamięci fizycznej, na którą nie przypisano żadnych logicznych danych. Na nieużywanej pamięci są mapowane niektóre dane, ale obecnie nie jest ona aktywnie wykorzystywana przez uruchomiony proces.

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

Linux (i wszystkie systemy operacyjne Unix) starają się mieć jak najmniej wolnej pamięci. Zamiast tego używają pamięci, która nie jest aktywnie odwzorowywana na procesy w działającym systemie operacyjnym, np. Na pamięć podręczną plików i bufory dla różnych operacji przesyłania IO.

Innym, co może być mylące, jest to, że nie można po prostu dodać pamięci używanej przez wszystkie uruchomione procesy, aby uzyskać całkowitą liczbę pamięci używanej. Jeśli spróbujesz to zrobić, szybko odkryjesz, że twoje aplikacje wydają się zużywać więcej pamięci niż faktycznie istnieje na komputerze. Wynika to z dwóch powodów

  1. Pamięć może być współdzielona przez różne procesy, poprzez alokację pamięci Copy-On-Write , IO mapowane w pamięci i współdzielone biblioteki dynamiczne .
  2. System operacyjny może obiecać więcej pamięci dla aplikacji niż faktycznie dostarczono. Teoria jest taka, że ​​większość autorów aplikacji woli prosić o duże ilości pamięci za jednym razem, aby uniknąć narzutu, i może nie używać całej tej pamięci.

W lwn.net znajduje się najnowszy artykuł na ten temat .

Dave Cheney
źródło
1
Proste wyjaśnienie znajduje się tutaj: linuxatemyram.com
Steven T. Snyder
4

Linux aktywnie buforuje dostęp systemu plików do pamięci, aby skrócić czas dostępu do dysku. Nie ma się czym martwić.

Uruchomienie wolnego -m na pudełku da ci lepsze pojęcie o tym, gdzie używana jest pamięć.

Poniżej znajduje się wyjście pobrane z jednego z moich pudeł. Wolna pamięć to 147 Meg, z prawie 4G buforowanymi na potrzeby żądań dostępu do systemu plików.

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722
Ryaner
źródło
1

Czy obejmujesz także pola „buforowane” i „buforowane”?

jj33
źródło
1

W Linuksie spójrz na Committed_AS w / proc / meminfo, jest to ilość pamięci (rzeczywista + zamiana), którą jądro rzeczywiście obiecało uruchomionym procesom.

Linux bardzo wydajnie korzysta z pamięci, wszelkie bloki, które nie są obiecane dla jakiegoś procesu, są używane do buforowania ostatnio / często używanych plików. Tak więc typowe jest, że Linux używa 90% całej dostępnej pamięci fizycznej niedługo po uruchomieniu.

Spójrz na to, co jądro zobowiązało się do zapewnienia .. i brudnego (zamiany) użycia, to daje lepszy ogólny obraz.

Jeśli chcesz dostosować to zachowanie, zaktualizuj swoje pytanie :)

Jest to standardowe MO dla Linuksa. Niektóre dystrybucje dostosowują zarządzanie pamięcią do swoich potrzeb poprzez sysctl. Jednak to, co zgłaszasz, jest dość typowe dla wszystkich.

Tim Post
źródło
1

Jakiego rodzaju jądro używasz w systemie? Jądro 32-bitowe zgłasza jedynie około 3,6 GB pamięci, chyba że zostanie skompilowane z włączonym PAE.

Mówiąc, że jeśli jest to nowoczesna wersja Redhat Enterprise Linux (lub CentOS) - od wersji v3 - domyślne 32-bitowe jądro będzie miało tę opcję włączoną.

Jeśli możesz opublikować wynik polecenia „darmowego” opisanego powyżej, będziemy mogli sprawdzić, czy to jest problem.

Mike Pountney
źródło