I've been writing some software which parses `/proc` to get process info.
The original is in Python, but I got some unexpected results and, as I'm
not the best with Python, assumed it was my bad coding. So, I wrote a bit
of C to cross-reference, and I get the same results. I just can't
understand why.

-----
#include <stdio.h>
#include <unistd.h>
#include <procfs.h>
#include <fcntl.h>

static void print_info(psinfo_t *buf);

void main(int argc, char **argv) {
  psinfo_t buf;
  int fd;
  char file [1024];
  snprintf(file, 1024, "/proc/%s/psinfo", argv[1]);
  fd = open(file, O_RDONLY);
  read(fd, &buf, sizeof(psinfo_t));
  close(fd);
  print_info(&buf);
}

static void print_info(psinfo_t *buf) {
  printf(" PID: %ld\n", buf->pr_pid);
  printf(" cmd: %s\n", buf->pr_psargs);
  printf("size: %ld\n", buf->pr_size);
  printf(" RSS: %ld\n", buf->pr_rssize);
}

-----

Obviously, this code parses a process's psinfo struct, and prints the
memory usage. On some processes it works just fine:

$ ./psinfo 27481
 PID: 27481
 cmd: /usr/sbin/cron
size: 2132
 RSS: 720

$ ./psinfo 8715
 PID: 8715
 cmd: /usr/bin/java -Djava.library.path=/usr/local/graylog/bin/../lib/sigar
-Xms256m
size: 519536
 RSS: 412148

But on others, it always shows zero for memory usage. Every other field
seems to be correct.

$ ./psinfo 28352
 PID: 28352
 cmd: java -Xmx500m -Xms300m -server -verbosegc -XX:-UseParallelOldGC
-XX:OnOutOfMemo
size: 0
 RSS: 0

$ ./psinfo 27627
 PID: 27627
 cmd: /ops/local/mysql/bin/mysqld
--defaults-file=/opt/local/etc/mysql/my.cnf
size: 0
 RSS: 0

Examining that last process with prstat:

$ prstat -cp 27627 1 1
Please wait...
   PID USERNAME  SIZE   RSS STATE   PRI NICE      TIME  CPU PROCESS/NLWP

 27627 mysql     619M  379M sleep    28    0   0:01:28 0.0% mysqld/23
Total: 1 processes, 23 lwps, load averages: 0.12, 0.15, 0.21

DTracing that command, I can see prstat only looks at /proc/{pid}/psinfo,
just like my C example. (At first I suspected it was doing something with
LWP info.) Looking at the source suggests my code and prstat are doing the
same thing, but one works and one doesn't.

The "zero memory" processes are always the same ones. Some programs always
report it, and the others never do. It seems particularly odd to me that
some JVMs "work" and some don't, and it's always the same ones. I get
identical results on a Solaris box, right down to the same Java programs
working or not working.

What's going on here? What am I missing?

TIA,


Rob



-------------------------------------------
smartos-discuss
Archives: https://www.listbox.com/member/archive/184463/=now
RSS Feed: https://www.listbox.com/member/archive/rss/184463/25769125-55cfbc00
Modify Your Subscription: 
https://www.listbox.com/member/?member_id=25769125&id_secret=25769125-7688e9fb
Powered by Listbox: http://www.listbox.com

Reply via email to