Linux free命令先後變化和available內存

原創 宋寶華 Linux閱碼場 2018-01-28linux


老版的free命令長成這個樣子:git

Linux free命令先後變化和available內存
較新版本的Ubuntun、CentOS等中的free命令是這個樣子的:
Linux free命令先後變化和available內存app

主要的變化是buff/cache被合併爲一列,而且增長了available這一列。ide

available這一列的具體含義能夠參見內核的這個commit:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773this

天冷手凍,不詳細解釋和翻譯了,具體直接看英文:
Linux free命令先後變化和available內存spa

涉及到的代碼改動以下:翻譯

diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
index 22d89aa3..8533f5f 100644
--- a/Documentation/filesystems/proc.txt
+++ b/Documentation/filesystems/proc.txt
@@ -767,6 +767,7 @@ The "Locked" indicates whether the mapping is locked in memory or not.

 MemTotal:     16344972 kB
 MemFree:      13634064 kB
+MemAvailable: 14836172 kB
 Buffers:          3656 kB
 Cached:        1195708 kB
 SwapCached:          0 kB
@@ -799,6 +800,14 @@ AnonHugePages:   49152 kB
     MemTotal: Total usable ram (i.e. physical ram minus a few reserved
               bits and the kernel binary code)
      MemFree: The sum of LowFree+HighFree
+MemAvailable: An estimate of how much memory is available for starting new
+              applications, without swapping. Calculated from MemFree,
+              SReclaimable, the size of the file LRU lists, and the low
+              watermarks in each zone.
+              The estimate takes into account that the system needs some
+              page cache to function well, and that not all reclaimable
+              slab will be reclaimable, due to items being in use. The
+              impact of those factors will vary from system to system.
      Buffers: Relatively temporary storage for raw disk blocks
               shouldn't get tremendously large (20MB or so)
       Cached: in-memory cache for files read from the disk (the
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index a77d2b2..24270ec 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -26,7 +26,11 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
 unsigned long committed;
 struct vmalloc_info vmi;
 long cached;
+long available;
+unsigned long pagecache;
+unsigned long wmark_low = 0;
 unsigned long pages[NR_LRU_LISTS];
+struct zone *zone;
 int lru;

 /*
@@ -47,12 +51,44 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
 pages[lru] = global_page_state(NR_LRU_BASE + lru);

+for_each_zone(zone)
+wmark_low += zone->watermark[WMARK_LOW];
+
+/*
+ * Estimate the amount of memory available for userspace allocations,
+ * without causing swapping.
+ *
+ * Free memory cannot be taken below the low watermark, before the
+ * system starts swapping.
+ */
+available = i.freeram - wmark_low;
+
+/*
+ * Not all the page cache can be freed, otherwise the system will
+ * start swapping. Assume at least half of the page cache, or the
+ * low watermark worth of cache, needs to stay.
+ */
+pagecache = pages[LRU_ACTIVE_FILE] + pages[LRU_INACTIVE_FILE];
+pagecache -= min(pagecache / 2, wmark_low);
+available += pagecache;
+
+/*
+ * Part of the reclaimable swap consists of items that are in use,
+ * and cannot be freed. Cap this estimate at the low watermark.
+ */
+available += global_page_state(NR_SLAB_RECLAIMABLE) -
+     min(global_page_state(NR_SLAB_RECLAIMABLE) / 2, wmark_low);
+
+if (available < 0)
+available = 0;
+
 /*
  * Tagged format, for easy grepping and expansion.
  */
 seq_printf(m,
 "MemTotal:       %8lu kB\n"
 "MemFree:        %8lu kB\n"
+"MemAvailable:   %8lu kB\n"
 "Buffers:        %8lu kB\n"
 "Cached:         %8lu kB\n"
 "SwapCached:     %8lu kB\n"
@@ -105,6 +141,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
 ,
 K(i.totalram),
 K(i.freeram),
+K(available),
 K(i.bufferram),
 K(cached),
 K(total_swapcache_pages()),

另外,關於free命令裏面的cached、buffers的區別,下面一幅圖能夠表達:
Linux free命令先後變化和available內存3d

相關文章
相關標籤/搜索