让busybox里的free命令可以显示page cache

原创 2012年03月26日 21:05:14

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),



Busybox中的free命令

busybox free命令,Linux kernel sysinfo
  • voice_shen
  • voice_shen
  • 2014年04月21日 21:53
  • 2985

让busybox里的free命令可以显示page cache

busybox的free命令不能显示page cache,导致于其功能大打折扣,因为page cache大小很大,在用户申请内存时可以回收,打上如下补丁后,busybox的free命令变得完整: c...
  • 21cnbao
  • 21cnbao
  • 2012年03月26日 21:05
  • 5446

BusyBox for Linux,FreeBSD,UNIX

  • 2011年05月01日 21:06
  • 612KB
  • 下载

free命令结果分析(buffer与cache区别)

原文出处:http://www.cnblogs.com/net2012/archive/2013/01/18/2866907.html 先复制过来,稍后作排版 一、free命令 [root@xen...
  • sieg_k
  • sieg_k
  • 2015年02月07日 19:27
  • 810

Free命令详解 linux Cache详解

因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以增加文件以及的读写速度。 先说下free命令怎么看内存 [root@yuyii proc]...
  • hzhsan
  • hzhsan
  • 2013年07月23日 16:45
  • 1278

关于Busybox镜像

一 简介Busybox是一个集成了一百多个最常用Linux命令和工具的软件工具箱,它在单一的可执行文件中提供了精简的Unix工具集。BusyBox可运行于多款POSIX环境操作系统中,如Linux(包...
  • chengqiuming
  • chengqiuming
  • 2018年02月11日 22:04
  • 20

BusyBox 官网 Frequently Asked Questions

http://www.busybox.net/FAQ.html#whatis ------------------------------------------------------------...
  • Buaaroid
  • Buaaroid
  • 2015年05月31日 14:35
  • 1005

linux free命令中buffer和cache的区别

[root@linuxso.com ~]#free -m            total    used   free   shared    buffers   cached Mem: 503...
  • grantlee1988
  • grantlee1988
  • 2012年06月25日 22:10
  • 1783

Linux的cached和pagecache清除 解决缓存、内存不足、测试结果影响问题

最近做的一个NLP文本处理组件的项目中用到了apache的Lucene,在后来的性能测试过程中,关键词、相似文章推荐功能的性能指标应该随着文章数量(索引规模)的增大而下降,但是在拿到的测试数据中,却正...
  • pengo_c
  • pengo_c
  • 2014年09月02日 16:37
  • 2872

busybox telnetd: can't find free pty

1、内核选项: CONFIG_UNIX98_PTYS=y CONFIG_DEVPTS_MULTIPLE_INSTANCES=y  2、busybox选项: CONFIG_FEATURE...
  • wanghelou123
  • wanghelou123
  • 2017年11月03日 13:33
  • 70
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让busybox里的free命令可以显示page cache
举报原因:
原因补充:

(最多只允许输入30个字)