GNU/Linux >> Znalost Linux >  >> Linux

Linux – Jak získat množství dostupné paměti přenositelně napříč distribucemi?

Zdá se, že standardní soubory/nástroje, které hlásí paměť, mají v různých distribucích Linuxu různé formáty. Například na Arch a Ubuntu.

  • Arch

    $ 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
    

Jak tedy mohu přenositelně (pouze v rámci linuxových distribucí) a spolehlivě získat množství paměti – s výjimkou swapu – kterou má můj software k dispozici pro použití v určitou dobu? Pravděpodobně je to to, co je ve výstupu free zobrazeno jako „dostupné“ a „MemAvailable“ a cat /proc/meminfo v Archu, ale jak dostanu totéž v Ubuntu nebo jiné distribuci?

Přijatá odpověď:

MemAvailable je součástí /proc/meminfo od verze 3.14 jádra; bylo přidáno commitem 34e431b0a. To je určující faktor ve výstupních variacích, které ukazujete. Zpráva odevzdání uvádí, jak odhadnout dostupnou paměť bez MemAvailable :

V současné době lze množství paměti, která je k dispozici pro novou zátěž, aniž by bylo nutné systém přepínat do swapu, odhadnout z MemFree , Active(file) , Inactive(file) a SReclaimable , stejně jako „nízké“ vodoznaky z /proc/zoneinfo .

Nízké vodoznaky jsou úrovní, pod kterou systém přehodí. Takže při absenci MemAvailable můžete alespoň sečíst hodnoty dané pro MemFree , Active(file) , Inactive(file) a SReclaimable (podle toho, které jsou uvedeny v /proc/meminfo ) a odečtěte spodní vodoznaky z /proc/zoneinfo . Ten také uvádí počet bezplatných stránek na zónu, což může být užitečné pro srovnání…

Kompletní algoritmus je uveden v patchi meminfo.c a zdá se být poměrně snadné se přizpůsobit:

  • sečíst nízké vodoznaky ve všech zónách;
  • vezměte identifikovanou volnou paměť (MemFree );
  • odečtěte nízký vodoznak (nemusíme se ho dotýkat, aby nedošlo k záměně);
  • přidejte množství paměti, kterou můžeme použít z mezipaměti stránky (součet Active(file) a Inactive(file) ):to je množství paměti, kterou využívá mezipaměť stránky, mínus buď polovina mezipaměti stránky, nebo nízký vodoznak, podle toho, která hodnota je menší;
  • přidejte množství paměti, kterou můžeme získat zpět (SReclaimable ), podle stejného algoritmu.
Související:Linux – Jak udělat z USB flash disku zapisovatelný v Linuxu?

Takže, když to všechno dáte dohromady, můžete získat paměť dostupnou pro nový proces pomocí:

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. Jak mohu získat seznam dostupných bezdrátových sítí v systému Linux?

  2. Jak zaznamenat spotřebu paměti v Linuxu?

  3. Jak mohu získat stav klávesnice v Linuxu?

  1. Jak získat počet CPU v Linuxu pomocí C?

  2. Jak vypsat seznam procesů připojených k segmentu sdílené paměti v linuxu?

  3. Jak získat uživatelské jméno v C/C++ v Linuxu?

  1. Jak získat počet fyzických disků v Linuxu?

  2. Jak mohu rezervovat blok paměti z jádra Linuxu?

  3. Jak získám upozornění na chyby ECC v Linuxu?