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