Penggunaan memori aktual dari suatu proses

20

Berikut ini adalah penggunaan memori mysqldan apachemasing - masing di server saya. Sesuai output pmapkatakanlah, mysqlmenggunakan sekitar 379M dan apachemenggunakan 277M.

[root@server ~]# pmap 10436 | grep total
 total           379564K

[root@server ~]# pmap 10515 | grep total
 total           277588K

Membandingkan ini dengan output dari top, saya melihat nilai hampir cocok.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10515 apache    20   0  271m  32m 3132 S  0.0  6.6   0:00.73 /usr/sbin/httpd
10436 mysql     20   0  370m  21m 6188 S  0.0  4.3   0:06.07 /usr/libexec/mysqld --basedir=....

Sekarang nilai-nilai ini jelas bukan penggunaan memori saat ini dari dua proses, karena jika itu sudah melebihi 512M rampada sistem saya dan saya mengerti fakta bahwa ini adalah ukuran halaman yang ditugaskan untuk dua proses ini dan tidak benar-benar ukuran memori yang aktif digunakan oleh mereka. Sekarang, ketika kita gunakan pmap -x, saya melihat kolom tambahan Dirtyyang menunjukkan penggunaan memori jauh lebih sedikit untuk proses tersebut. Seperti yang terlihat pada contoh di bawah ini, Dirtykolom menunjukkan 15M sebagai lawan dari 379M di kolom pertama. Pertanyaan saya adalah: Apakah nilai di bawah kolom Dirtyadalah jumlah memori 'nyata' yang digunakan secara aktif oleh proses itu? Jika tidak, lalu bagaimana kita bisa mengetahui penggunaan memori nyata dari suatu proses? Tidak psdan topuntuk alasan yang sama di atas. Apakah kita punya sesuatu di bawah/proc yang akan memberikan info ini?

[root@server ~]# pmap -x 10436 | grep total
total kB          379564   21528   15340
[root@server ~]#


[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           489        447         41          0         52        214
-/+ buffers/cache:        180        308
Swap:         1023          0       1023
[root@server ~]#
Sree
sumber

Jawaban:

18

Tidak ada perintah yang memberikan "penggunaan memori aktual dari suatu proses" karena tidak ada yang namanya penggunaan memori aktual dari suatu proses .

Setiap halaman memori dari suatu proses dapat berupa (di antara perbedaan lainnya):

  • Penyimpanan sementara digunakan oleh proses itu sendiri.
  • Dibagikan dengan proses lain menggunakan berbagai mekanisme.
  • Didukung oleh file disk.
  • Dalam memori fisik atau swap.

Saya pikir angka "kotor" menambahkan semua yang ada dalam RAM (bukan swap) dan tidak didukung oleh file. Ini termasuk memori yang dibagikan dan yang tidak dibagikan (meskipun dalam kebanyakan kasus selain dari forking server, memori bersama hanya terdiri dari file yang dipetakan memori).

Informasi yang ditampilkan oleh pmapberasal dari dan . Itu adalah penggunaan memori nyata dari proses - tidak dapat diringkas dengan satu nomor./proc/PID/maps/proc/PID/smaps

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6

Saya akan mengutip sesuatu yang saya tulis di halaman manual untuk aplikasi yang melakukan analisis yang mirip dengan top dan menggambar informasi dari sumber yang sama seperti pmap(misalnya /proc/[N]/maps):

RUANG ALAMAT VIRTUAL VS. INGATAN FISIK

Penting untuk memahami perbedaan antara ruang alamat virtual dan memori fisik dalam menafsirkan beberapa statistik di atas. Seperti namanya, ruang alamat virtual tidak nyata; pada dasarnya ini adalah peta dari semua memori yang saat ini dialokasikan untuk suatu proses. Batas ukuran peta ini sama untuk setiap proses (umumnya, 2-4 GB), dan tidak terakumulasi (yaitu, Anda mungkin memiliki lusinan atau ratusan proses, masing-masing dengan alamat virtual 2-4 GB sendiri ruang, pada sistem yang hanya benar-benar memiliki memori fisik 512 MB ).

Data sebenarnya tidak dapat disimpan atau diambil dari ruang alamat virtual; data nyata membutuhkan memori fisik nyata. Adalah tugas kernel untuk mengelola satu terkait dengan yang lain. Statistik ruang virtual (VirtualSz, Data + Stack, dan Priv & Write) berguna untuk mempertimbangkan struktur suatu proses dan hubungannya dengan penggunaan memori fisik, tetapi berkenaan dengan jumlah RAM yang sebenarnya digunakan, statistik memori fisik (ResidentSz, Share, dan Proporsi) adalah yang terpenting.

pmapsebagian besar melaporkan kepada Anda informasi tentang ruang alamat virtual . Pengamatan Anda bahwa "nilai hampir cocok" dalam topoutput mungkin mengacu pada angka VIRT, yang sangat berbeda dari angka RES. Ini sesuai persis dengan apa yang saya sebutkan di atas "VirtualSz" dan "ResidentSz" (VIRT adalah untuk virtual, RES adalah untuk penduduk).

Sekarang, ketika kita menggunakan pmap -x, saya melihat Kolom Kotor tambahan yang menunjukkan penggunaan memori jauh lebih sedikit untuk proses tersebut. Seperti terlihat pada contoh di bawah ini, kolom Kotor menunjukkan 15M sebagai lawan dari 379M di kolom pertama. Pertanyaan saya adalah: Apakah nilai di bawah Kolom Kotor adalah jumlah memori 'nyata' yang digunakan secara aktif oleh proses itu?

Tidak, tapi semacam. Memori "Kotor" mengacu pada data yang telah dimuat dari disk dan kemudian dimodifikasi; karena telah dimodifikasi, itu harus menjadi bagian dari memori penduduk karena perubahan ini saat ini disimpan dalam RAM. Namun, itu tidak identik dengan itu.

goldilocks
sumber
Saya setuju. Namun 2 hingga 4GB adalah untuk sistem 32 bit. Sebagian besar sistem saat ini mungkin 64bit.
ctrl-alt-delor
3

Memori virtual seperti nomor panggilan cepat, kecuali ada sekitar 3 miliar atau mereka (untuk sistem 32 bit, aplikasi 4 miliar untuk 32 bit pada kernel 64bit, lebih banyak untuk aplikasi 64 bit), dan Anda tidak dapat memanggil nomor langsung, mereka memiliki dipetakan ke panggilan cepat.

Beberapa proses dapat memiliki pemetaan yang berbeda (nomor panggilan cepat) untuk alamat yang sama (nomor telepon). Misalnya mereka dapat berbagi beberapa pustaka, sehingga memiliki alamat virtual untuk seluruh pustaka (Anda dapat melihatnya di pmap). Mereka bahkan dapat berbagi executable yang sama misalnya 2 instance bash.

Sejauh ini ini menjelaskan bagaimana sub dari semua alamat virtual dapat ditampung, tetapi ada lebih banyak. Satu proses dapat memiliki begitu banyak memori virtual yang seharusnya tidak pas, bagaimana? Beberapa bagian dari pustaka, atau yang dapat dieksekusi tidak dapat digunakan, mereka tidak akan disalin dari disk ke ram, atau ram penuh dan bit yang diambil dari disk dijatuhkan, karena mereka dapat diambil kembali dari disk jika diperlukan, atau memori yang tidak didukung disk saya dipetakan untuk bertukar, disalin untuk bertukar dan kemudian dijatuhkan. Kemudian dapat dibaca dari swap jika dan ketika dibutuhkan. Jika salah satu dari strategi terakhir ini digunakan terlalu banyak maka sistem menjadi lambat.

ctrl-alt-delor
sumber