Berikut ini adalah penggunaan memori mysql
dan apache
masing - masing di server saya. Sesuai output pmap
katakanlah, mysql
menggunakan sekitar 379M dan apache
menggunakan 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 ram
pada 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 Dirty
yang menunjukkan penggunaan memori jauh lebih sedikit untuk proses tersebut. Seperti yang terlihat pada contoh di bawah ini, Dirty
kolom menunjukkan 15M sebagai lawan dari 379M di kolom pertama. Pertanyaan saya adalah: Apakah nilai di bawah kolom Dirty
adalah jumlah memori 'nyata' yang digunakan secara aktif oleh proses itu? Jika tidak, lalu bagaimana kita bisa mengetahui penggunaan memori nyata dari suatu proses? Tidak ps
dan top
untuk 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 ~]#
sumber
Jawaban:
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):
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
pmap
berasal dari dan . Itu adalah penggunaan memori nyata dari proses - tidak dapat diringkas dengan satu nomor./proc/PID/maps
/proc/PID/smaps
sumber
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
):pmap
sebagian besar melaporkan kepada Anda informasi tentang ruang alamat virtual . Pengamatan Anda bahwa "nilai hampir cocok" dalamtop
output 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).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.
sumber
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.
sumber