Memori yang digunakan pada Solaris 10

10

Satu lagi pertanyaan tentang memori pada Solaris 10.

Sebuah atas menunjukkan bahwa saya memiliki memori bebas 672 MB:

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

Sebuah vmstat menunjukkan saya sama:

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

Tetapi ketika saya melakukan prstat -sebuah -s saya mendapatkan ini:

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%

dan seperti yang Anda lihat, jumlah nilai RSS tidak mencapai 15GB memori, dan bahkan jika saya menambahkan nilai SWAP ke dalamnya.

Jadi pertanyaan saya adalah: perintah mana yang saya percayai?

Jika top dan vmstat memberikan saya hasil yang baik, di mana memori 15GB saya yang digunakan? Jika tidak, mengapa mereka menunjukkan itu padaku?

Edit: hasil untuk perintah: % 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

Edit 2:

Ok, sekarang saya bisa melihat memori yang digunakan oleh cache ARC.
Tetapi dengan beberapa tes baru, sekarang saya punya:

2066 MB used( prstat -Z dan echo :: memstat | mdb -k hasil)
1193 MB free( hasil atas )
8859 MB ARC cache( kstat zfs :: arcstats: hasil ukuran )

Yang memberi kami lebih banyak atau lebih sedikit 12 GBmemori, sementara sistem saya memiliki 16 GB.
Mungkin saya melewatkan sesuatu yang lain, tetapi di mana yang lain 4 GB?

Jeremy C.
sumber
Silakan tambahkan kstat zfs::arcstats:sizekeluaran ke pertanyaan Anda.
jlliagre

Jawaban:

12

ZFS kemungkinan menggunakan sebagian besar memori Anda sebagai cache ARC. Jika Anda ingin tahu bagaimana RAM Anda digunakan, jalankan perintah ini sebagai root:

# echo ::memstat | mdb -k

Pada Solaris 10 10/09 dan lebih baru, ini menampilkan sesuatu seperti ini:

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

Seperti yang Anda lihat, ada garis yang menyatakan berapa banyak RAM yang digunakan untuk menyimpan data file ZFS. Sayangnya, Anda menjalankan rilis Solaris 10 yang lebih lama sehingga memstat tidak menunjukkan statistik ZFS ini secara terpisah. Ini disertakan dengan memori yang digunakan Kernel yang membingungkan. Kernel seharusnya tidak menggunakan RAM 13 GB dalam keadaan normal.

Bagaimanapun, masih ada cara untuk menampilkan ukuran ARC penuh di server Anda.

Jalankan saja perintah ini:

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

Ini menunjukkan bahwa pada mesin saya, 273 MB RAM saat ini digunakan untuk menangani cache ARC ZFS. memstat menunjukkan bahwa dari 273 MB ini, 208 MB digunakan sebagai cache file. Hingga 208 MB RAM ini dapat dirilis secara otomatis sesuai permintaan jika aplikasi membutuhkannya.

Sekarang mari kita lihat proses penggunaan memori. Jika Anda menggunakan opsi -Z dengan prstat, itu menunjukkan ringkasan per zona di bawah statistik per proses. Di sini zona global (dan satu-satunya) menggunakan 185 MB RAM. Ini harus (kira-kira) cocok dengan jumlah semua proses rss kolom.

# 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

185 MB ini sesuai dengan jumlah dua baris dalam keluaran memstat: "Anon" yang merupakan RAM yang digunakan oleh aplikasi untuk menyimpan data dan "Exec and libs" yang merupakan aplikasi dan kode pustaka mereka.

Jlliagre
sumber
Terima kasih atas tanggapan Anda juga, hasil perintahnya tidak terlalu rinci, tetapi ada yang perlu untuk melihat apa yang menggunakan RAM.
Jeremy C.
Bisakah Anda menambahkan hasilnya dengan memperbarui pertanyaan Anda? Omong-omong, jawaban yang Anda terima sebenarnya sedikit salah karena halaman yang tidak dipetakan dilaporkan sebagai RAM gratis oleh Solaris, bukan seperti yang digunakan yang merupakan masalah yang Anda keluhkan.
jlliagre
Pertanyaan diedit dengan hasil perintah. Anda benar, pertanyaan saya tidak dijawab sepenuhnya. Setidaknya kita dapat melihat bahwa memori bebas sama dengan top dan vmstat daripada dengan :: memstat . Tetapi apakah ada maksud untuk merinci apa yang terjadi pada setiap proses?
Jeremy C.
Pembaruan Solaris 10 apa yang Anda gunakan (cat / etc / release) dan apakah Anda menggunakan ZFS?
jlliagre
itu adalah Solaris 10 5/09, dan ya saya menggunakan ZFS
Jeremy C.
4

Memori diisi dengan halaman data yang belum dipetakan dibaca dari disk. Itu disimpan dalam memori karena file-file itu dapat dibaca lagi dan menyimpan data dalam memori menghemat disk baca. Memori bebas selamanya terbuang sia-sia, jadi komputer mencoba menyimpannya sesedikit mungkin.

Misalnya, Anda menjalankan program. Program berakhir. Program ini masih dalam memori, tetapi halaman memori tersebut tidak digunakan oleh proses apa pun karena program tidak berjalan. Jika sistem tidak berada di bawah tekanan memori, halaman disimpan dalam memori. Jika program berjalan lagi, ini akan menghemat upaya membuatnya cuma harus mengalokasikan lebih banyak memori untuk program dan kemudian membacanya lagi. Dan jika halaman dibutuhkan untuk sesuatu yang lain, itu masih merupakan kemenangan bagi sistem karena lebih mudah untuk memindahkan halaman memori langsung dari penggunaan ke yang lain daripada membuatnya gratis hanya untuk membuatnya digunakan lagi.

Memori bukan sumber daya yang dapat disimpan. Jika Anda membiarkan 1GB gratis selama satu jam, apa pun yang dapat Anda lakukan dengan data itu akan hilang selamanya.

David Schwartz
sumber
Terima kasih atas jawaban yang dijelaskan dengan baik ini. Saya mengerti sekarang mengapa semua server Solaris saya menggunakan kurang lebih 90% RAM.
Jeremy C.