File / alat standar yang melaporkan memori tampaknya memiliki format berbeda pada distribusi Linux yang berbeda. Misalnya, di Arch dan Ubuntu.
Lengkungan
$ free total used free shared buff/cache available Mem: 8169312 3870392 2648348 97884 1650572 4110336 Swap: 16777212 389588 16387624 $ head /proc/meminfo MemTotal: 8169312 kB MemFree: 2625668 kB MemAvailable: 4088520 kB Buffers: 239688 kB Cached: 1224520 kB SwapCached: 17452 kB Active: 4074548 kB Inactive: 1035716 kB Active(anon): 3247948 kB Inactive(anon): 497684 kB
Ubuntu
$ free total used free shared buffers cached Mem: 80642828 69076080 11566748 3063796 150688 58358264 -/+ buffers/cache: 10567128 70075700 Swap: 20971516 5828472 15143044 $ head /proc/meminfo MemTotal: 80642828 kB MemFree: 11565936 kB Buffers: 150688 kB Cached: 58358264 kB SwapCached: 2173912 kB Active: 27305364 kB Inactive: 40004480 kB Active(anon): 7584320 kB Inactive(anon): 4280400 kB Active(file): 19721044 kB
Jadi, bagaimana saya bisa dibawa-bawa (hanya di distro Linux saja) dan secara andal mendapatkan jumlah memori — tidak termasuk swap — yang tersedia untuk digunakan oleh perangkat lunak saya pada waktu tertentu? Mungkin itulah yang ditampilkan sebagai "tersedia" dan "MemAvailable" di output free
dan cat /proc/meminfo
di Arch tetapi bagaimana cara mendapatkan yang sama di Ubuntu atau distribusi lain?
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') '{a[$1]=$2}END{m=a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]; print a["MemAvailable:"],m-low}' /proc/meminfo
yang seharusnya memberi saya nomor yang sama dicetak dua kali. Namun, angka kedua (pemahaman saya tentang algoritma yang Anda sarankan) lebih tinggi dari yangMemAvailable
ditunjukkan pada/proc/meminfo
. Apa yang saya lakukan salah?/proc/zoneinfo
menghitung halaman, yang sebagian besar berukuran 4KB aktifamd64
; Anda juga kehilangan keamanan tambahan yang ditambahkan ke cache halaman dan memori yang dapat diterima kembali. Menyederhanakan yang terakhir, kita dapat mengurangi tanda air rendah tiga kali, jadim-12*low
(3 × 4KB) memberikan hasil yang benar pada sistem saya. (Penyederhanaan ini meremehkan memori yang tersedia jika cache halaman atau memori yang dapat direklamasi lebih kecil dari dua kali tanda air rendah, tetapi Anda tetap tidak ingin menggunakan banyak memori dalam situasi itu sehingga tampaknya merupakan kompromi yang masuk akal.)(file)
entires atauSReclaimable
entri? Pada kotak centos yang lebih lama dengan kernel v 2.6.18-348.16.1.el5xen (peruname -r
) ini adalah output yang saya dapatkan: pastebin.com/iFWiM1kX . Perhitungan Anda hanya menarikMemFree
bagiannyaSementara jawaban Stephen cukup sempurna dan salah di sisi hati-hati, saya memutuskan untuk menulis logika lengkap termasuk perbandingan minimum. Informasi pertama kali dibaca dari / proc / meminfo dan disimpan dalam variabel sehingga detail memori konsisten.
Hasil yang disimpan dalam variabel adalah dalam byte.
sumber