Do you know about the following compiler flags (of sun studio compilers)

    -xpagesize_heap=<a>     Controls the preferred page size for the heap, 
a={4K|2M|4M|default}
    -xpagesize_stack=<a>    Controls the preferred page size for the stack, 
a={4K|2M|4M|default}
    -xpagesize=<a>  Controls the preferred page size for the stack and for the 
heap, a={4K|2M|4M|default}

Alexander

On Thu, 6 Sep 2007, Andrew Gallatin wrote:

>
> Are there any tuning parameters which will increase the chances that
> applications will be able to use large pages on amd64 anywhere near as
> well as on sparc?  Or is the x86/amd64 large page implementation just
> not as mature?
>
> I have noticed that using a fairly recent open solaris (actually
> NexentaOS), on an amd64 with 512MB, pmap reports that my application
> gets very few large pages, often just one.  In debugging this, I
> located a sparc and an x86 which had lots (8GB) of memory, and were
> running the same version of the OS.  Unfortunately, this version is
> S10 11/06.  At any rate, the sparc seems to always be able to allocate
> a majority of its RAM as large pages, where the amd64 can allocate
> only a very small percentage (which seems to decrease the longer the
> machine has been up)
>
> I have written the appended trivial application which does nothing but
> allocate memory, fault it in, and fork of a pmap to see what page
> size(s) it ended up with.
>
> On the sparc I can get 6.5GB worth of large pages
> % head -1 /etc/release
>                       Solaris 10 11/06 s10s_u3wos_10 SPARC
> % uname -srpiv
> SunOS 5.10 Generic_118833-33 sparc SUNW,Sun-Fire-T200
> % prtconf | head -2
> System Configuration:  Sun Microsystems  sun4v
> Memory size: 8184 Megabytes
> % vmstat
> kthr      memory            page            disk          faults      cpu
> r b w   swap  free  re  mf pi po fr de sr s1 s2 s3 s4   in   sy   cs us sy id
> 0 0 0 7095352 7590048 1 23  3  0  0  0  1  0  0  1  0  375  291  209  0  0 100
> % ppgsz -F -o heap=4M ./lgpg 6500 | grep heap
> 0000000100102000       3064K   8K rwx--    [ heap ]
> 0000000100400000    6656000K   4M rwx--    [ heap ]
>
> On the amd64, I can get nowhere near that number of 2MB pages, even
> though the machine is freshly booted.
>
> % head -1 /etc/release
>                        Solaris 10 11/06 s10x_u3wos_10 X86
> % uname -srpiv
> SunOS 5.10 Generic_125101-08 i386 i86pc
> % prtconf | head -2
> System Configuration:  Sun Microsystems  i86pc
> Memory size: 8191 Megabytes
> % vmstat
> kthr      memory            page            disk          faults      cpu
> r b w   swap  free  re  mf pi po fr de sr cd f0 s0 --   in   sy   cs us sy id
> 0 0 0 6064208 6967940 59 7751 55 0 0 0 381 7  0  0  0  830  652  440  0  3 96
> % ppgsz -F -o heap=2M ./lgpg 6500 | grep heap
> 0000000000412000       1976K   4K rw---    [ heap ]
> 0000000000600000     813056K   2M rw---    [ heap ]
> 0000000032000000    5840896K   4K rw---    [ heap ]
> 0000000196800000       2048K   2M rw---    [ heap ]
>
>
> Thanks for any light you all can shed on this,
>
> Drew
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> #include <unistd.h>
>
> void
> usage(char *name)
> {
>        fprintf(stderr, "usage: %s alloc_size_megs", name);
>        exit(1);
> }
>
>
> int
> main(int argc, char **argv)
> {
>       char buf[64];
>       size_t alloc_size;
>       char *ptr;
>       int pid;
>
>
>       pid = (int)getpid();
>       if (argc < 2)
>               usage(argv[0]);
>
>       alloc_size = atoi(argv[1]);
>       alloc_size *= 1024UL * 1024UL;
>       ptr = malloc(alloc_size);
>       if (ptr == NULL) {
>               perror("malloc");
>               exit(1);
>       }
>
>       memset(ptr, 1, alloc_size);
>       sprintf(buf, "pmap -s %d\n", pid);
>       system(buf);
>       return(0);
> }
>
> _______________________________________________
> perf-discuss mailing list
> [email protected]
>

_______________________________________________
perf-discuss mailing list
[email protected]

Reply via email to