2010-06-11 9 views
19

Linux /proc/meminfo pokazuje liczbę statystyk użycia pamięci.Jak niezawodnie zmierzyć dostępną pamięć w systemie Linux?

MemTotal:  4040732 kB 
MemFree:   23160 kB 
Buffers:  163340 kB 
Cached:  3707080 kB 
SwapCached:   0 kB 
Active:  1129324 kB 
Inactive:  2762912 kB 

Występuje sporo nakładających się na siebie. Na przykład, o ile rozumiem, może być aktywna pamięć podręczna strony (należy do "buforowanej" i "aktywnej") i nieaktywna pamięć podręczna strony ("nieaktywna" + "buforowana").

Co chcę zrobić jest pomiar „wolny” pamięć, ale w taki sposób, że obejmuje ono również wykorzystywane stron, które mogą zostać usunięte bez znaczącego wpływu na wydajność całego systemu jest.

Początkowo byłem skłonny używać "wolnego" + "nieaktywnego", ale "darmowe" narzędzie Linux używa "wolnego" + "buforowanego" ekranu w "dostosowanym do bufora", więc jestem ciekawy, co jest lepsze podejście jest.

Kiedy w jądrze kończy się pamięć, jaki jest priorytet stron, które należy upuścić i jakie są bardziej odpowiednie dane do pomiaru dostępnej pamięci?

+1

Sprawdź także 'Committed_AS', który jest rzeczywistym rozmiarem jądra, który faktycznie _promised_ przetwarzał. Wygląda na to, że próbujesz przewidzieć, co się stanie, jeśli przydzielisz/zablokujesz/użyjesz xx bajtów, biorąc pod uwagę bieżące użycie pamięci? –

+0

@Tim Post, tak, nawet nie zacząłem nadużywać obrazu. Próbuję uzyskać liczbę, która będzie przewidywać, kiedy zaczynają się złe rzeczy, jeśli więcej pamięci zostanie zużyte. –

Odpowiedz

2

Powiedziałbym, że trudno zmierzyć, które strony po upuszczeniu spowodowałyby "znaczący wpływ systemu na ogólną wydajność systemu". Strony używane przez procesy użytkownika to (Total) - (Free + Cached + Paged). Drugie wyrażenie to cała pamięć, którą jądro może uwolnić, jeśli jest to wymagane. Jednak zwalnianie stron pamięci używanych do przechowywania pamięci podręcznej i stron będzie miało znaczący wpływ na ogólną wydajność systemu.

Gdybym użył heurystyki, powiedziałbym, że powinieneś wziąć wartość "Nieaktywny", która jest "Całkowita ilość bufora lub pamięci podręcznej strony, w kilobajtach, które są bezpłatne i dostępne. jest pamięcią, która nie była ostatnio używana i może być odzyskana w innych celach. " Jeśli okaże się, że bierzesz to i system nadal działa dobrze, można oszacować jakiś procent „Aktywny” do przyjęcia za przypuszczeniem, a także dlatego, że system może być stosowany kilka stron niedawno, ale nie zamierza wykorzystywać je ponownie. Wiesz więcej o systemie niż ja. Jeśli system jest dedykowany do tego, co masz zamiar zrobić, a następnie stron i buforowane pliki w czynnych, które mogą być stosowane wkrótce będzie zależeć od tego, czy system został niedawno używany do czegoś innego.

8

Ponieważ co „dostępnej pamięci” dokładnie oznacza, zależy od celu, a celem jest uniknięcie sytuacji OOM:

Wyjazd how Qt Extended (previously Qtopia) anticipates OOM situations.

Istnieją dwa wydarzenia:

  • (MemFree + Bufory + Buforowany)/MemTotal < próg (w /proc/meminfo)
  • Główne błędy strony> próg (pgmajfault w /proc/vmstat myślę)

Pierwsza to wczesne ostrzeżenie, że pamięć jest niska i powoduje częstsze monitorowanie błędów stron. Drugi zaśmiecaj sygnały, które zabija wydajność systemu i jest dobrą wskazówką, że zabójca OOM będzie działać.

+0

+1 Dobre algorytmy zapobiegania OOM – SeanDowney

3

Na początku znalazłem twoje pytanie łatwe, ponieważ w praktyce wyjście z free w kolumnach "+ bufory/pamięć podręczna" jest tym, którego używam i zwykle działa.

Ale jedna z sytuacji, w których nie pracują, gdy masz ciężki odczytu do tych samych bloków. Na przykład.czytanie tego samego pliku o wielkości 1 gb w kółko:

Jeśli system ma pamięć podręczną o wielkości> 1 GB, to działa szybko. Ale jeśli zaczniesz używać tej pamięci podręcznej do czegoś innego, to zniszczy to wydajność systemu.

Oceniając rozwiązania, wypróbuj powyższe i sprawdź, czy rozwiązanie to bierze pod uwagę.

2

używam następujące:

FREE_KB = MemFree + Buffers + Cached 

FREE_KB=$(($(echo `sed -n '2p;3p;4p' < /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /+/g"))) 


USED_KB = MemTotal - MemFree - Buffers - Cached 

USED_KB=$(($(echo `head -n4 /proc/meminfo | sed "s/ \+/ /g" | cut -d' ' -f 2 ` | sed "s/ /-/g"))) 
+0

Wydaje mi się, że/proc/meminfo zwraca bajty lub kb może być zależne od systemu. Dla mnie powyższy kod wydaje się zwracać bajty, YMMV. – russellpierce

+0

Z jakiego jądra korzystasz? W bieżącej funkcji systemu Linux meminfo_proc_show zwraca tylko kB. – Const

2

Od linux-3,14 jest nowy MemAvailable metryczny w/proc/meminfo.

I sprawdź wiersz "-/+ bufory/pamięć podręczną:" na wyjściu narzędzia bezpłatnie.

Powiązane problemy