From owner-freebsd-questions@FreeBSD.ORG Fri Aug 19 19:08:01 2005 Return-Path: X-Original-To: freebsd-questions@freebsd.org Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id F3D6816A422 for ; Fri, 19 Aug 2005 19:08:00 +0000 (GMT) (envelope-from kannanv@juniper.net) Received: from borg.juniper.net (borg.juniper.net [207.17.137.119]) by mx1.FreeBSD.org (Postfix) with ESMTP id A0A7043D48 for ; Fri, 19 Aug 2005 19:08:00 +0000 (GMT) (envelope-from kannanv@juniper.net) Received: from unknown (HELO gamma.jnpr.net) (172.24.245.25) by borg.juniper.net with ESMTP; 19 Aug 2005 12:08:01 -0700 X-BrightmailFiltered: true X-Brightmail-Tracker: AAAAAA== X-IronPort-AV: i="3.96,126,1122879600"; d="scan'208"; a="487314055:sNHT20407240" Received: from gluon.jnpr.net ([172.24.15.23]) by gamma.jnpr.net with Microsoft SMTPSVC(6.0.3790.211); Fri, 19 Aug 2005 12:08:00 -0700 Received: from 172.17.21.203 ([172.17.21.203]) by gluon.jnpr.net ([172.24.15.23]) via Exchange Front-End Server outlook.juniper.net ([172.24.18.177]) with Microsoft Exchange Server HTTP-DAV ; Fri, 19 Aug 2005 19:07:58 +0000 User-Agent: Microsoft-Entourage/11.1.0.040913 Date: Fri, 19 Aug 2005 12:07:57 -0700 From: Kannan Varadhan To: Message-ID: Mime-version: 1.0 Content-type: text/plain; charset="US-ASCII" Content-transfer-encoding: 7bit X-OriginalArrivalTime: 19 Aug 2005 19:08:00.0198 (UTC) FILETIME=[50F11E60:01C5A4F1] Subject: Calculating the load average in the freebsd kernel X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Aug 2005 19:08:01 -0000 Hello, I am staring at the code in kern/kern_synch.c that calculates the load average of the system, and I cannot fully understand how the freebsd version works. Specifically, it looks as: /* * Constants for averages over 1, 5, and 15 minutes * when sampling at 5 second intervals. */ static fixpt_t cexp[3] = { 0.9200444146293232 * FSCALE, /* exp(-1/12) */ 0.9834714538216174 * FSCALE, /* exp(-1/60) */ 0.9944598480048967 * FSCALE, /* exp(-1/180) */ }; ... /* * Compute a tenex style load average of a quantity on * 1, 5 and 15 minute intervals. * XXXKSE Needs complete rewrite when correct info is available. * Completely Bogus.. only works with 1:1 (but compiles ok now :-) */ static void loadav(void *arg) { int i, nrun; struct loadavg *avg; nrun = sched_load(); avg = &averunnable; for (i = 0; i < 3; i++) avg->ldavg[i] = (cexp[i] * avg->ldavg[i] + nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT; ... And elsewhere, FSCALE is defined as 1<ldavg[i] = (cexp[i] * avg->ldavg[i] + nrun * FSCALE * (FSCALE - cexp[i])) >> FSHIFT; ^^^^^^ Why do we have that extra FSCALE multiplier in the second term? If I do some logical simplifications, this seems to get me: (\alpha * FSCALE * ldavg[I] + nrum * FSCALE * FSCALE (1 - \alpha)) >> FSHIFT I.e. \alpha * ldavg[I] + nrun * FSCALE * (1 - \alpha) What am I missing in this arithmetic? Thanks, Kannan