Mendapatkan informasi tentang penggunaan memori proses dari / proc / pid / smaps

46

Untuk proses tertentu dalam /proc/<pid>/smaps, untuk entri pemetaan tertentu apa itu:

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

Apakah Shared_Clean+ Shared_Dirtyjumlah memori yang dibagikan dengan proses lain? Jadi itu seperti berbagi RSS?

Demikian pula Private_Clean+ Private_Dirtyjumlah memori yang tersedia hanya untuk satu proses ? Jadi itu seperti RSS pribadi?

Apakah nilai PSS = PrivateRSS + (SharedRSS / jumlah proses membagikannya)?

Beberapa pertanyaan lagi setelah membaca tautan ini: LWN

Sekarang mari kita bicara tentang proses secara keseluruhan, yang entri masuknya kita lihat.

Saya perhatikan bahwa jika saya melakukan Shared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirtyuntuk setiap entri yang jelas untuk proses tersebut, saya mendapatkan RSS proses seperti yang dilaporkan oleh ps, yang cukup keren. Untuk misalnya

ps -p $$ -o pid,rss

Akan memberikan saya (kira-kira) nilai yang sama untuk rss sebagai jumlah dari setiap Shared_Clean, Shared_Dirty, Private_Clean, Private_Dirtyentri 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 smaps dan tiba di PSS untuk $$?

Dan bagaimana dengan USS untuk seluruh proses? Sekali lagi mengambil contoh di atas saya menduga bahwa saya dapat tiba di USS untuk $$ dengan meringkas hanya entri Private_ * untuk setiap entri smaps untuk $$ .. kan?

Catatan:
PSS = Ukuran set proporsional.
USS = Ukuran set unik.

Ankur Agarwal
sumber

Jawaban:

50

Halaman bersih adalah halaman yang belum dimodifikasi sejak dipetakan (biasanya, bagian teks dari pustaka bersama hanya dibaca dari disk (bila perlu), tidak pernah dimodifikasi, jadi halaman itu akan dibagikan, halaman 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 total halaman, dibagikan atau tidak, saat ini dipetakan ke dalam proses. Jadi Shared_Clean+ Shared_Dirtyakan menjadi bagian bersama dari RSS (yaitu bagian dari RSS yang juga dipetakan ke dalam proses lain), dan Private_Clean+ Private_Dirtybagian pribadi dari RSS (yaitu hanya dipetakan dalam proses ini).

PSS (ukuran share proporsional) seperti yang Anda gambarkan. Halaman pribadi diringkas apa adanya, dan ukuran setiap pemetaan bersama dibagi dengan jumlah proses yang membagikannya.
Jadi jika suatu proses memiliki 100k halaman pribadi, 500k halaman dibagi dengan satu proses lain, dan 500k berbagi dengan empat proses lainnya, PSS akan menjadi:

100k + (500k / 2) + (500k / 5) = 450k

Bacaan lebih lanjut:

Mengenai jumlah seluruh proses:

  • RSSdapat (sekitar + ) diperoleh dengan menjumlahkan Rss:entri smaps(Anda tidak perlu menambahkan entri bersama / pribadi bersama / kotor).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Anda dapat meringkas Pss:nilai dengan cara yang sama, untuk mendapatkan proses global PSS.
  • USStidak dilaporkan smaps, tetapi memang, itu adalah jumlah pemetaan pribadi, sehingga Anda dapat memperolehnya dengan cara yang sama juga

* Perhatikan bahwa halaman "dapat dibagikan" dihitung sebagai pemetaan pribadi hingga benar - benar dibagikan. yaitu jika hanya ada satu proses saat ini menggunakan libfoo, bagian teks perpustakaan itu akan muncul di pemetaan pribadi proses . Ini akan diperhitungkan dalam pemetaan bersama (dan dihapus dari yang pribadi) hanya jika / ketika proses lain mulai menggunakan perpustakaan itu.
+ Nilai tidak dijumlahkan dengan tepat untuk semua proses. Tidak yakin mengapa ... maaf.

Tikar
sumber
Terima kasih atas jawabannya. Menghargai itu. Saya membaca artikel LWM dan itu mengilhami saya mengajukan beberapa pertanyaan lagi, jadi saya menambahkannya ke pertanyaan saya di atas.
Ankur Agarwal
Bagus! ini sangat sangat membantu !!
camino
Saya masih bingung tentang shared_dirty - apakah sifat kotor ini mencegahnya dibagikan?
Kevin
@Kevin: jika mereka tidak dibagikan, mereka tidak akan diperhitungkan Shared_Dirty- bisakah Anda menjelaskan pertanyaan Anda?
Mat
kotor berarti dimodifikasi dari aslinya. proses, kan? yang tidak seperti itu bagaimana dari dibagikan menjadi lokal?
Kevin