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>