File/alat standar yang melaporkan memori tampaknya memiliki format yang 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 secara portabel (hanya di seluruh distro Linux) dan dengan andal mendapatkan jumlah memori—tidak termasuk swap—yang tersedia untuk perangkat lunak saya untuk digunakan pada waktu tertentu? Agaknya itulah yang ditampilkan sebagai "tersedia" dan "MemAvailable" pada output free
dan cat /proc/meminfo
di Arch tetapi bagaimana cara mendapatkan yang sama di Ubuntu atau distribusi lain?
Jawaban yang Diterima:
MemAvailable
termasuk dalam /proc/meminfo
sejak kernel versi 3.14; itu ditambahkan oleh komit 34e431b0a. Itulah faktor penentu dalam variasi output yang Anda tampilkan. Pesan komit menunjukkan cara memperkirakan memori yang tersedia tanpa MemAvailable
:
Saat ini, jumlah memori yang tersedia untuk beban kerja baru, tanpa mendorong sistem ke swap, dapat diperkirakan dari
MemFree
,Active(file)
,Inactive(file)
, danSReclaimable
, serta tanda air “rendah” dari/proc/zoneinfo
.
Tanda air rendah adalah tingkat di mana sistem akan bertukar. Jadi dengan tidak adanya MemAvailable
Anda setidaknya dapat menjumlahkan nilai yang diberikan untuk MemFree
, Active(file)
, Inactive(file)
dan SReclaimable
(mana saja yang ada di /proc/meminfo
), dan kurangi tanda air rendah dari /proc/zoneinfo
. Yang terakhir ini juga mencantumkan jumlah halaman gratis per zona, yang mungkin berguna sebagai perbandingan…
Algoritme lengkap diberikan dalam tambalan ke meminfo.c
dan tampaknya cukup mudah untuk beradaptasi:
- jumlahkan tanda air rendah di semua zona;
- ambil memori bebas yang teridentifikasi (
MemFree
); - kurangi tanda air rendah (kita harus menghindari menyentuhnya untuk menghindari pertukaran);
- tambahkan jumlah memori yang dapat kita gunakan dari cache halaman (jumlah
Active(file)
danInactive(file)
):itulah jumlah memori yang digunakan oleh cache halaman, dikurangi setengah cache halaman, atau tanda air rendah, mana saja yang lebih kecil; - tambahkan jumlah memori yang dapat kita ambil kembali (
SReclaimable
), mengikuti algoritme yang sama.
Jadi, dengan menggabungkan semua ini, Anda bisa mendapatkan memori yang tersedia untuk proses baru dengan:
awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}')
'{a[$1]=$2}
END{
print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low);
}' /proc/meminfo