Hi,

Ok, so I did the work myself for those who are interested :

before :


            total       used       free     shared    buffers     cached
Mem:      33088172    9587560   23500612          0     921836    6832320
-/+ buffers/cache:    1833404   31254768
Swap:     33554424          0   33554424

after :

            total            used       free     shared    buffers
cached       slab
Mem:      33088172         9587684   23500488          0     921832
6832320    1660240
-/+ buffers/cache/slab:     173292   32914880
Swap:     33554424               0   33554424

this is more realistic, this server have nothing launched but sshd,
syslog, getty etc ..

Regards.

Nicolas

2010/1/18 Craig Small <csm...@debian.org>:
> tags 565518 upstream
> thankyou
> On Sun, Jan 17, 2010 at 11:28:19PM +0100, Nico wrote:
>> slab cache usage (after the find/updatedb with a scan of all the
>> filesystem). This kind of memory usage
>> does not reflect user point of view,
>> because as soon as a program request memory, slab cache is reduced and
>> this memory can be used for userspace programs.
> There is a lot of that going on, which is why its difficult to know in
> Linux what your "real" memory usage is.
>
>> Yes ! exact, that's what I am saying.
>> You can monitor slab usage in /proc/meminfo or with the "slabtop"
>> command, but "free" does not take into account
>> the slab cache.
> That would be due to the fact the kernel figures don't either.
>
>> I don't know what to do, the user point of view (me and others, for
>> instance https://bugs.launchpad.net/ubuntu/+source/procps/+bug/126329
>> ) is the free command doesnt reflect any more the
>> memory used by programs, I cannot say if the answer is changing the
>> kernel /proc interface or modifing userland "free"
> We definitely will not be modifying the Debian version alone, as this
> will mean you get different answers depending on the distribution.
>
>  - Craig
>
> --
> Craig Small      GnuPG:1C1B D893 1418 2AF4 45EE  95CB C76C E5AC 12CA DFA5
> http://www.enc.com.au/                             csmall at : enc.com.au
> http://www.debian.org/          Debian GNU/Linux, software should be Free
>
diff -ur procps-3.2.8.orig/free.c procps-3.2.8/free.c
--- procps-3.2.8.orig/free.c	2004-01-30 03:30:29.000000000 +0100
+++ procps-3.2.8/free.c	2010-01-24 11:44:45.000000000 +0100
@@ -61,15 +61,16 @@
 
     do {
         meminfo();
-        printf("             total       used       free     shared    buffers     cached\n");
+        printf("             total            used       free     shared    buffers     cached       slab\n");
         printf(
-            "%-7s %10Lu %10Lu %10Lu %10Lu %10Lu %10Lu\n", "Mem:",
+            "%-7s %10Lu      %10Lu %10Lu %10Lu %10Lu %10Lu %10Lu\n", "Mem:",
             S(kb_main_total),
             S(kb_main_used),
             S(kb_main_free),
             S(kb_main_shared),
             S(kb_main_buffers),
-            S(kb_main_cached)
+            S(kb_main_cached),
+            S(kb_slab_reclaimable)
         );
         // Print low vs. high information, if the user requested it.
         // Note we check if low_total==0: if so, then this kernel does
@@ -77,35 +78,35 @@
         // print the high info, even if it is zero.
         if (show_high) {
             printf(
-                "%-7s %10Lu %10Lu %10Lu\n", "Low:",
+                "%-7s %10Lu      %10Lu %10Lu\n", "Low:",
                 S(kb_low_total),
                 S(kb_low_total - kb_low_free),
                 S(kb_low_free)
             );
             printf(
-                "%-7s %10Lu %10Lu %10Lu\n", "High:",
+                "%-7s %10Lu      %10Lu %10Lu\n", "High:",
                 S(kb_high_total),
                 S(kb_high_total - kb_high_free),
                 S(kb_high_free)
             );
         }
         if(!old_fmt){
-            unsigned KLONG buffers_plus_cached = kb_main_buffers + kb_main_cached;
+            unsigned KLONG buffers_plus_cached = kb_main_buffers + kb_main_cached + kb_slab_reclaimable;
             printf(
-                "-/+ buffers/cache: %10Lu %10Lu\n", 
+                "-/+ buffers/cache/slab: %10Lu %10Lu\n", 
                 S(kb_main_used - buffers_plus_cached),
                 S(kb_main_free + buffers_plus_cached)
             );
         }
         printf(
-            "%-7s %10Lu %10Lu %10Lu\n", "Swap:",
+            "%-7s %10Lu      %10Lu %10Lu\n", "Swap:",
             S(kb_swap_total),
             S(kb_swap_used),
             S(kb_swap_free)
         );
         if(show_total){
             printf(
-                "%-7s %10Lu %10Lu %10Lu\n", "Total:",
+                "%-7s %10Lu      %10Lu %10Lu\n", "Total:",
                 S(kb_main_total + kb_swap_total),
                 S(kb_main_used  + kb_swap_used),
                 S(kb_main_free  + kb_swap_free)
diff -ur procps-3.2.8.orig/proc/library.map procps-3.2.8/proc/library.map
--- procps-3.2.8.orig/proc/library.map	2005-03-14 05:32:40.000000000 +0100
+++ procps-3.2.8/proc/library.map	2010-01-24 11:41:35.000000000 +0100
@@ -18,6 +18,7 @@
   kb_main_free; kb_main_total; kb_main_used; kb_swap_free;
   kb_swap_total; kb_swap_used; kb_main_shared;
   kb_low_total; kb_low_free; kb_high_total; kb_high_free;
+  kb_slab_reclaimable;
   vm_pgpgin; vm_pgpgout; vm_pswpin; vm_pswpout;
   free_slabinfo; put_slabinfo; get_slabinfo; get_proc_stats;
 local: *;
diff -ur procps-3.2.8.orig/proc/sysinfo.c procps-3.2.8/proc/sysinfo.c
--- procps-3.2.8.orig/proc/sysinfo.c	2008-03-24 05:33:43.000000000 +0100
+++ procps-3.2.8/proc/sysinfo.c	2010-01-24 11:42:11.000000000 +0100
@@ -538,8 +538,8 @@
 static unsigned long kb_bounce;
 static unsigned long kb_commit_limit;
 static unsigned long kb_nfs_unstable;
-static unsigned long kb_swap_reclaimable;
-static unsigned long kb_swap_unreclaimable;
+unsigned long kb_slab_reclaimable;
+unsigned long kb_slab_unreclaimable;
 
 void meminfo(void){
   char namebuf[16]; /* big enough to hold any row name */
@@ -572,8 +572,8 @@
   {"NFS_Unstable", &kb_nfs_unstable},
   {"PageTables",   &kb_pagetables},   // kB version of vmstat nr_page_table_pages
   {"ReverseMaps",  &nr_reversemaps},  // same as vmstat nr_page_table_pages
-  {"SReclaimable", &kb_swap_reclaimable}, // "swap reclaimable" (dentry and inode structures)
-  {"SUnreclaim",   &kb_swap_unreclaimable},
+  {"SReclaimable", &kb_slab_reclaimable}, // "slab reclaimable" (dentry and inode structures)
+  {"SUnreclaim",   &kb_slab_unreclaimable},
   {"Slab",         &kb_slab},         // kB version of vmstat nr_slab
   {"SwapCached",   &kb_swap_cached},
   {"SwapFree",     &kb_swap_free},    // important
@@ -586,9 +586,7 @@
   const int mem_table_count = sizeof(mem_table)/sizeof(mem_table_struct);
 
   FILE_TO_BUF(MEMINFO_FILE,meminfo_fd);
-
   kb_inactive = ~0UL;
-
   head = buf;
   for(;;){
     tail = strchr(head, ':');
diff -ur procps-3.2.8.orig/proc/sysinfo.h procps-3.2.8/proc/sysinfo.h
--- procps-3.2.8.orig/proc/sysinfo.h	2006-06-25 08:41:48.000000000 +0200
+++ procps-3.2.8/proc/sysinfo.h	2010-01-24 11:37:01.000000000 +0100
@@ -54,6 +54,10 @@
 extern unsigned long kb_mapped;
 extern unsigned long kb_pagetables;
 
+extern unsigned long kb_slab_reclaimable;
+extern unsigned long kb_slab_unreclaimable;
+
+
 #define BUFFSIZE (64*1024)
 typedef unsigned long long jiff;
 extern void getstat(jiff *restrict cuse, jiff *restrict cice, jiff *restrict csys, jiff *restrict cide, jiff *restrict ciow, jiff *restrict cxxx, jiff *restrict cyyy, jiff *restrict czzz,

Reply via email to