Solaris 10'da kullanılan bellek


10

Solaris 10'daki bellek hakkında bir soru daha.

Bir üst bana 672 MB boş hafıza olduğunu gösterir:

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

Bir vmstat bana aynı şeyi gösterir:

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

Ama bir prstat -a -s boyutu yaptığımda bunu elde:

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%

ve gördüğünüz gibi, RSS değerlerinin toplamı 15 GB belleğe ulaşmıyor ve SWAP değerleri eklesem bile.

Benim sorum şu: hangi komuta inanıyorum?

Top ve vmstat bana iyi sonuç verirse, 15GB'lık bellek nerede kullanılır? Değilse, neden bana bunu gösteriyorlar?

Düzenle: komutun sonucu: % 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

Düzenleme 2:

Tamam, şimdi ARC önbellek tarafından kullanılan belleği görebiliyorum.
Ama bazı yeni testlerle, şimdi:

2066 MB used( prstat -Z ve echo :: memstat | mdb -k sonucu)
1193 MB free( en iyi sonuç)
8859 MB ARC cache( kstat zfs :: arcstats: boyut sonucu)

Bu da 12 GBsistemim varken bize az ya da çok bellek veriyor 16 GB.
Belki başka bir şeyi kaçırdım, ama diğeri nerede 4 GB?


Lütfen kstat zfs::arcstats:sizesorunuza çıktı ekleyin .
jlliagre

Yanıtlar:


12

ZFS muhtemelen belleğinizin çoğunu ARC önbelleği olarak kullanıyor. RAM'inizin nasıl kullanıldığını bilmek isterseniz, bu komutu root olarak çalıştırın:

# echo ::memstat | mdb -k

Solaris 10 10/09 ve daha yeni sürümlerde bu şöyle görünür:

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

Gördüğünüz gibi, ZFS dosya verilerini önbelleğe almak için RAM'in ne kadarının kullanıldığını belirten bir satır var. Ne yazık ki, eski bir Solaris 10 sürümü çalıştırıyorsunuz, bu nedenle memstat bu ZFS istatistiğini ayrı olarak göstermiyor. Kafa karıştırıcı olan Çekirdek kullanılan bellek ile birlikte gelir. Bir çekirdek normal koşullar altında 13 GB RAM kullanmamalıdır.

Her neyse, sunucunuzda tam ARC boyutunu görüntülemenin bir yolu var.

Sadece şu komutu çalıştırın:

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

Makinemde şu anda ZFS ARC önbelleğini işlemek için 273 MB RAM kullanıldığını gösteriyor. memstat, bu 273 MB'tan 208 MB'ın dosya önbelleği olarak kullanıldığını gösterir. Bu 208 MB'a kadar RAM, uygulamaların gereksinim duyması durumunda talep üzerine otomatik olarak serbest bırakılabilir.

Şimdi süreçlerin bellek kullanımını inceleyelim. Prstat ile -Z seçeneğini kullanırsanız, işlem başına istatistiklerin altında bölge başına bir özet gösterir. Burada global (ve tek) bölge 185 MB RAM kullanıyor. Bu, (kabaca) tüm işlemler rss sütununun toplamıyla eşleşmelidir.

# 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

Bu 185 MB, memstat çıktısında iki satırın toplamına karşılık gelir: veri depolamak için uygulamalar tarafından kullanılan RAM olan "Anon" ve uygulamalar ve bunların kitaplık kodu olan "Exec ve libs".


Cevabınız için de teşekkür ederiz, komutun sonucu gerçekten ayrıntılı değildir, ancak RAM'i neyin kullandığını görmek için gereklidir.
Jeremy

Sorunuzu güncelleyerek çıktısını ekleyebilir misiniz? Bu arada, kabul edilmediğiniz cevap aslında hafifçe yanlıştır, çünkü eşleştirilmemiş sayfalar Solaris tarafından ücretsiz RAM olarak rapor edilir, şikayet ettiğiniz sorun hangisi olduğu gibi kullanılmaz.
jlliagre

Soru komut sonucu ile düzenlendi. Haklısın sorularım tam olarak cevaplanmadı. En azından boş hafızanın top ve vmstat ile :: memstat ile aynı olduğunu görebiliriz . Fakat her bir süreçte neler olduğunu detaylandırmanın bir anlamı var mı?
Jeremy

Hangi Solaris 10 güncellemesini (cat / etc / release) kullanıyorsunuz ve ZFS kullanıyorsunuz?
jlliagre

Solaris 10 5/09 ve evet ZFS kullanıyorum
Jeremy C.

4

Bellek, diskten okunan eşleştirilmemiş veri sayfaları ile doldurulur. Hafızada tutulur, çünkü bu dosyalar tekrar okunabilir ve verilerin hafızada tutulması diskin okunmasını sağlar. Boş bellek sonsuza kadar boşa harcanır, bu nedenle bilgisayar mümkün olduğunca az tutmaya çalışır.

Örneğin, bir program çalıştırdığınızı varsayalım. Program sona erer. Program hala bellekte, ancak program çalışmadığı için bu bellek sayfaları herhangi bir işlem tarafından kullanılmıyor. Sistem bellek baskısı altında değilse sayfalar bellekte tutulur. Program tekrar çalışırsa, bu sadece program için daha fazla bellek ayırmak ve daha sonra tekrar okumak zorunda serbest bırakmak için çaba tasarrufu sağlayacaktır. Ve sayfalar başka bir şey için gerekliyse, sistem için hala bir kazançtır, çünkü bir bellek sayfasını doğrudan kullanımdan diğerine taşımak, yalnızca tekrar kullanılmasını sağlamaktan daha kolaydır.

Bellek kurtarılabilir bir kaynak değildir. 1 GB'ı bir saat boyunca ücretsiz bırakırsanız, bu verilerle yapabileceğiniz her şey sonsuza kadar kaybolur.


Bu iyi açıklanmış cevap için teşekkür ederiz. Artık tüm Solaris sunucularımın neden% 90 daha fazla RAM kullandığını anlıyorum.
Jeremy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.