busybox的free命令不能显示page cache,导致于其功能大打折扣,因为page cache大小很大,在用户申请内存时可以回收,打上如下补丁后,busybox的free命令变得完整:
commit 2219fd301a7f319258ad4be9217cd0d6db9240d4
Author: Barry Song <Baohua.Song@xxx.xxx>
Date: Mon Mar 26 11:47:10 2012 +0800
busybox: update free command to include page cache
eg.
sh-4.2$ free
total used free shared buffers cached
Mem: 402924 49232 353692 0 668 32160
-/+ buffers/cache: 16404 386520
Swap: 0 0 0
Change-Id: Ic9de9f8cd0051da8fd61ae8238a1d2573587223b
Signed-off-by: Barry Song <Baohua.Song@xxx.xxx>
diff --git a/procps/free.c b/procps/free.c
index efbac5b..6abf1e8 100644
--- a/procps/free.c
+++ b/procps/free.c
@@ -29,11 +29,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();
@@ -60,43 +84,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),
+ 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/cache: ");
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),