Bagaimana penggunaan memori dilaporkan di Linux?

17

Dengan menggunakan ps, saya bisa melihat ukurannya, ukurannya (sama dengan VIRT top?), Dan rss (sama dengan RES top?). (Satu lagi yang saya lihat di atas adalah SHR.)

Bisakah seseorang meringkas bagi saya apa arti bidang-bidang yang berbeda ini?

Jim Hunziker
sumber
Saya lebih suka melihat ringkasan yang bagus di halaman ini daripada tautan yang mungkin hilang sehingga halaman ini dapat hidup sebagai referensi.
Jim Hunziker

Jawaban:

34

Pendeknya:

  • Ukuran virtual: adalah jumlah ruang alamat yang dikelola oleh suatu proses. Ruang alamat virtual berisi segala sesuatu yang dapat diakses oleh proses melalui pointer (referensi alamat memori). Misalnya, jika program Anda mendapatkan akses ke framebuffer dari kartu video Anda, memori itu dipetakan ke ruang virtual proses dan menerima alamat yang disimpan ke sebuah pointer. File yang dipetakan dengan memori dan pemetaan anonim juga dicatat ke dalam ukuran ruang alamat virtual. Cukup banyak semuanya dalam ukuran virtual. Jika Anda menjumlahkan ukuran semua rentang alamat yang tercantum /proc/<pid>/maps, itu akan mengembalikan Anda kira-kira nilai yang sama dari ukuran virtual.

  • Ukuran penduduk: adalah jumlah memori yang dimiliki khusus untuk proses yang saat ini ada di memori. Itu artinya, jumlah memori yang tidak di swap. Perhatikan bahwa bagian-bagian dari proses dapat di swap memori bahkan ketika proses sedang berjalan. Sistem operasi akan menarik daerah-daerah ini dari swap ketika proses mencoba mengaksesnya. Ini harus mencakup tumpukan, tumpukan semua utas dan pemetaan pribadi lainnya. Jika Anda melihat ke dalam /proc/<pid>/maps, pemetaan [stack], [heap]dan anonim lainnya (yang tanpa jalur file) ditukar atau diperhitungkan dalam ukuran penduduk.

  • Ukuran bersama: adalah jumlah memori yang mungkin dimiliki beberapa proses. Misalnya, jika Anda memiliki empat contoh aplikasi yang sama dimuat dalam memori, Anda akan memiliki empat contoh tumpukan dan setidaknya empat tumpukan, satu untuk setiap proses (ini adalah memori penduduk), tetapi Anda hanya akan memiliki satu contoh dari kode biner dari program dan perpustakaannya. Ini adalah ruang bersama. Tidak hanya itu termasuk kode biner program dan perpustakaannya, tetapi juga file pelokalan, data program baca-saja, SysV dan POSIX segmen memori bersama, semaphores, dll ... Jika Anda melihat /proc/<pid>/maps, sebagian besar pemetaan terkait dengan perpustakaan dan file program adalah bersama.

Perhatikan bahwa VIRT berisi penyatuan RSS dan SHR, dan akan selalu lebih besar daripada salah satunya. Mungkin ada daerah yang dianggap sebagai RSS dan SHR.

Juliano
sumber
2
Kebetulan, pada versi linux terbaru Anda dapat melihat rincian penggunaan memori yang sangat terperinci di / proc / <pid> / smaps
bdonlan
1
Ukuran bersama adalah memori yang dapat dibagikan. Jika aplikasi adalah satu-satunya pengguna perpustakaan, perpustakaan akan disimpan dalam memori dengan proses tunggal. Dengan cara ini, bahkan memori bersama dapat "memproses memori" yang dimiliki.
Hubert Kario
6

Dalam jawaban Juliano:

Perhatikan bahwa RSS + SHR <= VIRT, selalu.

Ini salah. SHR berisi semua memori virtual yang dapat dibagikan dengan proses lain, dan RSS berisi semua memori secara fisik dalam RAM yang digunakan oleh proses.

Jadi semua memori bersama yang saat ini dalam RAM dihitung baik dalam SHR dan dalam RSS, jadi SHR + RSS tidak memiliki arti karena dapat berisi jumlah duplikat.

Untuk membangun proses dengan RSS + SHR> VIRT, cukup mmap file besar (1GB), lalu bacalah sepenuhnya: file mmaped akan dimuat dalam RAM, dan VIRT, SHR dan RSS masing-masing akan sedikit lebih besar dari 1GB, jadi SHR + RSS> VIRT.

Anonim
sumber
Ya, itu lebih merupakan pernyataan tentang VIRT daripada dua lainnya. Apa yang ada dalam pikiran saya lebih tentang penyatuan RSS dan SHR daripada jumlah mereka, yaitu VIRT mengandung RSS dan SHR. Representasi matematika yang buruk.
Juliano