On Thu, Jun 16, 2011 at 1:14 PM, Andi Kleen <ak@xxxxxxxxxxxxxxx> wrote: > > I haven't analyzed it in detail, but I suspect it's some cache line bounce, > which > can slow things down quite a lot. Also the total number of invocations > is quite high (hundreds of messages per core * 32 cores) The fact is, glibc is just total crap. I tried to send uli a patch to just add caching. No go. I sent *another* patch to at least make glibc use a sane interface (and the cache if it needs to fall back on /proc/stat for some legacy reason). We'll see what happens. Paul Eggbert suggested "caching for one second" - by just calling "gettimtofday()" to see how old the cache is. That would work too. The point I'm making is that it really is a glibc problem. Glibc is doing stupid expensive things, and not trying to correct for the fact that it's expensive. > I did, but I gave up fully following that code path because it's so > convoluted :-/ I do agree that glibc sources are incomprehensible, with multiple layers of abstraction (sysdeps, "posix", helper functions etc etc). In this case it was really trivial to find the culprit with a simple git grep /proc/stat though. The code is crap. It's insane. It's using /sys/devices/system/cpu for _SC_NPROCESSORS_CONF, which is at least a reasonable interface to use. But it does it in odd ways, and actually counts the CPU's by doing a readdir call. And it doesn't cache the result, even though that particular result had better be 100% stable - it has nothing to do with "online" vs "offline" etc. But then for _SC_NPROCESSORS_ONLN, it doesn't actually use /sys/devices/system/cpu at all, but the /proc/stat interface. Which is slow, mostly because it has all the crazy interrupt stuff in it, but also because it has lots of legacy stuff. I wrote a _much_ cleaner routine (loosely based on what we do in tools/prof) to just parse /sys/devices/system/cpu/online. I didn't even time it, but I can almost guarantee that it's an order of magnitude faster than /proc/stat. And if that doesn't work, you can fall back on a cached version of the /proc/stat parsing, since if those files don't exist, you can forget about CPU hotplug. > So you mean caching it at startup time? Otherwise the parent would > need to do sysconf() at least , which it doesn't do (the exim source doesn't > really know anything about libdb internals) Even if you do it in the children, it will help. At least it would be run just _once_ per fork. But actually looking at glibc just shows that they are simply doing stupid things. And I absolutely _refuse_ to add new interfaces to the kernel only because glibc is being a moron. Linus -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href