Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 18 Mar 2008 11:21:23 +0000 (GMT)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Aminuddin Abdullah <amin.scg@gmail.com>
Cc:        freebsd-performance@freebsd.org, jhb@FreeBSD.org
Subject:   Re: V7 High CPU Usage on swi5:+, what is this process?
Message-ID:  <20080318111805.W17188@fledge.watson.org>
In-Reply-To: <47de32b3.1bbc720a.7cf0.ffff8ff1@mx.google.com>
References:  <20080210120013.4C3D116A421@hub.freebsd.org> <47de32b3.1bbc720a.7cf0.ffff8ff1@mx.google.com>

next in thread | previous in thread | raw e-mail | index | archive | help

On Mon, 17 Mar 2008, Aminuddin Abdullah wrote:

> I have just upgraded 5 of my machines to V7 from 6.3 and then realized that 
> all the machines has a high CPU usage. Almost all of them using 80%-90% CPU 
> with more than 8000 connections. Using previous 6.3, it only uses 40-50% CPU 
> with the same kind of connections.
>
> Using top -S, I can see that swi5: +, PID 17 process is using 30% of CPU 
> time. What is this process?
>
> All the machines are Intel C2D 6300 except one which is a AMD 4000+.
>
> Is this normal for V7? How do I downgrade to 6.3 if this V7 killing the CPU?

'+' is used in a swi name to indicate that the names of the interrupts to put 
in the thread name are too long, and the code looks like it was written under 
the assumption that at least one name would fit.  It sounds like in this case, 
none fit.  We should fix this code, but in the mean time, what you might 
consider doing is hacking intr_event_update() in kern_intr.c to print out 
overflowing names to the console using printf(9) so you can at least see what 
they are.  This is the somewhat suspect bit of code:

212         /*
213          * If the handler names were too long, add +'s to indicate missing
214          * names. If we run out of room and still have +'s to add, change
215          * the last character from a + to a *.
216          */
217         last = &ie->ie_fullname[sizeof(ie->ie_fullname) - 2];
218         while (missed-- > 0) {
219                 if (strlen(ie->ie_fullname) + 1 == 
sizeof(ie->ie_fullname)) {
220                         if (*last == '+') {
221                                 *last = '*';
222                                 break;
223                         } else
224                                 *last = '+';
225                 } else if (space) {
226                         strcat(ie->ie_fullname, " +");
227                         space = 0;
228                 } else
229                         strcat(ie->ie_fullname, "+");
230         }

I've CC'd John, who might have views on what we should do about this.  It 
would be nice if we had a way to export information on all the interrupt event 
sources, including soft ones, and their mappings to ithreads, including swis, 
using sysctl.  Or maybe we do already and he'll point us at it. :-)

Robert N M Watson
Computer Laboratory
University of Cambridge



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080318111805.W17188>