Hi Rob,

Since pr_size and pr_rssize are size_t's, I'm guessing that they're zero
since the number is too big to represent in 32 bits, so the field is being
made 0 instead. If you compile your C program for 64-bit (-m64 for GCC, I
believe), does the output change?

- Cody


On Mon, Apr 10, 2017 at 5:08 PM, Robert Fisher <[email protected]> wrote:

> 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>
> <https://www.listbox.com/member/archive/rss/184463/27398174-11508a73> |
> Modify
> <https://www.listbox.com/member/?&;>
> Your Subscription <http://www.listbox.com>
>



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