Jeszcze jedno pytanie dotyczące pamięci w Solarisie 10.
U góry widać, że mam 672 MB wolnej pamięci:
130 processes: 126 sleeping, 2 zombie, 2 on cpu
CPU states: 95.1% idle, 3.9% user, 1.0% kernel, 0.0% iowait, 0.0% swap
Memory: 16G phys mem, 672M free mem, 2048M total swap, 2023M free swap
A vmstat pokazuje mi taki sam:
kthr memory page disk faults cpu
r b w swap free re mf pi po fr de sr rm s0 s1 s2 in sy cs us sy id
0 0 0 564744 687896 3 13 0 0 0 0 0 0 0 0 0 354 667 752 1 1 98
Ale kiedy robię rozmiar prstat -a -s , otrzymuję to:
NPROC USERNAME SWAP RSS MEMORY TIME CPU
45 orbixadm 1449M 1592M 9.7% 4:46:53 0.4%
48 root 146M 160M 1.0% 8:09:49 1.2%
3 user1 46M 204M 1.2% 0:00:45 0.0%
9 webservd 46M 14M 0.1% 0:00:00 0.0%
5 ctxsrvr 28M 32M 0.2% 4:54:51 0.0%
11 user2 23M 34M 0.2% 0:00:37 0.2%
4 user3 4840K 11M 0.1% 0:00:01 0.0%
1 smmsp 1456K 4552K 0.0% 0:00:24 0.0%
2 daemon 2128K 6224K 0.0% 0:06:32 0.0%
1 user4 1232K 3608K 0.0% 0:00:00 0.0%
1 nagios 376K 2472K 0.0% 0:15:18 0.0%
i jak widać suma wartości RSS nie osiąga 15 GB pamięci, a nawet jeśli dodam do niej wartości SWAP.
Więc moje pytanie brzmi: w jakie polecenie wierzę?
Jeśli top i vmstat dają mi dobry wynik, to gdzie moja 15 GB pamięci jest używana? Jeśli nie, to dlaczego mi to pokazują?
Edycja: wynik polecenia: % echo ::memstat | mdb -k
Page Summary Pages MB %Tot
------------ ---------------- ---------------- ----
Kernel 1687138 13180 82%
Anon 137110 1071 7%
Exec and libs 47107 368 2%
Page cache 95277 744 5%
Free (cachelist) 22248 173 1%
Free (freelist) 69592 543 3%
Total 2058472 16081
Physical 2055442 16058
Edycja 2:
Ok, teraz widzę pamięć używaną przez pamięć podręczną ARC.
Ale z kilkoma nowymi testami mam teraz:
2066 MB used
( prstat -Z i echo :: memstat | mdb -k wynik)
1193 MB free
( najwyższy wynik)
8859 MB ARC cache
( kstat zfs :: arcstats: wynik rozmiaru )
Co daje nam mniej więcej tyle 12 GB
pamięci, ile ma mój system 16 GB
.
Może przegapiłem coś innego, ale gdzie są inne 4 GB
?
źródło
kstat zfs::arcstats:size
wynik do pytania.Odpowiedzi:
ZFS prawdopodobnie wykorzystuje większość pamięci jako pamięć podręczną ARC. Jeśli chcesz wiedzieć, jak używana jest pamięć RAM, uruchom to polecenie jako root:
W systemie Solaris 10 10/09 i nowszych wyświetla się coś takiego:
Jak widać, istnieje wiersz informujący, ile pamięci RAM jest używane do buforowania danych pliku ZFS. Niestety korzystasz ze starszej wersji Solaris 10, więc memstat nie pokazuje tej statystyki ZFS osobno. Jest dołączony do pamięci używanej przez jądro, co jest mylące. Jądro nie powinno używać 13 GB pamięci RAM w normalnych okolicznościach.
W każdym razie nadal istnieje sposób wyświetlenia pełnego rozmiaru ARC na twoim serwerze.
Po prostu uruchom to polecenie:
To pokazuje, że na moim komputerze 273 MB pamięci RAM jest obecnie używanych do obsługi pamięci podręcznej ARC ZFS. memstat pokazuje, że z tych 273 MB, 208 MB jest używanych jako pamięć podręczna plików. Do 208 MB pamięci RAM można automatycznie zwolnić na żądanie, jeśli będą tego potrzebować aplikacje.
Teraz spójrzmy na wykorzystanie pamięci procesów. Jeśli używasz opcji -Z z prstat, wyświetla podsumowanie dla strefy w statystykach dla procesu. Tutaj strefa globalna (i tylko) zużywa 185 MB pamięci RAM. To powinno (z grubsza) dopasować sumę wszystkich procesów rss kolumna.
Te 185 MB odpowiada sumie dwóch wierszy na wyjściu memstat: „Anon”, czyli pamięć RAM używana przez aplikacje do przechowywania danych, oraz „Exec i lib”, czyli kod aplikacji i ich bibliotek.
źródło
Pamięć jest wypełniona niezapisanymi stronami danych odczytanymi z dysku. Jest przechowywany w pamięci, ponieważ pliki te mogą być ponownie odczytane, a przechowywanie danych w pamięci zapisuje odczyt dysku. Wolna pamięć jest marnowana na zawsze, więc komputer stara się zachować jej jak najmniej.
Załóżmy na przykład, że uruchamiasz program. Program kończy się. Program jest nadal w pamięci, ale te strony pamięci nie są używane przez żaden proces, ponieważ program nie działa. Jeśli system nie jest pod presją pamięci, strony są przechowywane w pamięci. Jeśli program uruchomi się ponownie, zaoszczędzi to wysiłku polegającego na zwolnieniu go, aby po prostu przydzielić więcej pamięci dla programu, a następnie wczytać go ponownie. A jeśli strony są potrzebne do czegoś innego, nadal jest to wygrana dla systemu, ponieważ łatwiej jest przenieść stronę pamięci bezpośrednio z innej na miejsce niż zwolnić ją tylko po to, aby ponownie użyć.
Pamięć nie jest zasobem do zapisania. Jeśli pozostawisz 1 GB wolnego miejsca na godzinę, wszystko, co możesz zrobić z tymi danymi, zostanie na zawsze utracone.
źródło