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]