Hi!

----

I've been looking for a way to reduce the startup time of libast-based
applications. I've got some benchmarking feedback back from Sun staff
which indicates that the runtime of a simple piece of code like:
-- snip --
int main(int ac, char *av[])
{
    return b_mkdir(ac, av, NULL);
}
-- snip --
... needs approximately _twice_ the execution time of the current native
command (see
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/mkdir/mkdir.c).

After some digging I found this:
The number of lines returned by /usr/bin/truss is ~~47 lines for the old
code vs. ~~62 lines for the new code. The difference can be broken down
to this:
1. One extra call to |sysconfig(_CONFIG_PAGESIZE)|
2. Four extra calls to |brk()|
3. Ten various calls to load libast+libcmd

[3] isn't really fixable

[1] and [2] can be eliminated by the following patch and setting
|_AST_PAGESIZE| to 65536 on Solaris/SPARC:
-- snip --
Index: common/vmalloc/vmhdr.h
===================================================================
--- common/vmalloc/vmhdr.h      (revision 1620)
+++ common/vmalloc/vmhdr.h      (working copy)
@@ -161,7 +161,7 @@
 #undef VMPAGESIZE
 #define VMPAGESIZE     _AST_PAGESIZE
 #endif
-#if _lib_getpagesize
+#if defined(_lib_getpagesize) && !defined(VMPAGESIZE)
 #define GETPAGESIZE(x) ((x) ? (x) : \
                         (((x)=getpagesize()) < VMPAGESIZE ?
((x)=VMPAGESIZE) : (x)) )
 #else
-- snip --

[2] is elimited because in the current code the initial heap size is set
to the page size in "vmprivate.c" like this...
-- snip --
79      if(vd->incr <= 0) /* this is just _Vmheap on the first call */
80              vd->incr = _Vmpagesize;
-- snip --
... however the peak memory consumtion of a command like $ cut --man #
has a peak consumtion of around 28k which requires multiple |brk()|
calls. Bumping either the allocator page size to a higher value _xor_
replacing the line above with |vd->incr = _Vmpagesize*4;| fixes this.

After some more thinking I came up with the following diff:
-- snip --
Index: common/vmalloc/vmprivate.c
===================================================================
--- common/vmalloc/vmprivate.c  (revision 1620)
+++ common/vmalloc/vmprivate.c  (working copy)
@@ -77,7 +77,7 @@
 #endif
 
        if(vd->incr <= 0) /* this is just _Vmheap on the first call */
-               vd->incr = _Vmpagesize;
+               vd->incr = INITIAL_VMHEAP_SIZE;
 
        /* Get slightly more for administrative data */
        s = size + sizeof(Seg_t) + sizeof(Block_t) + sizeof(Head_t) +
2*ALIGN;
Index: common/vmalloc/vmhdr.h
===================================================================
--- common/vmalloc/vmhdr.h      (revision 1620)
+++ common/vmalloc/vmhdr.h      (working copy)
@@ -161,12 +161,15 @@
 #undef VMPAGESIZE
 #define VMPAGESIZE     _AST_PAGESIZE
 #endif
-#if _lib_getpagesize
+#if defined(_lib_getpagesize) && !defined(VMPAGESIZE)
 #define GETPAGESIZE(x) ((x) ? (x) : \
                         (((x)=getpagesize()) < VMPAGESIZE ?
((x)=VMPAGESIZE) : (x)) )
 #else
 #define GETPAGESIZE(x) ((x) = VMPAGESIZE)
 #endif
+#ifndef INITIAL_VMHEAP_SIZE
+#define INITIAL_VMHEAP_SIZE ((_Vmpagesize)*4)
+#endif
 
 /* Blocks are allocated such that their sizes are 0%(BITS+1)
 ** This frees up enough low order bits to store state information
-- snip --

This gives us two possible ways for tuning:
1. Setting |_AST_PAGESIZE| will define a static page size, avoiding the
(quite expensive) |sysconfig(_CONFIG_PAGESIZE)| call
2. The initial heap allocator size of now defined via
|INITIAL_VMHEAP_SIZE| and set to four times the default page size -
which is 4*8192 bytes on Solaris/SPARC and enougth that a plain $ cut
--man # call only needs one single |brk()| call. I've made this an extra
macro to control the value since an alternative solution may be to set
|_AST_PAGESIZE| to 64k (which allows to make active use of 64k MMU pages
on SPARC) and setting |INITIAL_VMHEAP_SIZE| to ((_Vmpagesize)*1) (since
4*64k would be too large as initial heap size)

Comments/rants/etc. welcome...

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) [email protected]
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)
_______________________________________________
ast-developers mailing list
[email protected]
https://mailman.research.att.com/mailman/listinfo/ast-developers

Reply via email to