edit src/lib/libast/vmalloc/vmmaddress.c and change
#define VMCHKMEM        0
this affects vmalloc detecting overbooked memory but will disable the
MAP_FIXED codepath


On Thu, Dec 5, 2013 at 4:50 PM, Irek Szczesniak <iszczesn...@gmail.com>wrote:

> On Wed, Dec 4, 2013 at 3:02 PM, Glenn Fowler <glenn.s.fow...@gmail.com>
> wrote:
> > On Sun, Dec 1, 2013 at 4:58 PM, Lionel Cons <lionelcons1...@gmail.com>
> > wrote:
> >>
> >> On 1 December 2013 17:26, Glenn Fowler <glenn.s.fow...@gmail.com>
> wrote:
> >> > I believe this is related to vmalloc changes between 2013-05-31 and
> >> > 2013-06-09
> >> > re-run the tests with
> >> > export VMALLOC_OPTIONS=getmem=safe
> >> > if that's the problem then it gives a clue on a general solution
> >> > details after confirmation
> >> >
> >>
> >> timex ~/bin/ksh -c 'function nanosort { typeset -A a ; integer k=0;
> >> while read i ; do key="$i$((k++))" ; a["$key"]="$i" ; done ; printf
> >> "%s\n" "${a[@]}" ; } ; print "${.sh.version}" ; nanosort <xxx >yyy'
> >> Version AIJMP 93v- 2013-10-08
> >>
> >> real          34.60
> >> user          33.27
> >> sys            1.19
> >>
> >> VMALLOC_OPTIONS=getmem=safe timex ~/bin/ksh -c 'function nanosort {
> >> typeset -A a ; integer k=0; while read i ; do key="$i$((k++))" ;
> >> a["$key"]="$i" ; done ; printf "%s\n" "${a[@]}" ; } ; print
> >> "${.sh.version}" ; nanosort <xxx >yyy'
> >> Version AIJMP 93v- 2013-10-08
> >> real          15.34
> >> user          14.67
> >> sys            0.52
> >>
> >> So your hunch that VMALLOC_OPTIONS=getmem=safe fixes the problem is
> >> correct.
> >>
> >> What does VMALLOC_OPTIONS=getmem=safe do?
> >
> >
> > vmalloc has an internal discipline/method for getting memory from the
> system
> > several methods are available with varying degrees of thread safety etc.
> > see src/lib/libast/vmalloc/vmdcsystem.c for the code
> > and src/lib/libast/vmalloc/malloc.c for the latest VMALLOC_OPTIONS
> > description (vmalloc.3 update shortly)
> >
> > **          getmemory=f enable f[,g] getmemory() functions if supported,
> all
> > by default
> > **                          anon: mmap(MAP_ANON)
> > **                          break|sbrk: sbrk()
> > **                          native: native malloc()
> > **                          safe: safe sbrk() emulation via
> mmap(MAP_ANON)
> > **                          zero: mmap(/dev/zero)
> >
> > i believe the performance regression with "anon" is that on linux
> > mmap(0....MAP_ANON|MAP_PRIVATE...),
> > which lets the system decide the address, returns adjacent (when
> possible)
> > region addresses from highest to lowest order
> > and the reverse order at minimum tends to fragment more memory
> > "zero" has the same hi=>lo characteristic
> > i suspect it adversely affects the vmalloc coalescing algorithm but have
> not
> > dug deeper
> > for now the probe order in vmalloc/vmdcsystem.c was simply changed to
> favor
> > "safe"
>
> MAP_FIXED should be avoided because its only there for special
> purposes like the runtime linker ld.so.1 or debuggers.
>
> Using this for a general-purpose memory allocator causes serious problems:
> 1. On some systems this is a privileged operation and only available
> for users with root privileges
>
> 2. SPARC T4 with 256GB and Solaris 11.1 the use of 'safe' degraded the
> performance from 9 seconds to almost 15 minutes because it utterly
> destroys the systems concept of large pages. If two MAP_FIXED mappings
> follow directly each other the system downgrades the page size to the
> smallest possible size, even trying to break up larger pages, which in
> turn must be done by a special deamon (vmtasks)
>
> 3. MAP_PRIVATE|MAP_FIXED|MAP_ANON may no longer be available in future
> versions of Solaris
>
> 4. Using the 'safe' allocator on SmartOS (solaris 11 clone) triggers a
> SEGV:
> map(0xFFFFCD800B482000, 1048576, PROT_READ|PROT_WRITE,
> MAP_PRIVATE|MAP_FIXED|MAP_ANON, 4294967295, 0) = 0xFFFFCD800B482000
> sigaction(SIGSEGV, 0xFFFFFD7FFFDFDE50, 0xFFFFFD7FFFDFDED0) = 0
>     Incurred fault #6, FLTBOUNDS  %pc = 0x0052FE06
>       siginfo: SIGSEGV SEGV_MAPERR addr=0xFFFFCD800B582000
>     Received signal #11, SIGSEGV [caught]
>       siginfo: SIGSEGV SEGV_MAPERR addr=0xFFFFCD800B582000
> lwp_sigmask(SIG_SETMASK, 0x00000400, 0x00000000, 0x00000000,
> 0x00000000) = 0xFFBFFEFF [0xFFFFFFFF]
>
> Irek
>
_______________________________________________
ast-developers mailing list
ast-developers@lists.research.att.com
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to