Untuk proses tertentu di /proc/<pid>/smaps
, untuk entri pemetaan yang diberikan adalah:
- Bersama_Bersih
- Dibagi_Kotor
- Private_Clean
- Pribadi_Kotor
Apakah Shared_Clean
+ Shared_Dirty
jumlah memori yang digunakan bersama dengan proses lain? Jadi ini seperti RSS yang dibagikan?
Demikian pula Private_Clean
+ Private_Dirty
jumlah memori yang tersedia hanya untuk satu proses ? Jadi ini seperti RSS pribadi?
Apakah nilai PSS =PrivateRSS + (SharedRSS / jumlah proses yang membagikannya)?
Beberapa pertanyaan lagi setelah membaca tautan ini:LWN
Sekarang mari kita bicara tentang proses secara keseluruhan, yang entri petanya sedang kita lihat.
Saya perhatikan bahwa jika saya melakukan Shared_Clean
+ Shared_Dirty
+ Private_Clean
+ Private_Dirty
untuk setiap entri smaps untuk proses saya mendapatkan RSS dari proses tersebut seperti yang
dilaporkan oleh ps
, yang cukup keren. Untuk mis.
ps -p $$ -o pid,rss
Akan memberi saya (kira-kira) nilai yang sama untuk rss sebagai jumlah dari setiap Shared_Clean
, Shared_Dirty
, Private_Clean
, Private_Dirty
entri di /proc/$$/smaps.
Tapi bagaimana dengan PSS untuk seluruh proses? Jadi, dari contoh di atas bagaimana cara mendapatkan PSS untuk $$ ? Bisakah saya menambahkan entri PSS untuk setiap pemetaan peta dan tiba di PSS seharga $$?
Dan bagaimana dengan USS untuk seluruh proses? Sekali lagi mengambil contoh di atas saya menebak bahwa saya dapat tiba di USS untuk $$ dengan menjumlahkan hanya entri Private_* untuk setiap entri petas untuk $$..kan?
Catatan:
PSS=Ukuran set proporsional.
USS=Ukuran set unik.
Jawaban yang Diterima:
Halaman bersih adalah halaman yang belum dimodifikasi sejak dipetakan (biasanya, bagian teks dari pustaka bersama hanya dibaca dari disk (bila perlu), tidak pernah dimodifikasi, sehingga akan berada di halaman bersama yang bersih).
Halaman kotor adalah halaman yang tidak bersih (yaitu telah dimodifikasi).
Halaman pribadi hanya tersedia untuk proses itu, halaman bersama dipetakan oleh proses lain.
RSS adalah jumlah halaman, dibagikan atau tidak, saat ini dipetakan ke dalam proses. Jadi Shared_Clean
+ Shared_Dirty
akan menjadi bagian RSS yang dibagikan (yaitu bagian RSS yang juga dipetakan ke dalam proses lain), dan Private_Clean
+ Private_Dirty
bagian pribadi RSS (yaitu hanya dipetakan dalam proses ini).
PSS (ukuran saham proporsional) adalah seperti yang Anda gambarkan. Halaman pribadi diringkas apa adanya, dan setiap ukuran pemetaan bersama dibagi dengan jumlah proses yang membagikannya.
Jadi, jika suatu proses memiliki 100 ribu halaman pribadi, 500 ribu halaman dibagikan dengan satu proses lain, dan 500 ribu dibagikan dengan empat proses lainnya, PSS akan menjadi:
100k + (500k / 2) + (500k / 5) = 450k
Bacaan lebih lanjut:
- ELC:Berapa banyak memori yang benar-benar digunakan aplikasi?
Documentation/filesystems/proc.txt
di sumber kernelman proc(5)
- Ikhtisar Manajemen Memori Linux
- Manajemen Memori di TLDP.org
- LinuxMM
Mengenai jumlah seluruh proses:
-
RSS
dapat (kurang-lebih) diperoleh dengan menjumlahkanRss:
entri dismaps
(Anda tidak perlu menambahkan entri bersama/pribadi bersama/kotor).awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
- Anda dapat menyimpulkan
Pss:
nilai dengan cara yang sama, untuk mendapatkan proses-globalPSS
. USS
tidak dilaporkan dismaps
, tapi memang, ini adalah jumlah pemetaan pribadi, jadi Anda juga bisa mendapatkannya dengan cara yang sama
Perhatikan bahwa halaman yang “dapat dibagikan” dihitung sebagai pemetaan pribadi sampai benar-benar bersama. yaitu jika hanya ada satu proses yang saat ini menggunakan libfoo
, bagian teks perpustakaan itu akan muncul di pribadi process proses pemetaan. Ini akan diperhitungkan dalam pemetaan bersama (dan dihapus dari pemetaan pribadi) hanya jika/ketika proses lain mulai menggunakan perpustakaan itu.
Nilai tidak sama persis untuk semua proses. Tidak begitu yakin mengapa… maaf.