[ This is a long email and there's no smoking gun at the end, yet. If
you're not in the mood for a cliffhanger, I'm sorry. ]
To try and chase down this memory leak, I did some very basic tests.
The first is to eliminate all application code issues by starting a
vanilla AOLserver 4.0.10a (tip of aolserver_v40_bp branch) and using the
sample-config.tcl. The only change I made to the sample-config.tcl is
to uncomment the nscp section so I could connect to my test nsd through
nscp.
For reference, my machine is:
$ uname -a
Linux ecwav 2.6.7 #5 Thu Jul 22 02:43:13 EDT 2004 i686 GNU/Linux
$ getconf GNU_LIBPTHREAD_VERSION
NPTL 0.60
$ dpkg -l | grep libc6
ii libc6 2.3.2.ds1-18 GNU C Library: Shared libraries and
Timezone
$ LD_LIBRARY_PATH=lib bin/nsd -V
AOLserver/4.0.10a (aolserver4_0)
CVS Tag: $Name: $
Built: Jan 14 2005 at 12:40:17
Tcl version: 8.4
Platform: linux
$ tclsh
% info patchlevel
8.4.7
The first test case is to send a bad HTTP request which gets handled in
the driver thread without creating new threads (as the connection just
gets closed).
# Memory footprint of nsd before test.
$ ps -Ao pid,vsz,rss,comm | egrep "PID|2414"
PID VSZ RSS COMMAND
2414 13912 2840 nsd
# Throw 100K bad requests at the server.
$ i=0; while [ $i -lt 100000 ]; do (echo "GET"; echo "") | nc $hostname
8000; i=`expr $i + 1`; done
# Memory footprint of nsd after test.
$ ps -Ao pid,vsz,rss,comm | egrep "PID|2414"
PID VSZ RSS COMMAND
2414 13912 2840 nsd
No change. So, looks like the driver thread and the conn I/O stuff
isn't leaking.
Lets test a basic request which results in a 404 page. Since this is a
vanilla server, the pageroot is empty, so any request will result in a
404.
# Memory footprint of nsd before test.
$ ps -Ao pid,vsz,rss,comm | egrep "PID|20257"
PID VSZ RSS COMMAND
20257 13912 2824 nsd
# Throw 5000 valid requests at the server.
$ ab -c 50 -n 5000 http://$hostname:8000/
This is ApacheBench, Version 1.3d <$Revision: 1.67 $> apache-1.3
...
Concurrency Level: 50
Time taken for tests: 30.873 seconds
Complete requests: 5000
Failed requests: 0
Broken pipe errors: 0
Non-2xx responses: 5000
Total transferred: 3610000 bytes
HTML transferred: 2740000 bytes
Requests per second: 161.95 [#/sec] (mean)
Time per request: 308.73 [ms] (mean)
Time per request: 6.17 [ms] (mean, across all concurrent
requests)
Transfer rate: 116.93 [Kbytes/sec] received
...
# Memory footprint of nsd after test.
$ ps -Ao pid,vsz,rss,comm | egrep "PID|20257"
PID VSZ RSS COMMAND
20257 173200 158580 nsd
Wow. It grew from 13.9MB to 173.2MB in 5000 requests. That's a growth of
159.3MB or 31.8K (lets say 32K) per request. Lets see if Valgrind will
show us where we're losing memory.
$ LD_LIBRARY_PATH=lib valgrind bin/nsd -ft test-config.tcl -u www -g www -d
==25493== Memcheck, a memory error detector for x86-linux.
==25493== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
==25493== Using valgrind-2.2.0, a program supervision framework for
x86-linux.
...
[14/Jan/2005:12:46:25][25493.5][-driver-] Notice: driver: accepting
connections
At this point, I run the same ApacheBench against the server as I did
above. Then, I send a Ctrl-C to valgrind, and ...
==25493== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 45 from 1)
==25493== malloc/free: in use at exit: 30030551 bytes in 6876 blocks.
==25493== malloc/free: 31940 allocs, 25064 frees, 40621246 bytes allocated.
==25493== For a detailed leak analysis, rerun with: --leak-check=yes
==25493== For counts of detected errors, rerun with: -v
Oops. Forgot to run it with all the bells and whistles. Lets try
again:
$ LD_LIBRARY_PATH=lib valgrind --leak-check=yes --show-reachable=yes
--num-callers=8 bin/nsd -ft test-config.tcl -u www -g www -d
...
==17911==
==17911== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 45 from 1)
==17911== malloc/free: in use at exit: 29279847 bytes in 6825 blocks.
==17911== malloc/free: 31864 allocs, 25039 frees, 39860882 bytes allocated.
==17911== For counts of detected errors, rerun with: -v
==17911== searching for pointers to 6825 not-freed blocks.
==17911== checked 13556740 bytes.
==17911==
==17911== 8 bytes in 1 blocks are still reachable in loss record 1 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB9334C: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 24 bytes in 2 blocks are still reachable in loss record 2 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB93B72: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 32 bytes in 2 blocks are still reachable in loss record 3 of 32
==17911== at 0x1B907901: calloc (vg_replace_malloc.c:176)
==17911== by 0x1BA30495: (within /lib/tls/libdl-2.3.2.so)
==17911== by 0x1BA3FE3E: (within /usr/lib/valgrind/libpthread.so)
==17911==
==17911==
==17911== 40 bytes in 2 blocks are still reachable in loss record 4 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1B8EEDAA: _dl_map_object_deps (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB4035: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B8EFF25: _dl_catch_error (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3DC9: _dl_open (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5C40: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5ABB: __libc_dlopen_mode (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BB505E5: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 42 bytes in 3 blocks are still reachable in loss record 5 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB2076A: strdup (in /lib/tls/libc-2.3.2.so)
==17911== by 0x53492E52: ???
==17911==
==17911==
==17911== 48 bytes in 4 blocks are still reachable in loss record 6 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB3CB23: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 56 bytes in 7 blocks are still reachable in loss record 7 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB9305D: __nss_lookup_function (in
/lib/tls/libc-2.3.2.so)
==17911== by 0x1BB505E5: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B96497B: (within /home/aolserver/4.0.10/lib/libnsd.so)
==17911==
==17911==
==17911== 60 bytes in 1 blocks are still reachable in loss record 8 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BAC7DFB: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BAC7019: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BAC66DC: setlocale (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BA12564: TclpSetInitialEncodings (in
/usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9C58E1: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9C3982: Tcl_FindExecutable (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B93285F: Ns_Main (nsmain.c:430)
==17911==
==17911==
==17911== 88 bytes in 1 blocks are still reachable in loss record 9 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BBB4850: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 101 bytes in 4 blocks are still reachable in loss record 10 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1B8EA7BE: _dl_map_object (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3F8E: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B8EFF25: _dl_catch_error (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3DC9: _dl_open (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5C40: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5ABB: __libc_dlopen_mode (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BB505E5: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 108 bytes in 3 blocks are still reachable in loss record 11 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1B8EA4FB: _dl_map_object (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3F8E: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B8EFF25: _dl_catch_error (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3DC9: _dl_open (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BA2FFD6: (within /lib/tls/libdl-2.3.2.so)
==17911== by 0x1BA30455: (within /lib/tls/libdl-2.3.2.so)
==17911== by 0x101: ???
==17911==
==17911==
==17911== 112 bytes in 7 blocks are still reachable in loss record 12 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB80CEB: tsearch (in /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 154 bytes in 10 blocks are still reachable in loss record 13 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB93A81: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 176 bytes in 1 blocks are still reachable in loss record 14 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BAC6DC6: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 209 bytes in 7 blocks are still reachable in loss record 15 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1B8ED14E: (within /lib/ld-2.3.2.so)
==17911== by 0x1B8E8C9B: (within /lib/ld-2.3.2.so)
==17911== by 0x1B8EA4B5: _dl_map_object (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3F8E: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B8EFF25: _dl_catch_error (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3DC9: _dl_open (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5C40: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 272 bytes in 4 blocks are possibly lost in loss record 16 of 32
==17911== at 0x1B907901: calloc (vg_replace_malloc.c:176)
==17911== by 0x1B8F25A8: (within /lib/ld-2.3.2.so)
==17911== by 0x1B8F265F: (within /lib/ld-2.3.2.so)
==17911== by 0x1B8F2887: _dl_allocate_tls (in /lib/ld-2.3.2.so)
==17911== by 0x1BA38C59: pthread_create (vg_libpthread.c:1174)
==17911== by 0x1BA13000: TclpThreadCreate (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA13999: Tcl_InitNotifier (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9EFA64: TclInitNotifier (in /usr/lib/libtcl8.4.so.0)
==17911==
==17911==
==17911== 356 bytes in 5 blocks are still reachable in loss record 17 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1B8EEE9A: _dl_map_object_deps (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB4035: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B8EFF25: _dl_catch_error (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3DC9: _dl_open (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5C40: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5ABB: __libc_dlopen_mode (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BB505E5: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 364 bytes in 13 blocks are still reachable in loss record 18 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BA13752: TclpNewAllocMutex (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA0009E: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA002B2: TclpAlloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9A5E04: Tcl_Alloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B96AFAE: ns_malloc (memory.c:67)
==17911== by 0x1B96B5BD: Ns_CsInit (cslock.c:86)
==17911== by 0x1B96AEDB: NsInitMaster (master.c:63)
==17911==
==17911==
==17911== 593 bytes in 16 blocks are still reachable in loss record 19 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB93504: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 848 bytes in 7 blocks are still reachable in loss record 21 of 32
==17911== at 0x1B907901: calloc (vg_replace_malloc.c:176)
==17911== by 0x1B8F1232: _dl_check_map_versions (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB453F: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B8EFF25: _dl_catch_error (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3DC9: _dl_open (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5C40: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5ABB: __libc_dlopen_mode (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BB505E5: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 1024 bytes in 1 blocks are still reachable in loss record 22 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB50C5E: getgrnam (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1B9324EA: Ns_Main (nsmain.c:293)
==17911== by 0x80486BB: main (main.c:64)
==17911==
==17911==
==17911== 1024 bytes in 1 blocks are still reachable in loss record 23 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB51F9E: getpwnam (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1B932498: Ns_Main (nsmain.c:276)
==17911== by 0x80486BB: main (main.c:64)
==17911==
==17911==
==17911== 1224 bytes in 1 blocks are still reachable in loss record 24 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BB3DED2: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BB3CCC8: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1BB3D7C8: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x71D0A: ???
==17911==
==17911==
==17911== 1712 bytes in 12 blocks are still reachable in loss record 25 of
32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BAC75EA: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 4121 bytes in 7 blocks are still reachable in loss record 26 of 32
==17911== at 0x1B907901: calloc (vg_replace_malloc.c:176)
==17911== by 0x1B8ECF33: (within /lib/ld-2.3.2.so)
==17911== by 0x1B8E8C9B: (within /lib/ld-2.3.2.so)
==17911== by 0x1B8EA4B5: _dl_map_object (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3F8E: (within /lib/tls/libc-2.3.2.so)
==17911== by 0x1B8EFF25: _dl_catch_error (in /lib/ld-2.3.2.so)
==17911== by 0x1BBB3DC9: _dl_open (in /lib/tls/libc-2.3.2.so)
==17911== by 0x1BBB5C40: (within /lib/tls/libc-2.3.2.so)
==17911==
==17911==
==17911== 4736 bytes in 4 blocks are possibly lost in loss record 27 of 32
==17911== at 0x1B907AD5: memalign (vg_replace_malloc.c:217)
==17911== by 0x1B8F2631: (within /lib/ld-2.3.2.so)
==17911== by 0x1B8F2887: _dl_allocate_tls (in /lib/ld-2.3.2.so)
==17911== by 0x1BA38C59: pthread_create (vg_libpthread.c:1174)
==17911== by 0x1BA13000: TclpThreadCreate (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA13999: Tcl_InitNotifier (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9EFA64: TclInitNotifier (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9C6CE8: TclInitSubsystems (in /usr/lib/libtcl8.4.so.0)
==17911==
==17911==
==17911== 19200 bytes in 1 blocks are still reachable in loss record 28 of
32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BA005A0: TclThreadAllocObj (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9F09A8: Tcl_NewObj (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA11E1F: TclpInitLibraryPath (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9C58CB: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9C3982: Tcl_FindExecutable (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B93285F: Ns_Main (nsmain.c:430)
==17911== by 0x80486BB: main (main.c:64)
==17911==
==17911==
==17911== 129567 bytes in 2 blocks are possibly lost in loss record 29 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BA0029C: TclpAlloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9A5E04: Tcl_Alloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B96AFAE: ns_malloc (memory.c:67)
==17911== by 0x1B96B004: ns_calloc (memory.c:85)
==17911== by 0x1B93B325: CreatePool (server.c:584)
==17911== by 0x1B93B0F6: NsInitServer (server.c:514)
==17911== by 0x1B932B1A: Ns_Main (nsmain.c:583)
==17911==
==17911==
==17911== 1123596 bytes in 69 blocks are possibly lost in loss record 30 of
32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BA00C50: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA00286: TclpAlloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9A5E04: Tcl_Alloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B96AFAE: ns_malloc (memory.c:67)
==17911== by 0x1B96B5BD: Ns_CsInit (cslock.c:86)
==17911== by 0x1B96AEDB: NsInitMaster (master.c:63)
==17911== by 0x1B96BDED: NsInitThreads (thread.c:106)
==17911==
==17911==
==17911== 1641640 bytes in 5005 blocks are still reachable in loss record
31 of 32
==17911== at 0x1B907901: calloc (vg_replace_malloc.c:176)
==17911== by 0x1BA00016: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA002B2: TclpAlloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9A5E04: Tcl_Alloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B96AFAE: ns_malloc (memory.c:67)
==17911== by 0x1B96B5BD: Ns_CsInit (cslock.c:86)
==17911== by 0x1B96AEDB: NsInitMaster (master.c:63)
==17911== by 0x1B96BDED: NsInitThreads (thread.c:106)
==17911==
==17911==
==17911== 26347512 bytes in 1618 blocks are still reachable in loss record
32 of 32
==17911== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==17911== by 0x1BA00C50: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1BA00286: TclpAlloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9A5E04: Tcl_Alloc (in /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9D97A7: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9DC3AF: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9DB823: (within /usr/lib/libtcl8.4.so.0)
==17911== by 0x1B9E43A2: Tcl_FSEvalFile (in /usr/lib/libtcl8.4.so.0)
==17911==
==17911== LEAK SUMMARY:
==17911== definitely lost: 0 bytes in 0 blocks.
==17911== possibly lost: 1258171 bytes in 79 blocks.
==17911== still reachable: 28020876 bytes in 6742 blocks.
==17911== suppressed: 800 bytes in 4 blocks.
Woah! What's that 26MB of memory inside of Tcl_FSEvalFile? I'm
re-running Valgrind with --num-callers=32 to get more detail:
==24398== 26217240 bytes in 1610 blocks are still reachable in loss record
32 of 32
==24398== at 0x1B906EDD: malloc (vg_replace_malloc.c:131)
==24398== by 0x1BA00C50: (within /usr/lib/libtcl8.4.so.0)
==24398== by 0x1BA00286: TclpAlloc (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A5E04: Tcl_Alloc (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9D97A7: (within /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9DC3AF: (within /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9DB823: (within /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9E43A2: Tcl_FSEvalFile (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9AF2EE: Tcl_SourceObjCmd (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A1613: TclEvalObjvInternal (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A1993: Tcl_EvalObjv (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A282C: Tcl_EvalObjEx (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9FA079: Tcl_UplevelObjCmd (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A1613: TclEvalObjvInternal (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9C85DD: (within /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9C7BBA: TclCompEvalObj (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9FA756: TclObjInterpProc (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A1613: TclEvalObjvInternal (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A21C3: Tcl_EvalEx (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9A264A: Tcl_Eval (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1BA12E57: Tcl_Init (in /usr/lib/libtcl8.4.so.0)
==24398== by 0x1B9437E3: InitInterp (tclinit.c:1134)
==24398== by 0x1B9429AA: Ns_TclInit (tclinit.c:264)
==24398== by 0x1B9429F4: Ns_TclCreateInterp (tclinit.c:313)
==24398== by 0x1B923B06: NsConfigEval (config.c:436)
==24398== by 0x1B932892: Ns_Main (nsmain.c:432)
==24398== by 0x80486BB: main (main.c:64)
==24398==
==24398== LEAK SUMMARY:
==24398== definitely lost: 0 bytes in 0 blocks.
==24398== possibly lost: 1290739 bytes in 81 blocks.
==24398== still reachable: 27890276 bytes in 6733 blocks.
==24398== suppressed: 800 bytes in 4 blocks.
Oh, wow. Something at server start-up allocates 26MB of memory and
doesn't let it go? What's that all about. Still, doesn't explain the
32K/request leakage we're seeing, though.
The good news is at least Valgrind thinks that there are no definitely
lost blocks. However, it's also doesn't show us where/how that 150MB of
memory is being used because it allows AOLserver to gracefully shut down
before it does its memory leak check. I really need to figure out how
to get Valgrind to do a leak check while the application is still
running and has all the memory allocated, etc. That'd be really useful.
-- Dossy
--
Dossy Shiobara mail: [EMAIL PROTECTED]
Panoptic Computer Network web: http://www.panoptic.com/
"He realized the fastest way to change is to laugh at your own
folly -- then you can let go and quickly move on." (p. 70)
--
AOLserver - http://www.aolserver.com/
To Remove yourself from this list, simply send an email to <[EMAIL PROTECTED]>
with the
body of "SIGNOFF AOLSERVER" in the email message. You can leave the Subject:
field of your email blank.