Saya agak bingung pada beberapa hasil yang saya lihat dari ps dan gratis .
Di server saya, ini adalah hasil dari free -m
[root@server ~]# free -m
total used free shared buffers cached
Mem: 2048 2033 14 0 73 1398
-/+ buffers/cache: 561 1486
Swap: 2047 11 2036
Pemahaman saya tentang bagaimana Linux mengelola memori, adalah bahwa ia akan menyimpan penggunaan disk dalam RAM, sehingga setiap akses selanjutnya lebih cepat. Saya percaya ini ditunjukkan oleh kolom "cache". Selain itu, berbagai buffer disimpan dalam RAM, ditunjukkan di kolom "buffer".
Jadi jika saya mengerti dengan benar, penggunaan "aktual" seharusnya menjadi nilai "bekas" dari "- / + buffer / cache", atau 561 dalam hal ini.
Jadi dengan asumsi semua itu benar, bagian yang melempar saya adalah hasil ps aux
.
Pemahaman saya tentang ps
hasilnya, adalah bahwa kolom ke-6 (RSS), mewakili ukuran dalam kilobyte yang digunakan proses untuk memori.
Jadi ketika saya menjalankan perintah ini:
[root@server ~]# ps aux | awk '{sum+=$6} END {print sum / 1024}'
1475.52
Bukankah seharusnya hasilnya berupa kolom "bekas" "- / + buffer / cache" dari free -m
?
Jadi, bagaimana saya bisa menentukan dengan benar penggunaan memori dari suatu proses di Linux? Rupanya logika saya cacat.
htop
penulis untuk satu pertanyaan serupa yang saya milikiJawaban:
Ini sebenarnya pertanyaan yang sama diminta pada serverfault hanya beberapa hari :-)
Sistem memori virtual linux tidak begitu sederhana. Anda tidak bisa menambahkan semua kolom RSS dan mendapatkan nilai yang dilaporkan
used
olehfree
. Ada banyak alasan untuk ini, tetapi saya akan menemukan beberapa alasan terbesar.Ketika sebuah proses bercabang, baik orang tua dan anak akan ditampilkan dengan RSS yang sama. Namun linux mempekerjakan
copy-on-write
sehingga kedua proses tersebut benar-benar menggunakan memori yang sama. Hanya ketika salah satu proses memodifikasi memori yang akan benar-benar diduplikasi. Jadi ini akan menyebabkanfree
jumlahnya lebih kecil daritop
jumlah RSS.Nilai RSS tidak termasuk memori bersama. Karena memori bersama tidak dimiliki oleh satu proses apa pun,
top
tidak termasuk dalam RSS. Jadi ini akan menyebabkanfree
jumlahnya menjadi lebih besar daritop
jumlah RSS.sumber
shmget
ataummap
. Kata-kata di sekitar hal-hal memori sangat rumit. Menggunakan kata yang salah di tempat yang salah dapat benar-benar mengacaukan makna kalimat.Jika Anda mencari nomor memori yang bertambah, lihatlah smem :
Sebagai contoh di sini:
Begitu
PSS
juga kolom yang menarik di sini karena mengambil memori bersama ke akun.Tidak seperti
RSS
itu berarti menambahkannya. Kami mendapatkan total 654Mb untuk proses userland di sini.Output seluruh sistem memberi tahu tentang sisanya:
Jadi 1Gb RAM Total = 654Mb proses userland + 346Mb kernel mem + 16MB bebas
(memberi atau mengambil beberapa Mb)
Secara keseluruhan sekitar setengah dari memori digunakan untuk cache (494Mb).
Pertanyaan bonus : apakah cache userland vs cache kernel di sini?
btw untuk sesuatu yang coba visual:
sumber
Alat yang sangat bagus adalah
pmap
yang mencantumkan penggunaan memori saat ini untuk proses tertentu:Untuk informasi lebih lanjut tentang hal ini, lihat halaman manual
man pmap
dan lihatlah di 20 Alat Pemantau Sistem Linux yang Harus Diketahui Setiap SysAdmin , yang berisi daftar alat hebat yang selalu saya gunakan untuk mendapatkan informasi tentang kotak Linux saya.sumber
free
memberitahu Anda.pmap -x PID
juga termasuk kolom RSS yang sering sangat berguna untuk mendapatkan ide dari mana RSS jumlah suatu proses (seperti yang diamati misalnya viatop
berasal dari).Jalankan atas, tekan
h
untuk bantuan laluf
tambahkan bidang. Anda dapat menambahkan bidang-bidang berikut:RSS
jumlah memori fisik yang digunakan aplikasiCODE
jumlah total memori yang dapat dieksekusi kode prosesDATA
- jumlah total memori (kb) yang didedikasikan untuk data dan tumpukan prosesAntara 3 ini Anda harus memiliki hasil yang cukup akurat. Anda juga dapat menggunakan penggantian yang lebih rinci untuk bagian atas yang saya sarankan
htop
atauatop
.Sunting: Hampir lupa jika Anda ingin informasi yang sangat terperinci. Temukan PID dan cat file berikut.
PID=123
cat /proc/123/status
Sunting 2: Jika Anda dapat menemukannya atau memilikinya buku:
-memiliki bagian Bab 5: Alat Kinerja: Memori Khusus-Proses-ini memiliki informasi yang jauh lebih banyak daripada yang Anda inginkan.
sumber
ps
memberi Anda jumlah memori yang digunakan oleh setiap proses. Sebagian dari memori itu adalah file mmapped, yang diperhitungkan dalam cache. Sebagian dari memori itu (terutama kode) dibagikan dengan proses lain, jadi jika Anda menambahkan nilai RSS, itu dihitung beberapa kali.Tidak ada jawaban yang tepat untuk "berapa banyak memori yang digunakan proses ini?", Karena tidak tergantung pada proses saja, itu juga tergantung pada lingkungan. Ada banyak nilai yang berbeda yang Anda sebut "penggunaan memori" dari proses, dan mereka tidak cocok atau bertambah karena mereka menghitung hal yang berbeda.
sumber
Seperti yang orang lain tunjukkan dengan benar, sulit untuk menangani memori aktual yang digunakan oleh suatu proses, apa dengan daerah yang dibagikan, dan file mmap'ed dan yang lainnya.
Jika Anda seorang eksperimen, Anda dapat menjalankan valgrind dan massif . Ini mungkin menjadi agak berat bagi pengguna biasa tetapi Anda akan mendapatkan gagasan tentang perilaku memori aplikasi dari waktu ke waktu. Jika sebuah aplikasi malloc () adalah persis apa yang dibutuhkannya maka ini akan memberi Anda representasi yang baik dari penggunaan memori dinamis nyata dari suatu proses. Tapi percobaan ini bisa "diracuni".
Untuk memperumit masalah, Linux memungkinkan Anda untuk membuat terlalu banyak ingatan. Saat Anda malloc () memori, Anda menyatakan niat Anda untuk mengkonsumsi memori. Tetapi alokasi tidak benar-benar terjadi sampai Anda menulis byte ke halaman baru dari "RAM" yang dialokasikan. Anda dapat membuktikan ini pada diri sendiri dengan menulis dan menjalankan program C kecil seperti:
Jalankan ini pada mesin dengan kurang dari 16GB RAM dan, voila !, Anda baru saja mencetak 16GB memori! (tidak terlalu).
Perhatikan bahwa
top
Anda melihat "VIRT" sebagai 16,004G tetapi% MEM adalah 0,0Jalankan ini lagi dengan valgrind:
Dan massif mengatakan "jumlah semua allocs () = 16GB". Jadi itu tidak terlalu menarik.
TAPI, jika Anda menjalankannya pada proses yang waras :
Dan di sini kita melihat (sangat empiris dan dengan keyakinan sangat tinggi) bahwa kompiler mengalokasikan 77KB tumpukan.
Mengapa berusaha sangat keras untuk mendapatkan hanya tumpukan penggunaan? Karena semua objek dan bagian teks yang digunakan bersama oleh suatu proses (dalam contoh ini, kompiler) tidak terlalu menarik. Mereka overhead konstan untuk suatu proses. Bahkan, doa selanjutnya dari proses tersebut hampir datang secara "gratis".
Juga, bandingkan dan kontraskan yang berikut ini:
MMAP () file 1GB. VMSize Anda akan menjadi 1 + GB. Tapi Anda Resident Set Size hanya akan menjadi bagian dari file yang Anda paging (dengan mendereferensi pointer ke wilayah itu). Dan jika Anda "membaca" seluruh file kemudian, pada saat Anda sampai di akhir, kernel mungkin sudah membuka awal (ini mudah dilakukan karena kernel tahu persis bagaimana / di mana untuk mengganti halaman-halaman itu jika direferensi lagi ). Dalam kedua kasus tersebut, baik VMSize maupun RSS bukanlah indikator yang baik untuk "penggunaan" memori Anda. Anda belum benar-benar malloc () melakukan sesuatu.
Sebaliknya, Malloc () dan sentuh LOTS memori - hingga memori Anda ditukar ke disk. Jadi memori yang dialokasikan sekarang melebihi RSS Anda. Di sini, VMSize Anda mungkin mulai memberi tahu Anda sesuatu (proses Anda memiliki lebih banyak memori daripada yang sebenarnya tersimpan di RAM Anda). Tetapi masih sulit untuk membedakan antara VM yang berbagi halaman dan VM yang bertukar data.
Di sinilah valgrind / massif menjadi menarik. Ini menunjukkan kepada Anda apa yang telah Anda alokasikan dengan sengaja (terlepas dari keadaan halaman Anda).
sumber
Coba ini: ini akan memberi Anda total RAM yang benar-benar digunakan oleh semua proses yang berjalan dalam MB
sumber
size
dilansirps
memiliki sedikit hubungan dengan penggunaan memori yang sebenarnya. Ini adalah ukuran virtual dari setiap proses yang tidak perlu dialokasikan memori. Itu juga tidak termasuk beberapa segmen yang dialokasikan.Ini akan menunjukkan kepada Anda berapa banyak pengguna memori oleh pengguna ..
sumber
Gunakan perintah ini untuk menemukan pemanfaatan memori dalam%.
Memori yang digunakan:
memori bebas
sumber
grep
hanya akan duduk di sana menunggu input.free -m | grep Mem | awk '{print $3/$2 * 100.0}'