Używana pamięć w systemie Solaris 10

10

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 GBpamięci, ile ma mój system 16 GB.
Może przegapiłem coś innego, ale gdzie są inne 4 GB?

Jeremy C.
źródło
Dodaj kstat zfs::arcstats:sizewynik do pytania.
jlliagre

Odpowiedzi:

12

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:

# echo ::memstat | mdb -k

W systemie Solaris 10 10/09 i nowszych wyświetla się coś takiego:

Page Summary                Pages                MB  %Tot
------------     ----------------  ----------------  ----
Kernel                      60569               236   16%
ZFS File Data               53270               208   14%
Anon                        41305               161   11%
Exec and libs                5891                23    2%
Page cache                   1190                 4    0%
Free (cachelist)             7006                27    2%
Free (freelist)            212607               830   56%

Total                      381838              1491

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:

# kstat zfs::arcstats:size
module: zfs                             instance: 0
name:   arcstats                        class:    misc
        size                            273469024

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.

# prstat -Z
PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
   741 noaccess  129M  113M sleep   59    0   0:00:35 1,4% java/18
   973 root     5148K  832K run     29    0   0:00:00 0,4% script/1
   972 root     5072K  900K sleep   59    0   0:00:00 0,2% script/1
   998 root     7148K 2812K cpu0    49    0   0:00:00 0,1% prstat/1
   974 root     3456K  968K sleep   49    0   0:00:00 0,1% ksh/1
     5 root        0K    0K sleep   99  -20   0:00:01 0,1% zpool-rpool/37
   241 root     5400K 1608K sleep   59    0   0:00:00 0,0% VBoxService/5
    77 root     7620K 2356K sleep   59    0   0:00:00 0,0% devfsadm/7
   969 root     3372K  936K sleep   59    0   0:00:00 0,0% script/1
   126 root     9664K 2844K sleep   59    0   0:00:00 0,0% nscd/31
   480 root     9420K 2036K sleep   59    0   0:00:00 0,0% sendmail/1
    11 root     9164K 7860K sleep   59    0   0:00:29 0,0% svc.configd/17
     1 root     2504K 1432K sleep   59    0   0:00:00 0,0% init/1
   413 root       15M 9644K sleep   59    0   0:00:00 0,0% fmd/19
   377 root     6536K 2848K sleep   59    0   0:00:02 0,0% inetd/4
ZONEID    NPROC  SWAP   RSS MEMORY      TIME  CPU ZONE
     0       48  177M  185M    12%   0:01:24 2,5% global

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.

jlliagre
źródło
Dziękuję również za odpowiedź, wynik polecenia nie jest tak naprawdę szczegółowy, ale konieczne jest sprawdzenie, co korzysta z pamięci RAM.
Jeremy C.
Czy możesz dodać wynik, aktualizując swoje pytanie? Nawiasem mówiąc, odpowiedź, którą zaakceptowałeś, jest trochę niepoprawna, ponieważ niezamapowane strony są zgłaszane przez Solaris jako wolna pamięć RAM, a nie jako używane, co jest problemem, na który się skarżysz.
jlliagre
Pytanie edytowane z wynikiem polecenia. Masz rację, na moje pytania nie ma całkowitej odpowiedzi. Przynajmniej widzimy, że wolna pamięć jest taka sama dla top i vmstat niż z :: memstat . Ale czy istnieje znaczenie, aby szczegółowo opisać, co jest wykorzystywane przez każdy proces?
Jeremy C.
Jakiej aktualizacji Solaris 10 używasz (cat / etc / release) i używasz ZFS?
jlliagre
jest to Solaris 10 5/09 i tak, używam ZFS
Jeremy C.
4

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.

David Schwartz
źródło
Dziękuję za tę dobrze wyjaśnioną odpowiedź. Rozumiem teraz, dlaczego wszystkie moje serwery Solaris mają mniej więcej 90% pamięci RAM.
Jeremy C.