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 GB
memori, sementara sistem saya memiliki 16 GB
.
Mungkin saya melewatkan sesuatu yang lain, tetapi di mana yang lain 4 GB
?
sumber
kstat zfs::arcstats:size
keluaran ke pertanyaan Anda.Jawaban:
ZFS kemungkinan menggunakan sebagian besar memori Anda sebagai cache ARC. Jika Anda ingin tahu bagaimana RAM Anda digunakan, jalankan perintah ini sebagai root:
Pada Solaris 10 10/09 dan lebih baru, ini menampilkan sesuatu seperti ini:
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:
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.
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.
sumber
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.
sumber