From owner-freebsd-performance@FreeBSD.ORG Tue Feb 12 15:13:56 2008 Return-Path: Delivered-To: freebsd-performance@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6D94E16A420 for ; Tue, 12 Feb 2008 15:13:56 +0000 (UTC) (envelope-from bra@fsn.hu) Received: from people.fsn.hu (people.fsn.hu [195.228.252.137]) by mx1.freebsd.org (Postfix) with ESMTP id 0D6EA13C469 for ; Tue, 12 Feb 2008 15:13:55 +0000 (UTC) (envelope-from bra@fsn.hu) Received: from japan.t-online.private (people [192.168.2.4]) by people.fsn.hu (Postfix) with ESMTP id B34EF70B89; Tue, 12 Feb 2008 16:13:47 +0100 (CET) Message-ID: <47B1B7AB.9030609@fsn.hu> Date: Tue, 12 Feb 2008 16:13:47 +0100 From: Attila Nagy User-Agent: Thunderbird 2.0.0.9 (X11/20071204) MIME-Version: 1.0 To: Mark Andrews References: <200802040031.m140V3mt039006@drugs.dv.isc.org> In-Reply-To: <200802040031.m140V3mt039006@drugs.dv.isc.org> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Cc: =?UTF-8?B?SklOTUVJIFRhdHV5YSAvIOelnuaYjumBlOWTiQ==?= , freebsd-performance@freebsd.org, bind-users@isc.org Subject: Re: max-cache-size doesn't work with 9.5.0b1 X-BeenThere: freebsd-performance@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Performance/tuning List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Feb 2008 15:13:56 -0000 On 02/04/08 01:31, Mark Andrews wrote: >> >> Please try this patch. >> >> Mark >> > > Revised. > > Index: lib/isc/mem.c > =================================================================== > RCS file: /proj/cvs/prod/bind9/lib/isc/mem.c,v > retrieving revision 1.140 > diff -u -r1.140 mem.c > --- lib/isc/mem.c 18 Jan 2008 23:46:58 -0000 1.140 > +++ lib/isc/mem.c 4 Feb 2008 00:29:44 -0000 > @@ -1086,7 +1086,6 @@ > ADD_TRACE(ctx, ptr, size, file, line); > if (ctx->hi_water != 0U && !ctx->hi_called && > ctx->inuse > ctx->hi_water) { > - ctx->hi_called = ISC_TRUE; > call_water = ISC_TRUE; > } > if (ctx->inuse > ctx->maxinuse) { > @@ -1144,8 +1143,6 @@ > */ > if (ctx->hi_called && > (ctx->inuse < ctx->lo_water || ctx->lo_water == 0U)) { > - ctx->hi_called = ISC_FALSE; > - > if (ctx->water != NULL) > call_water = ISC_TRUE; > } > @@ -1155,6 +1152,18 @@ > (ctx->water)(ctx->water_arg, ISC_MEM_LOWATER); > } > > +void > +isc_mem_water(isc_mem_t *ctx, int flag) { > + REQUIRE(VALID_CONTEXT(ctx)); > + > + MCTXLOCK(ctx, &ctx->lock); > + if (flag == ISC_MEM_LOWATER) > + ctx->hi_called = ISC_FALSE; > + else if (flag == ISC_MEM_HIWATER) > + ctx->hi_called = ISC_TRUE; > + MCTXUNLOCK(ctx, &ctx->lock); > +} > + > #if ISC_MEM_TRACKLINES > static void > print_active(isc_mem_t *mctx, FILE *out) { > Index: lib/dns/acache.c > =================================================================== > RCS file: /proj/cvs/prod/bind9/lib/dns/acache.c,v > retrieving revision 1.20 > diff -u -r1.20 acache.c > --- lib/dns/acache.c 19 Jun 2007 23:47:16 -0000 1.20 > +++ lib/dns/acache.c 4 Feb 2008 00:29:46 -0000 > @@ -965,10 +965,14 @@ > > LOCK(&acache->cleaner.lock); > > - acache->cleaner.overmem = overmem; > + if (acache->cleaner.overmem != overmem) { > + acache->cleaner.overmem = overmem; > > - if (acache->cleaner.overmem_event != NULL) > - isc_task_send(acache->task, &acache->cleaner.overmem_event); > + if (acache->cleaner.overmem_event != NULL) > + isc_task_send(acache->task, > + &acache->cleaner.overmem_event); > + isc_mem_water(acache->mctx, mark); > + } > > UNLOCK(&acache->cleaner.lock); > } > Index: lib/dns/adb.c > =================================================================== > RCS file: /proj/cvs/prod/bind9/lib/dns/adb.c,v > retrieving revision 1.233 > diff -u -r1.233 adb.c > --- lib/dns/adb.c 19 Oct 2007 17:15:53 -0000 1.233 > +++ lib/dns/adb.c 4 Feb 2008 00:29:50 -0000 > @@ -128,6 +128,7 @@ > > isc_mutex_t lock; > isc_mutex_t reflock; /*%< Covers irefcnt, erefcnt */ > + isc_mutex_t overmemlock; /*%< Covers overmem */ > isc_mem_t *mctx; > dns_view_t *view; > isc_timermgr_t *timermgr; > @@ -2138,6 +2139,7 @@ > DESTROYLOCK(&adb->reflock); > DESTROYLOCK(&adb->lock); > DESTROYLOCK(&adb->mplock); > + DESTROYLOCK(&adb->overmemlock); > > isc_mem_putanddetach(&adb->mctx, adb, sizeof(dns_adb_t)); > } > @@ -2225,6 +2227,10 @@ > if (result != ISC_R_SUCCESS) > goto fail0d; > > + result = isc_mutex_init(&adb->overmemlock); > + if (result != ISC_R_SUCCESS) > + goto fail0e; > + > /* > * Initialize the bucket locks for names and elements. > * May as well initialize the list heads, too. > @@ -2343,6 +2349,8 @@ > if (adb->afmp != NULL) > isc_mempool_destroy(&adb->afmp); > > + DESTROYLOCK(&adb->overmemlock); > + fail0e: > DESTROYLOCK(&adb->reflock); > fail0d: > DESTROYLOCK(&adb->mplock); > @@ -3782,16 +3790,21 @@ > DP(ISC_LOG_DEBUG(1), > "adb reached %s water mark", overmem ? "high" : "low"); > > - adb->overmem = overmem; > + LOCK(&adb->overmemlock); > + if (adb->overmem != overmem) { > + adb->overmem = overmem; > #if 0 /* we don't need this timer for the new cleaning policy. */ > - if (overmem) { > - isc_interval_t interval; > + if (overmem) { > + isc_interval_t interval; > > - isc_interval_set(&interval, 0, 1); > - (void)isc_timer_reset(adb->timer, isc_timertype_once, NULL, > - &interval, ISC_TRUE); > - } > -#endif > + isc_interval_set(&interval, 0, 1); > + (void)isc_timer_reset(adb->timer, isc_timertype_once, > + NULL, &interval, ISC_TRUE); > + } > +#endif > + isc_mem_water(adb->mctx, mark); > + } > + UNLOCK(&adb->overmemlock); > } > > void > Index: lib/dns/cache.c > =================================================================== > RCS file: /proj/cvs/prod/bind9/lib/dns/cache.c,v > retrieving revision 1.76 > diff -u -r1.76 cache.c > --- lib/dns/cache.c 19 Oct 2007 17:15:53 -0000 1.76 > +++ lib/dns/cache.c 4 Feb 2008 00:29:51 -0000 > @@ -708,8 +708,11 @@ > > LOCK(&cache->cleaner.lock); > > - dns_db_overmem(cache->db, overmem); > - cache->cleaner.overmem = overmem; > + if (overmem != cache->cleaner.overmem) { > + dns_db_overmem(cache->db, overmem); > + cache->cleaner.overmem = overmem; > + isc_mem_water(cache->mctx, mark); > + } > > UNLOCK(&cache->cleaner.lock); > } > Sorry about the long delay... With this patch, the memory usage still grows well beyond the set limit (32M in this case, 380M resident usage after about 10 minutes of running). Applied to b2. -- Attila Nagy e-mail: Attila.Nagy@fsn.hu Free Software Network (FSN.HU) phone: +3630 306 6758 http://www.fsn.hu/