libgtop r2740 - trunk/sysdeps/linux
- From: bdejean svn gnome org
- To: svn-commits-list gnome org
- Subject: libgtop r2740 - trunk/sysdeps/linux
- Date: Mon, 21 Apr 2008 19:59:25 +0100 (BST)
Author: bdejean
Date: Mon Apr 21 18:59:25 2008
New Revision: 2740
URL: http://svn.gnome.org/viewvc/libgtop?rev=2740&view=rev
Log:
First try to implement proportional set size by recyling
glibtop_proc_mem's duplicate members.x
Currently implemented on linux in rss member, for now
size,share,resident,rss are the only filled members.
Modified:
trunk/sysdeps/linux/procmem.c
Modified: trunk/sysdeps/linux/procmem.c
==============================================================================
--- trunk/sysdeps/linux/procmem.c (original)
+++ trunk/sysdeps/linux/procmem.c Mon Apr 21 18:59:25 2008
@@ -27,21 +27,53 @@
#include "glibtop_private.h"
static const unsigned long _glibtop_sysdeps_proc_mem =
-(1L << GLIBTOP_PROC_MEM_VSIZE) + (1L << GLIBTOP_PROC_MEM_RSS) +
-(1L << GLIBTOP_PROC_MEM_RSS_RLIM);
-
-static const unsigned long _glibtop_sysdeps_proc_mem_statm =
(1L << GLIBTOP_PROC_MEM_SIZE) + (1L << GLIBTOP_PROC_MEM_RESIDENT) +
(1L << GLIBTOP_PROC_MEM_SHARE);
+static const unsigned long _glibtop_sysdeps_proc_mem_pss =
+(1L << GLIBTOP_PROC_MEM_RSS);
+
+
+static unsigned long
+get_pss(glibtop* server, pid_t pid)
+{
+ char filepath[128];
+ FILE* smaps;
+ char* line = NULL;
+ size_t line_size = 0;
+ unsigned long pss = 0;
+
+ snprintf(filepath, sizeof filepath, "/proc/%u/smaps", (unsigned)pid);
+
+ if (!(smaps = fopen(filepath, "r"))) {
+ glibtop_error_io_r(server, "Cannot open %s", filepath);
+ goto out;
+ }
+
+ while (getline(&line, &line_size, smaps) != -1) {
+ if (strncmp(line, "Pss:", 4))
+ continue;
+ pss += get_scaled(line + 4, NULL);
+ }
+
+out:
+ if (smaps)
+ fclose(smaps);
+
+ free(line);
+
+ return pss;
+}
+
/* Init function. */
void
_glibtop_init_proc_mem_s (glibtop *server)
{
- server->sysdeps.proc_mem = _glibtop_sysdeps_proc_mem |
- _glibtop_sysdeps_proc_mem_statm;
+ server->sysdeps.proc_mem = _glibtop_sysdeps_proc_mem;
+ if (server->os_version_code >= LINUX_VERSION_CODE(2, 6, 25))
+ server->sysdeps.proc_mem |= _glibtop_sysdeps_proc_mem_pss;
}
/* Provides detailed information about a process. */
@@ -54,19 +86,34 @@
memset (buf, 0, sizeof (glibtop_proc_mem));
- if (proc_stat_to_buffer(buffer, sizeof buffer, pid))
- return;
-
- p = proc_stat_after_cmd (buffer);
- if (!p) return;
-
- p = skip_multiple_token (p, 20);
+ /* As of 2.6.24 in fs/proc/*.c
- buf->vsize = strtoull (p, &p, 0);
- buf->rss = strtoull (p, &p, 0);
- buf->rss_rlim = strtoull (p, &p, 0);
+ == rss vs. resident ==
- buf->flags = _glibtop_sysdeps_proc_mem;
+ stat/rss:
+ get_mm_rss where
+ #define get_mm_rss(mm) \
+ (get_mm_counter(mm, file_rss) + get_mm_counter(mm, anon_rss))
+
+ statm/resident:
+ *shared = get_mm_counter(mm, file_rss);
+ *resident = *shared + get_mm_counter(mm, anon_rss);
+
+ == vsize vs. size ==
+
+ stat/vsize:
+ task_vsize(mm) ... total_vm * pagesize
+
+ statm/size
+ mm->total_vm
+
+ =================
+ rss == resident
+ vsize == size
+ rss_lim is not implemented in statm, but there's limits which
+ provides all limits
+ share is only implemented in statm
+ */
if (proc_statm_to_buffer(buffer, sizeof buffer, pid))
return;
@@ -78,7 +125,11 @@
buf->size *= pagesize;
buf->resident *= pagesize;
buf->share *= pagesize;
- buf->rss *= pagesize;
- buf->flags |= _glibtop_sysdeps_proc_mem_statm;
+ buf->flags |= _glibtop_sysdeps_proc_mem;
+
+ if (server->os_version_code >= LINUX_VERSION_CODE(2, 6, 25)) {
+ buf->rss = get_pss(server, pid);
+ buf->flags |= _glibtop_sysdeps_proc_mem_pss;
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]