Skip to contentSkip to conversation

max heap usage of a Linux process

DISCUSSION Prasanta Sadhukhan 6 participants 12 messages Nov 13, 2006 – Nov 14, 2006

lore
Share & tools
lore
#0 lore raw

Hi,

Can anybody please tell how can I obtain the max. heap usage of a Linux process?

Thx in advance
Prasanta

#1 lore raw

Hi,

Quoted 5 lines · Prasanta Sadhukhan

Hi,

Can anybody please tell how can I obtain the max. heap usage of a Linux process?

theoretically 3 GB (3/4 of 4gb - which are addressable by 32 bit) on a 32bit machine on a 64bit machine 3/4 of 16exabyte.

cheers,
Markus

#2 lore raw

unless parent is asking about malloc'd space, then mallinfo() or malloc_stats() might be what they're looking for, memory profiling the manual way, gotta love it

Quoted 18 lines · Markus Rechberger

Hi,

Quoted 5 lines · Prasanta Sadhukhan

Hi,

Can anybody please tell how can I obtain the max. heap usage of a Linux process?

theoretically 3 GB (3/4 of 4gb - which are addressable by 32 bit) on a 32bit machine on a 64bit machine 3/4 of 16exabyte.

cheers,
Markus
-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#3 lore raw

Hi,

Quoted 4 lines · Dan Gary

unless parent is asking about malloc'd space, then mallinfo() or malloc_stats() might be what they're looking for, memory profiling the manual way, gotta love it

interesting didn't know that..

though now I have a question about it ..

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
       char *foo;
       printf("total free space: %d\n",mallinfo().fordblks);
       foo=malloc(500000);
       if(foo){
               printf("successfully allocated!\n");
       } else {
               printf("error allocating!\n");
       }
       printf("arena: %d\n",mallinfo().arena);
       printf("ordblks: %d\n",mallinfo().ordblks);
       printf("max total allocated space: %d\n",mallinfo().usmblks);
       printf("total allocated space: %d\n",mallinfo().uordblks);
       printf("total free space: %d\n",mallinfo().fordblks);

       return 0;
}

outputs:
total free space: 0
successfully allocated!
arena: 0
ordblks: 1
max total allocated space: 0
total allocated space: 0
total free space: 0

If I allocate 50000bytes then it outputs:
total free space: 0
successfully allocated!
arena: 184320
ordblks: 1
max total allocated space: 0
total allocated space: 50008
total free space: 134312

does anyone have an explanation for that?

Markus

#4 lore raw

If you want to know how much you are using, look at uordblks not ordblks. The allocator dishes out memory in chunks (not the same has bytes requested via malloc() so there will most often be some difference).

See the GNU documentation at:
http://www.gnu.org/software/libc/manual/html_node/Statistics-of-Malloc.html#Statistics-of-Malloc

BTW, I think the chunk size will always be a multiple of page size (see the man pages for getpagesize() -- but I haven't give it any thorough investigation). Perhaps someone on this list can confirm.

Quoted 59 lines · Markus Rechberger

Hi,

Quoted 4 lines · Dan Gary

unless parent is asking about malloc'd space, then mallinfo() or malloc_stats() might be what they're looking for, memory profiling the manual way, gotta love it

interesting didn't know that..

though now I have a question about it ..

#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
        char *foo;
        printf("total free space: %d\n",mallinfo().fordblks);
        foo=malloc(500000);
        if(foo){
                printf("successfully allocated!\n");
        } else {
                printf("error allocating!\n");
        }
        printf("arena: %d\n",mallinfo().arena);
        printf("ordblks: %d\n",mallinfo().ordblks);
        printf("max total allocated space: %d\n",mallinfo().usmblks);
        printf("total allocated space: %d\n",mallinfo().uordblks);
        printf("total free space: %d\n",mallinfo().fordblks);

        return 0;
}

outputs:
total free space: 0
successfully allocated!
arena: 0
ordblks: 1
max total allocated space: 0
total allocated space: 0
total free space: 0

If I allocate 50000bytes then it outputs:
total free space: 0
successfully allocated!
arena: 184320
ordblks: 1
max total allocated space: 0
total allocated space: 50008
total free space: 134312

does anyone have an explanation for that?

Markus
-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#5 lore raw
In reply to Dan Gary

Actually, I have the process-pid(s) and I want to find out programmatically, what's the max heap size that had been consumed by that process at any given moment(based on user command) from another process. It seems mallinfo().uordblks will give total occupied size of memory not the max heap size consumed. Also, how do I use malloc_stats()?

--Prasanta

Quoted 29 lines · Dan Gary

unless parent is asking about malloc'd space, then mallinfo() or malloc_stats() might be what they're looking for, memory profiling the manual way, gotta love it

Quoted 10 lines · Markus Rechberger

Hi,

Quoted 3 lines · Prasanta Sadhukhan

Hi,

Can anybody please tell how can I obtain the max. heap usage of a

Linux

Quoted 2 lines

process?

Quoted 9 lines

theoretically 3 GB (3/4 of 4gb - which are addressable by 32 bit) on a 32bit machine on a 64bit machine 3/4 of 16exabyte.

cheers,
Markus
-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#6 lore raw
Quoted 4 lines · Prasanta Sadhukhan

Actually, I have the process-pid(s) and I want to find out programmatically, what's the max heap size that had been consumed by that process at any given moment(based on user command) from another process.

Then you need to read the files in /proc/<pid>/*. There isn't a system call to get resource usage for another process.

Note that you won't be able to determine how much of the allocated heap is free or used; that information is internal to the process, and isn't visible externally.

Signature · 1 line
Glynn Clements <[email protected]>
#7 lore raw
Quoted 8 lines · Glynn Clements
Quoted 3 lines · Prasanta Sadhukhan

Actually, I have the process-pid(s) and I want to find out programmatically, what's the max heap size that had been consumed by that process at any given moment(based on user command) from another process.

Quoted 9 lines

Then you need to read the files in /proc/<pid>/*. There isn't a system call to get resource usage for another process.

Note that you won't be able to determine how much of the allocated heap is free or used; that information is internal to the process, and isn't visible externally.

thanks. Infact, I used /proc/<pid>/statm to find out total size, RSS and shared memory from 1st 3 entries. Don't know about the accuracy or not but that will do. But, this file does not tell about max. heap consumed by a process nor does /proc/pid/status and I am not able to decipher /proc/pid/stat. Does anyone knows how to interpret stat file?

#8 lore raw
Quoted 12 lines · Prasanta Sadhukhan
Quoted 11 lines
Quoted 4 lines

Actually, I have the process-pid(s) and I want to find out programmatically, what's the max heap size that had been consumed by that process at any given moment(based on user command) from another process.

Then you need to read the files in /proc/<pid>/*. There isn't a system call to get resource usage for another process.

Note that you won't be able to determine how much of the allocated heap is free or used; that information is internal to the process, and isn't visible externally.

Quoted 5 lines

thanks. Infact, I used /proc/<pid>/statm to find out total size, RSS and shared memory from 1st 3 entries. Don't know about the accuracy or not but that will do. But, this file does not tell about max. heap consumed by a process nor does /proc/pid/status and I am not able to decipher /proc/pid/stat. Does anyone knows how to interpret stat file?

It's documented in the proc(5) manpage, but I don't think it records the heap size separately.

Probably the best option is to look in /proc/<pid>/maps for writable segments with zero for the device and inode numbers (i.e. anonymous maps).

Also, note that glibc's malloc can use explicit anonymous mmap() to obtain memory, as well as sbrk(), so there isn't a monolithic "heap" in the traditional sense.

Signature · 1 line
Glynn Clements <[email protected]>
#9 lore raw
In reply to Glynn Clements
Quoted 8 lines · Glynn Clements
Quoted 4 lines · Prasanta Sadhukhan

Actually, I have the process-pid(s) and I want to find out programmatically, what's the max heap size that had been consumed by that process at any given moment(based on user command) from another process.

Then you need to read the files in /proc/<pid>/*. There isn't a system call to get resource usage for another process.

Wow, really? Reading /proc/<pid>/* is pretty expensive, especially if you have to do it for 1000's of procs.

That's probably why top is such a cpu-hog.

Thanks!

--
Al

#10 lore raw
In reply to Glynn Clements

If you don't feel like reading proc or want to make things more portable, use libgtop.

Quoted 14 lines · Glynn Clements
Quoted 4 lines · Prasanta Sadhukhan

Actually, I have the process-pid(s) and I want to find out programmatically, what's the max heap size that had been consumed by that process at any given moment(based on user command) from another process.

Then you need to read the files in /proc/<pid>/*. There isn't a system call to get resource usage for another process.

Note that you won't be able to determine how much of the allocated heap is free or used; that information is internal to the process, and isn't visible externally.