[PATCH] free: add page cache information in free command
Barry Song
Barry.Song at csr.com
Mon Mar 26 05:51:03 UTC 2012
From: Barry Song <Baohua.Song at csr.com>
"-/+ buffers/cache" is much more useful than "-/+ buffers". page cache is
the main source reclaimed for new allocation. so showing the cache is more
important to users than only showing buffers.
this patch reads cache information from /proc/meminfo and make free command
full.
Signed-off-by: Barry Song <Baohua.Song at csr.com>
---
procps/free.c | 54 ++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 40 insertions(+), 14 deletions(-)
diff --git a/procps/free.c b/procps/free.c
index 47f2fc3..0b6a518 100644
--- a/procps/free.c
+++ b/procps/free.c
@@ -16,8 +16,8 @@
//usage:
//usage:#define free_example_usage
//usage: "$ free\n"
-//usage: " total used free shared buffers\n"
-//usage: " Mem: 257628 248724 8904 59644 93124\n"
+//usage: " total used free shared buffers cached\n"
+//usage: " Mem: 257628 248724 8904 59644 93124 102400\n"
//usage: " Swap: 128516 8404 120112\n"
//usage: "Total: 386144 257128 129016\n"
@@ -44,11 +44,35 @@ static unsigned long long scale(unsigned long d)
return ((unsigned long long)d * G.mem_unit) >> G_unit_steps;
}
+static unsigned long get_cache_from_meminfo(void)
+{
+#define LINE_LEN 256
+ FILE *fp;
+ char str[LINE_LEN];
+ unsigned long long cached;
+ if((fp = fopen("/proc/meminfo","rt")) == NULL) {
+ printf("Cantnot open /proc/meminfo");
+ exit(1);
+ }
+
+ while(1) {
+ fgets(str, LINE_LEN, fp);
+ if (!strncmp(str, "Cached:", strlen("Cached:")))
+ break;
+ }
+
+ cached = atoi(str + strlen("Cached:"));
+
+ fclose(fp);
+
+ return cached;
+}
int free_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int free_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
{
struct sysinfo info;
+ unsigned long long cached;
INIT_G();
@@ -75,43 +99,45 @@ int free_main(int argc UNUSED_PARAM, char **argv IF_NOT_DESKTOP(UNUSED_PARAM))
#endif
sysinfo(&info);
+ cached = get_cache_from_meminfo();
/* Kernels prior to 2.4.x will return info.mem_unit==0, so cope... */
G.mem_unit = (info.mem_unit ? info.mem_unit : 1);
- printf(" %13s%13s%13s%13s%13s\n",
+ printf(" %13s%13s%13s%13s%13s%13s\n",
"total",
"used",
"free",
- "shared", "buffers" /* swap and total don't have these columns */
+ "shared", "buffers", "cached" /* swap and total don't have these columns */
/* procps version 3.2.8 also shows "cached" column, but
* sysinfo() does not provide this value, need to parse
* /proc/meminfo instead and get "Cached: NNN kB" from there.
*/
);
-#define FIELDS_5 "%13llu%13llu%13llu%13llu%13llu\n"
-#define FIELDS_3 (FIELDS_5 + 2*6)
-#define FIELDS_2 (FIELDS_5 + 3*6)
+#define FIELDS_6 "%13llu%13llu%13llu%13llu%13llu%13llu\n"
+#define FIELDS_3 (FIELDS_6 + 3*6)
+#define FIELDS_2 (FIELDS_6 + 4*6)
- printf("Mem: ");
- printf(FIELDS_5,
+ printf("Mem: ");
+ printf(FIELDS_6,
scale(info.totalram),
scale(info.totalram - info.freeram),
scale(info.freeram),
scale(info.sharedram),
- scale(info.bufferram)
+ scale(info.bufferram),
+ scale(cached)
);
/* Show alternate, more meaningful busy/free numbers by counting
* buffer cache as free memory (make it "-/+ buffers/cache"
* if/when we add support for "cached" column): */
- printf("-/+ buffers: ");
+ printf("-/+ buffers/cached: ");
printf(FIELDS_2,
- scale(info.totalram - info.freeram - info.bufferram),
- scale(info.freeram + info.bufferram)
+ scale(info.totalram - info.freeram - info.bufferram - cached),
+ scale(info.freeram + info.bufferram + cached)
);
#if BB_MMU
- printf("Swap:");
+ printf("Swap: ");
printf(FIELDS_3,
scale(info.totalswap),
scale(info.totalswap - info.freeswap),
--
1.7.0.4
Member of the CSR plc group of companies. CSR plc registered in England and Wales, registered number 4187346, registered office Churchill House, Cambridge Business Park, Cowley Road, Cambridge, CB4 0WZ, United Kingdom
More information can be found at www.csr.com. Follow CSR on Twitter at http://twitter.com/CSR_PLC and read our blog at www.csr.com/blog
More information about the busybox
mailing list