GNU/Linux >> Belajar Linux >  >> Linux

Linux – Bagaimana Mendapatkan Jumlah Memori Yang Tersedia Secara Portabel di Seluruh Distribusi?

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) , dan SReclaimable , 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) dan Inactive(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.
Terkait:Linux – Bagaimana cara membuat USB flash drive dapat ditulis di Linux??

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 

Linux
  1. Linux – Bagaimana Cara Mendapatkan Nama Sistem Operasi yang Andal?

  2. Bagaimana saya bisa mendapatkan daftar jaringan nirkabel yang tersedia di Linux?

  3. Bagaimana cara mendapatkan jumlah CPU di Linux menggunakan C?

  1. Bagaimana Mendapatkan Deskripsi Opsi `shopt` yang Tersedia?

  2. Bagaimana cara mendaftar proses yang dilampirkan ke segmen memori bersama di linux?

  3. Bagaimana cara mendapatkan jumlah disk fisik di Linux?

  1. Bagaimana cara mencatat konsumsi memori di Linux?

  2. Bagaimana saya bisa mendapatkan status keyboard di Linux?

  3. Bagaimana cara mendapatkan nama pengguna di C/C++ di Linux?